查看: 5309|回复: 5

[LPC双核挑战赛] 【LPC54114-lite开发板学习】- 6-双核通讯之共享内存

[复制链接]
  • TA的每日心情
    擦汗
    昨天 10:45
  • 签到天数: 2395 天

    连续签到: 3 天

    [LV.Master]伴坛终老

    56

    主题

    5289

    帖子

    73

    金牌会员

    Rank: 6Rank: 6

    积分
    25953
    最后登录
    2025-8-10
    发表于 2018-5-13 21:41:21 | 显示全部楼层 |阅读模式
    在上一篇中学习了原厂的多核管理组件,在这里在简单说一下。
    0001.png
    在SDK中有多核管理组件的相关文档,在项目中也集成了文档和源码。
    组件实现了多核管理与通讯的功能,非常方便,但是组件也限制了我们不能自由使用双核通讯,比如想专递一个内存地址,组件就不太容易实现了。接下来我们把组件去掉,自己进行多个的管理和信息的传递。
    0002.png
    删除组件相关文件和代码。
    0003.png
    两个项目中分别添加邮箱的初始化代码和中断函数。此时在调试发现M4核心接收的只有M0发送的AD值了。
    0004.png
    修改M0内核主文件,增加结构体如下:
    1. struct msg_t{
    2. float  fTemp;  //温度值,M4内核接收
    3. uint16_t uADVal; //ADC值,M4内核接收
    4. uint8_t uLedSta; //LED灯状态,M4内核发送
    5. uint8_t uMsgRecv;//M4是否收到指针地址信息。
    6. }my_msg_t={0.0,0,0,0};
    复制代码

    主循环中增加如下代码:

    1. if(my_msg_t.uMsgRecv<1)  //如果M4核心没有收到消息,持续发送结构体地址信息
    2. {
    3.     MAILBOX_SetValue(MAILBOX, kMAILBOX_CM4, (uint32_t)&my_msg_t);
    4. }
    5. wADCValue = adc_read(ADC_CHANNEL_NUM);//读取AD值
    6. ret = pct2075_i2c_read((float *)&fPCTValue);//读取温度值
    7. while (MAILBOX_GetMutex(MAILBOX) == 0)//获取互斥量
    8. {
    9.     ;
    10. }
    11. my_msg_t.uADVal=wADCValue;//结构体赋值
    12. my_msg_t.fTemp=fPCTValue;
    13. if(my_msg_t.uLedSta>0)//如果M4要求点亮LED
    14. {
    15.     led_on(2);
    16. }else{
    17.     led_off(2);
    18. }
    19. MAILBOX_SetMutex(MAILBOX);//释放互斥量
    复制代码

    0005.png
    修改M4内核主文件:
    1. struct msg_t{  //定义结构体
    2. float  fTemp;
    3. uint16_t uADVal;
    4. uint8_t uLedSta;
    5. uint8_t uMsgRecv;
    6. };
    7. struct msg_t * my_msg_t=NULL;        //定义结构体指针。
    复制代码

    中断服务函数中:
    1. void MAILBOX_IRQHandler(void)
    2. {
    3. #if defined(__CM4_CMSIS_VERSION)
    4. mailbox_cpu_id_t cpu_id = kMAILBOX_CM4;
    5. #else
    6. mailbox_cpu_id_t cpu_id = kMAILBOX_CM0Plus;
    7. #endif
    8. uint32_t data;
    9. data = MAILBOX_GetValue(MAILBOX, cpu_id);
    10. if(data>=0x20000000)  //内存地址肯定大于0x20000000
    11. {
    12. my_msg_t=(struct msg_t *)(data);//把地址值赋值给结构体指针
    13. my_msg_t->uMsgRecv=1;
    14. }
    15. MAILBOX_ClearValueBits(MAILBOX, cpu_id, data);
    16. /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
    17. exception return operation might vector to incorrect interrupt */
    18. #if defined __CORTEX_M && (__CORTEX_M == 4U)
    19. __DSB();
    20. #endif
    21. }
    复制代码

    主循环中增加代码:
    1. while (MAILBOX_GetMutex(MAILBOX) == 0)//获取互斥量
    2. {
    3.     ;
    4. }
    5. if(my_msg_t->uADVal>0x7FF)//如果AD值大于一半
    6. {
    7.     my_msg_t->uLedSta=1; //点亮LED
    8. }else{
    9.     my_msg_t->uLedSta=0; //熄灭LED
    10. }
    11. MAILBOX_SetMutex(MAILBOX);//释放互斥量
    12. //串口打印结构体中的数据
    13. 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));
    14. delay();//延时,这里的延时可能导致按键响应不及时,所以如果要改变内核状态,按键1秒左右不放开即可。
    复制代码
    通过调试,调节AD输入上的滑动电阻就可以控制LED的亮灭了,这样,M0内核就可以发送一个内存地址指针给M4内核,两个内核通过硬件互斥安全的访问同一内存地址,进行数据的共享了。这样的方式对于需要共享大量的数据时非常方便。

    至此,LPC54114的双核共享了解的差不多了,更详细的内容随着项目的进展会逐渐掌握。总之,在项目周期紧张的情况下,学的够用了就可以了,还是要花费大量的精力来放到应用部分呢。

    评分

    参与人数 1 +3 收起 理由
    doatello + 3

    查看全部评分

    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    昨天 10:45
  • 签到天数: 2395 天

    连续签到: 3 天

    [LV.Master]伴坛终老

    56

    主题

    5289

    帖子

    73

    金牌会员

    Rank: 6Rank: 6

    积分
    25953
    最后登录
    2025-8-10
     楼主| 发表于 2018-5-13 21:43:27 | 显示全部楼层
    总是忘记上传代码 SmartLock_Mutex.zip (4.7 MB, 下载次数: 11)
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-2-15 00:12
  • 签到天数: 969 天

    连续签到: 1 天

    [LV.10]以坛为家III

    175

    主题

    2843

    帖子

    34

    金牌会员

    Rank: 6Rank: 6

    积分
    7124
    最后登录
    2023-4-20
    发表于 2018-5-14 09:24:15 | 显示全部楼层
    感谢分享!  
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-9-9 22:51
  • 签到天数: 415 天

    连续签到: 1 天

    [LV.9]以坛为家II

    79

    主题

    3088

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    5181
    最后登录
    2022-5-23
    发表于 2018-5-14 12:24:45 来自手机 | 显示全部楼层
    感谢分享
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-7-8 09:06
  • 签到天数: 27 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    18

    主题

    445

    帖子

    26

    金牌会员

    Rank: 6Rank: 6

    积分
    2307
    最后登录
    2025-8-6
    发表于 2018-5-18 10:37:28 | 显示全部楼层
    浏览了系列的学习贴,写得不错
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-7-2 13:42
  • 签到天数: 31 天

    连续签到: 1 天

    [LV.5]常住居民I

    12

    主题

    253

    帖子

    0

    高级会员

    Rank: 4

    积分
    576
    最后登录
    2020-4-7
    发表于 2018-5-18 11:42:36 | 显示全部楼层
    学习了学习了
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-11 04:12 , Processed in 0.093482 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表