查看: 3280|回复: 4

[原创] 【LPC54114双核任务二】循序渐进之双核通讯3---Mailbox

[复制链接]
  • TA的每日心情
    郁闷
    2022-4-4 11:28
  • 签到天数: 351 天

    [LV.8]以坛为家I

    141

    主题

    8054

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5740
    最后登录
    2022-4-4
    发表于 2017-6-28 12:03:22 | 显示全部楼层 |阅读模式
    本帖最后由 wambob 于 2017-6-28 12:06 编辑

            使用Inter-CPU Mailbox模块进行核间通讯。mailbox提供了一种在双核之间通讯的简单方法。
            SDK里提供了Mailbox模块外设驱动,还有简单的例子代码。包括mailbox的初始化、设置值和获取值。
           多核例程 hello world 已经跑起来了,在其基础上添加  
    Mailbox 相关代码 进一步学习。
           添加开关PB4,当按下开关时,M4核发送数据到mailbox。M0核接收到数据后打印到串口,然后改变值,清除
    mailbox后发回M4核,M4核收到后打印到串口,并清除mailbox。
           mailbox代码要在CM4和CM4中同时添加,稍有不同的发送方向不同。
           CM4工程中添加的部分代码有:
    1. #include "fsl_mailbox.h"
    复制代码
    读取M0核送到CM4邮箱的信息。
    1. void MAILBOX_IRQHandler()
    2. {
    3. /* Read message from CM<font size="3">4</font> mailbox register, sent by primary core */
    4. uint32_t message;
    5. message = MAILBOX_GetValue(MAILBOX, kMAILBOX_CM4);
    6. PRINTF("CM4 core received:%d\r\n",message);
    7. /* Clear mailbox CM4 mailbox register */
    8. MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM4, 0xffffffff);
    9. }
    复制代码
    在主函数中初始化mailbox、使能mailbox中断
    1. MAILBOX_Init(MAILBOX);
    2.     NVIC_EnableIRQ(MAILBOX_IRQn);
    复制代码


    在while循环里发送到M0核的代码
    1. if (!GPIO_ReadPinInput(BOARD_SW3_GPIO, BOARD_SW3_GPIO_PORT, BOARD_SW3_GPIO_PIN))
    2.         {
    3.             delay();
    4.             if (GPIO_ReadPinInput(BOARD_SW3_GPIO, BOARD_SW3_GPIO_PORT, BOARD_SW3_GPIO_PIN)!=0)
    5.             {
    6.                 uint32_t message = 1;
    7. /* Write message to CM0+ mailbox register - it causes interrupt on CM0+ core */
    8. MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, message);
    9.             }
    10.         }
    复制代码
           CM0工程添加代码和CM4差不多。除了mailbox相关代码外,还需要添加串口打印相关代码。
    串口打印信息
    无标题.jpg
    有个问题是当启动m0核时,不清楚为何会触发邮箱中断,导致一次通讯。只要启动M0核,就会导致一次通讯。
    无标题.jpg


            
       
       


    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情

    2021-1-28 20:09
  • 签到天数: 317 天

    [LV.8]以坛为家I

    61

    主题

    1582

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    8100
    最后登录
    2022-5-12
    发表于 2017-6-28 12:56:57 | 显示全部楼层
    (M4, M0+) void MAILBOX_SetValue(MAILBOX_Type *base, mailbox_cpu_id_t cpu_id, uint32_t mboxData);
    Set (non-zero) value “mboxData” to CPU “cpu_id”, as well as trigger its MAILBOX IRQ

    引起中断的条件就是Set (non-zero) value “mboxData” to CPU “cpu_id”

    感觉像是初始化时候发出来的
    好好
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2022-4-4 11:28
  • 签到天数: 351 天

    [LV.8]以坛为家I

    141

    主题

    8054

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5740
    最后登录
    2022-4-4
     楼主| 发表于 2017-6-28 13:05:18 | 显示全部楼层
    小马哥-1650185 发表于 2017-6-28 12:56
    (M4, M0+) void MAILBOX_SetValue(MAILBOX_Type *base, mailbox_cpu_id_t cpu_id, uint32_t mboxData);
    Set ...

    初始化里并没有设置值啊
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2018-2-7 18:18
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    13

    主题

    126

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    1628
    最后登录
    2021-7-13
    发表于 2017-6-28 20:19:10 | 显示全部楼层
    感谢分享!
    邮箱每次只能发一个数据呀?要是发多个数据如何处理?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2022-4-4 11:28
  • 签到天数: 351 天

    [LV.8]以坛为家I

    141

    主题

    8054

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5740
    最后登录
    2022-4-4
     楼主| 发表于 2017-6-28 20:36:16 | 显示全部楼层
    pythonworld 发表于 2017-6-28 20:19
    感谢分享!
    邮箱每次只能发一个数据呀?要是发多个数据如何处理?

    一个一个发吧
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-5-10 09:40 , Processed in 0.120257 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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