在线时间2089 小时
UID267320
注册时间2011-3-7
NXP金币2538
TA的每日心情 | 擦汗 昨天 10:45 |
---|
签到天数: 2395 天 连续签到: 3 天 [LV.Master]伴坛终老
金牌会员
 
- 积分
- 25953
- 最后登录
- 2025-8-10
|
在上一篇中学习了原厂的多核管理组件,在这里在简单说一下。
在SDK中有多核管理组件的相关文档,在项目中也集成了文档和源码。
组件实现了多核管理与通讯的功能,非常方便,但是组件也限制了我们不能自由使用双核通讯,比如想专递一个内存地址,组件就不太容易实现了。接下来我们把组件去掉,自己进行多个的管理和信息的传递。
删除组件相关文件和代码。
两个项目中分别添加邮箱的初始化代码和中断函数。此时在调试发现M4核心接收的只有M0发送的AD值了。
修改M0内核主文件,增加结构体如下:
- struct msg_t{
- float fTemp; //温度值,M4内核接收
- uint16_t uADVal; //ADC值,M4内核接收
- uint8_t uLedSta; //LED灯状态,M4内核发送
- uint8_t uMsgRecv;//M4是否收到指针地址信息。
- }my_msg_t={0.0,0,0,0};
复制代码
主循环中增加如下代码:
- if(my_msg_t.uMsgRecv<1) //如果M4核心没有收到消息,持续发送结构体地址信息
- {
- MAILBOX_SetValue(MAILBOX, kMAILBOX_CM4, (uint32_t)&my_msg_t);
- }
- wADCValue = adc_read(ADC_CHANNEL_NUM);//读取AD值
- ret = pct2075_i2c_read((float *)&fPCTValue);//读取温度值
- while (MAILBOX_GetMutex(MAILBOX) == 0)//获取互斥量
- {
- ;
- }
- my_msg_t.uADVal=wADCValue;//结构体赋值
- my_msg_t.fTemp=fPCTValue;
- if(my_msg_t.uLedSta>0)//如果M4要求点亮LED
- {
- led_on(2);
- }else{
- led_off(2);
- }
- MAILBOX_SetMutex(MAILBOX);//释放互斥量
复制代码
修改M4内核主文件:
- struct msg_t{ //定义结构体
- float fTemp;
- uint16_t uADVal;
- uint8_t uLedSta;
- uint8_t uMsgRecv;
- };
- struct msg_t * my_msg_t=NULL; //定义结构体指针。
复制代码
中断服务函数中:
- void MAILBOX_IRQHandler(void)
- {
- #if defined(__CM4_CMSIS_VERSION)
- mailbox_cpu_id_t cpu_id = kMAILBOX_CM4;
- #else
- mailbox_cpu_id_t cpu_id = kMAILBOX_CM0Plus;
- #endif
- uint32_t data;
- data = MAILBOX_GetValue(MAILBOX, cpu_id);
- if(data>=0x20000000) //内存地址肯定大于0x20000000
- {
- my_msg_t=(struct msg_t *)(data);//把地址值赋值给结构体指针
- my_msg_t->uMsgRecv=1;
- }
- MAILBOX_ClearValueBits(MAILBOX, cpu_id, data);
- /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
- exception return operation might vector to incorrect interrupt */
- #if defined __CORTEX_M && (__CORTEX_M == 4U)
- __DSB();
- #endif
- }
复制代码
主循环中增加代码:
- while (MAILBOX_GetMutex(MAILBOX) == 0)//获取互斥量
- {
- ;
- }
- if(my_msg_t->uADVal>0x7FF)//如果AD值大于一半
- {
- my_msg_t->uLedSta=1; //点亮LED
- }else{
- my_msg_t->uLedSta=0; //熄灭LED
- }
- MAILBOX_SetMutex(MAILBOX);//释放互斥量
- //串口打印结构体中的数据
- PRINTF("MsgAddr[0x%X];Temp[%d];AD[0x%X];LED[%d];MR[%d].\n",my_msg_t,(int)(my_msg_t->fTemp),(my_msg_t->uADVal),(my_msg_t->uLedSta),(my_msg_t->uMsgRecv));
- delay();//延时,这里的延时可能导致按键响应不及时,所以如果要改变内核状态,按键1秒左右不放开即可。
复制代码 通过调试,调节AD输入上的滑动电阻就可以控制LED的亮灭了,这样,M0内核就可以发送一个内存地址指针给M4内核,两个内核通过硬件互斥安全的访问同一内存地址,进行数据的共享了。这样的方式对于需要共享大量的数据时非常方便。
至此,LPC54114的双核共享了解的差不多了,更详细的内容随着项目的进展会逐渐掌握。总之,在项目周期紧张的情况下,学的够用了就可以了,还是要花费大量的精力来放到应用部分呢。
|
评分
-
查看全部评分
|