查看: 5350|回复: 4

[原创] 【LPC54114双核任务二】双核之从零开始--#mailbox通信2之mutex#

[复制链接]
  • TA的每日心情

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

    连续签到: 1 天

    [LV.8]以坛为家I

    61

    主题

    1582

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    9365
    最后登录
    2022-5-12
    发表于 2017-6-28 22:10:46 | 显示全部楼层 |阅读模式
    本帖最后由 小马哥-1650185 于 2017-7-2 11:32 编辑

    这个帖子主要讲解下 双核mailbox通信,采用互斥锁机制共享变量,同一时刻只能有一个核心访问这个变量。

          实现功能:M4核定义一个变量(_XiaoMaGe),M0核定义一个指针(*_XiaoMaGe,上电后  M4通过mailbox  给m0发送 这个变量的地址(&_XiaoMaGe),m0核收到数据(&_XiaoMaGe后进入接受中断,并把这个数据(&_XiaoMaGe赋给指向这个变量的指针(_XiaoMaGe),实现地址绑定。
    然后在各自的主循环中 通过 互斥锁 对这个地址存放的数据++操作;


    先看下串口返回结果
    111111111.png
    M4:
    需要定义一个可以被双核访问的变量,改变这个变量前先设置互斥锁,访问结束后释放互斥锁。
    volatile uint32_t _XiaoMaGe = 0;

    初始化增加邮箱的初始化
    1.     /* Init Mailbox */
    2.     MAILBOX_Init(MAILBOX);
    复制代码

    然后设置从flash启动m0,
    1. /* Boot source for Core 1 from flash */
    2.     SYSCON->CPBOOT = SYSCON_CPBOOT_BOOTADDR(*(uint32_t *)((uint8_t *)CORE1_BOOT_ADDRESS + 0x4));
    3.     SYSCON->CPSTACK = SYSCON_CPSTACK_STACKADDR(*(uint32_t *)CORE1_BOOT_ADDRESS);

    4.     int32_t temp = SYSCON->CPCTRL;
    5.     temp |= 0xc0c48000;
    6.     SYSCON->CPCTRL = (temp | SYSCON_CPCTRL_CM0RSTEN_MASK);
    7.     SYSCON->CPCTRL = (temp);
    复制代码
    然后给 m0发送一个邮箱消息,把这个变量地址传送给m0
    1. /* Send address of shared variable to CM0+ by Mailbox*/
    2.     MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, (uint32_t)&_XiaoMaGe);
    复制代码

    主循环中  访问这个变量先加锁,访问结束后解锁,防止双核同一时刻竞争同一变量
    1.     while (1)
    2.     {
    3.         /* Get Mailbox mutex */
    4.         while (MAILBOX_GetMutex(MAILBOX) == 0)
    5.             ;

    6.         /* The core0 has mutex, can change shared variable _XiaoMaGe */
    7.         _XiaoMaGe++;

    8.         PRINTF("M4 : mailbox mutex by СÂí¸ç,the data is: %d\n", _XiaoMaGe);

    9.         /* Set mutex to allow access other core to shared variable */
    10.         MAILBOX_SetMutex(MAILBOX);
    11.     }
    复制代码

    M0核:
    需要定义一个指针,指向双核共享的变量,改变这个变量前先设置互斥锁,访问结束后释放互斥锁。
    volatile uint32_t *_XiaoMaGe = NULL;
    初始化邮箱,并开中断
    1.     /* Initialize Mailbox */
    2.     MAILBOX_Init(MAILBOX);

    3.     /* Enable mailbox interrupt */
    4.     NVIC_EnableIRQ(MAILBOX_IRQn);
    复制代码

    接受到m4的邮箱消息时,指针指向这个数据地址。


    1. void MAILBOX_IRQHandler()
    2. {
    3.     _XiaoMaGe = (uint32_t *)MAILBOX_GetValue(MAILBOX, kMAILBOX_CM0Plus);
    4.     MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM0Plus, 0xffffffff);
    5. }
    复制代码
    然后在主循环中,和M4一样处理
    1.     while (1)
    2.     {
    3.         /* Get Mailbox mutex */
    4.         while (MAILBOX_GetMutex(MAILBOX) == 0)
    5.             ;

    6.         /* The core1 has mutex, can change shared variable _XiaoMaGe */
    7.         if (_XiaoMaGe != NULL)
    8.         {
    9.             (*_XiaoMaGe)++;
    10.                                         PRINTF("M0 : mailbox mutex by СÂí¸ç,the data is :%d\n", *_XiaoMaGe);
    11.         }

    12.         /* Set mutex to allow access other core to shared variable */
    13.         MAILBOX_SetMutex(MAILBOX);
    14.     }
    复制代码




    -----------------------小马哥系列【LPC54114双核任务二】传送门--------------------
    【LPC54114双核任务二】双核之从零开始--#KEIL工程建立配置#
    【LPC54114双核任务二】双核之从零开始--#HelloWorld双核调试#

    【LPC54114双核任务二】双核之从零开始--#MDK生成BIN#

    【LPC54114双核任务二】双核之从零开始--#mailbox通信1之中断#


    【LPC54114双核任务二】双核之从零开始--#mailbox通信2之mutex#

    【LPC54114双核任务二】双核之从零开始--#mailbox通信3之按键#

    【LPC54114双核任务二】双核之从零开始--#mailbox通信4之PC_M4_M0#

    【LPC54114双核任务二】双核之从零开始--#mailbox通信5之PC_M0_M4#



    【LPC54114双核任务二】双核之从零开始--#mailbox通信6之WIFI_M4_M0#


    【LPC54114双核任务二】已完结,小马哥出品,谢谢大家支持。。。。

    -----------------------小马哥系列【LPC54114双核任务二】传送门--------------------


    好好
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-7-12 20:45
  • 签到天数: 75 天

    连续签到: 1 天

    [LV.6]常住居民II

    7

    主题

    213

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    441
    最后登录
    2018-10-25
    发表于 2017-6-29 08:40:35 | 显示全部楼层
    学习了
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情

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

    连续签到: 1 天

    [LV.8]以坛为家I

    61

    主题

    1582

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    9365
    最后登录
    2022-5-12
     楼主| 发表于 2017-6-29 14:53:52 | 显示全部楼层
    欢迎大家来找茬
    好好
    回复 支持 反对

    使用道具 举报

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

    连续签到: 1 天

    [LV.2]偶尔看看I

    13

    主题

    126

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    1628
    最后登录
    2021-7-13
    发表于 2017-6-29 19:02:05 | 显示全部楼层
    M4核定义一个指针(*_XiaoMaGe),是M0吧?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    连续签到: 1 天

    [LV.8]以坛为家I

    61

    主题

    1582

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    9365
    最后登录
    2022-5-12
     楼主| 发表于 2017-6-29 19:31:20 | 显示全部楼层
    pythonworld 发表于 2017-6-29 19:02
    M4核定义一个指针(*_XiaoMaGe),是M0吧?

    哦哦 打错了,谢谢提醒
    已改正
    好好
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-22 06:01 , Processed in 0.085370 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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