查看: 4414|回复: 1

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

[复制链接]
  • TA的每日心情
    奋斗
    2025-5-7 09:07
  • 签到天数: 353 天

    连续签到: 1 天

    [LV.8]以坛为家I

    141

    主题

    8056

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5786
    最后登录
    2025-5-7
    发表于 2017-6-30 20:39:39 | 显示全部楼层 |阅读模式
    本帖最后由 wambob 于 2017-6-30 21:15 编辑

        使用Mailbox虽然能实现双核间的通讯,但是由于使用了中断请求寄存器,所以所以只能通讯非零数据。如果发送0怎么办?
         使用邮箱互斥控制共享资源的更改。
        在Mailbox中断的工程上,增加了互斥操作和共享资源。
         由于地址的非零,可以发送共享资源的地址,使M0核中断,取出共享资源的地址,也就得到了共享资源,那个使用共享资源,可以通过读取互斥寄存器来决定,如果MCU读到1,则控制了共享资源的读写,同时对互斥寄存器清零,直到改完共享资源,设置互斥寄存器为1,另一个读1才能控制共享资源,如果期间读到0,则等待。
           无标题.jpg
    上面的流程是双mailbox,双变量。明白了单共享变量,不难理解双变量。
    CM4工程里,定义一个volatile变量
    1. volatile uint32_t g_shared = 0;
    复制代码
    初始化邮箱,并发送共享变量的地址给M0。
    1. MAILBOX_Init(MAILBOX);
    2. MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, (uint32_t)&g_shared);
    复制代码
    在while循环里,通过自己定义的按键实现当按下按键时,检测互斥,成功时改写变量。
    1. while (1)    {
    2.       
    3.         delay();
    4.         PRINTF("CM4 core mailbox received:%d\r\n",g_shared);
    5.         delay();
    6. if (!GPIO_ReadPinInput(BOARD_SW3_GPIO, BOARD_SW3_GPIO_PORT, BOARD_SW3_GPIO_PIN))
    7.         {
    8.          
    9.             delay();
    10.             if (GPIO_ReadPinInput(BOARD_SW3_GPIO, BOARD_SW3_GPIO_PORT, BOARD_SW3_GPIO_PIN)!=0)
    11.             {
    12. while (MAILBOX_GetMutex(MAILBOX) == 0){}
    13.               g_shared++;
    14.               PRINTF("Core0 has mailbox mutex, update shared variable to: %d\n", g_shared);   
    15.              MAILBOX_SetMutex(MAILBOX);
    16.             }
    17.         }
    18.         PRINTF("CM4 core mailbox received:%d\r\n",g_shared);
    19.         delay();
    20.     }
    复制代码
    CM0工程里mailbox的初始化,还需要定义volatile 空指针用来指向共享变量,开启中断使能,和中断服务函数。
    1. volatile uint32_t *g_shared = NULL;

    2. void MAILBOX_IRQHandler()
    3. {
    4. g_shared = (uint32_t *)MAILBOX_GetValue(MAILBOX, kMAILBOX_CM0Plus);
    5.     MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM0Plus, 0xffffffff);
    6. }

    7. MAILBOX_Init(MAILBOX);

    8. NVIC_EnableIRQ(MAILBOX_IRQn);
    复制代码
    在while循环里同样通过自己定义的按键实现当按下按键时,检测互斥,成功时改写变量。
    1. while (1)
    2.     {
    3.         delay();
    4.         LED_TOGGLE();   
    5.          PRINTF("CM0 core mailbox received:%d\r\n",*g_shared);
    6.          if (!GPIO_ReadPinInput(BOARD_SW1_GPIO, BOARD_SW1_GPIO_PORT, BOARD_SW1_GPIO_PIN))
    7.         {
    8.            /* Get Mailbox mutex */
    9.         while (MAILBOX_GetMutex(MAILBOX) == 0)
    10.             ;

    11.         /* The core1 has mutex, can change shared variable g_shared */
    12.         if (g_shared != NULL)
    13.         {
    14.             (*g_shared)++;
    15.             PRINTF("Core1 has mailbox mutex, update shared variable to: %d\n", *g_shared);
    16.         }

    17.         /* Set mutex to allow access other core to shared variable */
    18.         MAILBOX_SetMutex(MAILBOX);
    19.             
    20.         }
    21.         
    22.     }
    复制代码
    这样无论是按那个按键,都可以对共享变量在互斥操作下进行改写,实现了双核通讯,当然也可以在M0和M4中各建一个变量,两个工程同时开启邮箱中断,通过互斥来通讯,就像上面的流程一样。
    1.jpg 2.jpg

    添加读取串口数据
    1. while (MAILBOX_GetMutex(MAILBOX) == 0)
    2.             ;

    3.         /* The core1 has mutex, can change shared variable g_shared */
    4.         if (g_shared != NULL)
    5.         {   
    6.             uint32_t a;
    7.             PRINTF("input a\r\n");
    8.             SCANF("%d",&a);
    9.              PRINTF("a=%d\r\n",a);
    10.             (*g_shared)=a;
    11.             PRINTF("Core1 has mailbox mutex, update shared variable to: %d\n", *g_shared);
    12.         }

    13.         /* Set mutex to allow access other core to shared variable */
    14.         MAILBOX_SetMutex(MAILBOX);
    复制代码
    无标题.jpg






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

    使用道具 举报

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

    连续签到: 1 天

    [LV.2]偶尔看看I

    13

    主题

    126

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    1628
    最后登录
    2021-7-13
    发表于 2017-6-30 21:39:01 | 显示全部楼层
    谢谢分享,很详细的Mutex spin lock使用说明!
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-31 06:44 , Processed in 0.079317 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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