在线时间543 小时
UID1650185
注册时间2017-4-19
NXP金币674
TA的每日心情 | 怒 2021-1-28 20:09 |
---|
签到天数: 317 天 连续签到: 1 天 [LV.8]以坛为家I
金牌会员
 
- 积分
- 9365
- 最后登录
- 2022-5-12
|
本帖最后由 小马哥-1650185 于 2017-7-2 11:32 编辑
这个帖子主要讲解下 双核mailbox通信,采用互斥锁机制共享变量,同一时刻只能有一个核心访问这个变量。
实现功能:M4核定义一个变量(_XiaoMaGe),M0核定义一个指针(*_XiaoMaGe),上电后 M4通过mailbox 给m0发送 这个变量的地址(&_XiaoMaGe),m0核收到数据(&_XiaoMaGe)后进入接受中断,并把这个数据(&_XiaoMaGe)赋给指向这个变量的指针(_XiaoMaGe),实现地址绑定。
然后在各自的主循环中 通过 互斥锁 对这个地址存放的数据++操作;
先看下串口返回结果
M4:
需要定义一个可以被双核访问的变量,改变这个变量前先设置互斥锁,访问结束后释放互斥锁。
volatile uint32_t _XiaoMaGe = 0;
初始化增加邮箱的初始化
- /* Init Mailbox */
- MAILBOX_Init(MAILBOX);
复制代码
然后设置从flash启动m0,- /* Boot source for Core 1 from flash */
- SYSCON->CPBOOT = SYSCON_CPBOOT_BOOTADDR(*(uint32_t *)((uint8_t *)CORE1_BOOT_ADDRESS + 0x4));
- SYSCON->CPSTACK = SYSCON_CPSTACK_STACKADDR(*(uint32_t *)CORE1_BOOT_ADDRESS);
- int32_t temp = SYSCON->CPCTRL;
- temp |= 0xc0c48000;
- SYSCON->CPCTRL = (temp | SYSCON_CPCTRL_CM0RSTEN_MASK);
- SYSCON->CPCTRL = (temp);
复制代码 然后给 m0发送一个邮箱消息,把这个变量地址传送给m0
- /* Send address of shared variable to CM0+ by Mailbox*/
- MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, (uint32_t)&_XiaoMaGe);
复制代码
主循环中 访问这个变量先加锁,访问结束后解锁,防止双核同一时刻竞争同一变量
- while (1)
- {
- /* Get Mailbox mutex */
- while (MAILBOX_GetMutex(MAILBOX) == 0)
- ;
- /* The core0 has mutex, can change shared variable _XiaoMaGe */
- _XiaoMaGe++;
- PRINTF("M4 : mailbox mutex by СÂí¸ç,the data is: %d\n", _XiaoMaGe);
- /* Set mutex to allow access other core to shared variable */
- MAILBOX_SetMutex(MAILBOX);
- }
复制代码
M0核:
需要定义一个指针,指向双核共享的变量,改变这个变量前先设置互斥锁,访问结束后释放互斥锁。
volatile uint32_t *_XiaoMaGe = NULL;
初始化邮箱,并开中断
- /* Initialize Mailbox */
- MAILBOX_Init(MAILBOX);
- /* Enable mailbox interrupt */
- NVIC_EnableIRQ(MAILBOX_IRQn);
复制代码
接受到m4的邮箱消息时,指针指向这个数据地址。
- void MAILBOX_IRQHandler()
- {
- _XiaoMaGe = (uint32_t *)MAILBOX_GetValue(MAILBOX, kMAILBOX_CM0Plus);
- MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM0Plus, 0xffffffff);
- }
复制代码 然后在主循环中,和M4一样处理
- while (1)
- {
- /* Get Mailbox mutex */
- while (MAILBOX_GetMutex(MAILBOX) == 0)
- ;
- /* The core1 has mutex, can change shared variable _XiaoMaGe */
- if (_XiaoMaGe != NULL)
- {
- (*_XiaoMaGe)++;
- PRINTF("M0 : mailbox mutex by СÂí¸ç,the data is :%d\n", *_XiaoMaGe);
- }
- /* Set mutex to allow access other core to shared variable */
- MAILBOX_SetMutex(MAILBOX);
- }
复制代码
-----------------------小马哥系列之【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双核任务二】传送门--------------------
|
|