在线时间828 小时
UID3079326
注册时间2015-2-11
NXP金币29
TA的每日心情 | 奋斗 2025-5-7 09:07 |
---|
签到天数: 353 天 连续签到: 1 天 [LV.8]以坛为家I
金牌会员
 
- 积分
- 5786
- 最后登录
- 2025-5-7
|
本帖最后由 wambob 于 2017-6-30 21:15 编辑
使用Mailbox虽然能实现双核间的通讯,但是由于使用了中断请求寄存器,所以所以只能通讯非零数据。如果发送0怎么办?
使用邮箱互斥控制共享资源的更改。
在Mailbox中断的工程上,增加了互斥操作和共享资源。
由于地址的非零,可以发送共享资源的地址,使M0核中断,取出共享资源的地址,也就得到了共享资源,那个使用共享资源,可以通过读取互斥寄存器来决定,如果MCU读到1,则控制了共享资源的读写,同时对互斥寄存器清零,直到改完共享资源,设置互斥寄存器为1,另一个读1才能控制共享资源,如果期间读到0,则等待。
上面的流程是双mailbox,双变量。明白了单共享变量,不难理解双变量。
CM4工程里,定义一个volatile变量
- volatile uint32_t g_shared = 0;
复制代码 初始化邮箱,并发送共享变量的地址给M0。
- MAILBOX_Init(MAILBOX);
- MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, (uint32_t)&g_shared);
复制代码 在while循环里,通过自己定义的按键实现当按下按键时,检测互斥,成功时改写变量。
- while (1) {
-
- delay();
- PRINTF("CM4 core mailbox received:%d\r\n",g_shared);
- delay();
- if (!GPIO_ReadPinInput(BOARD_SW3_GPIO, BOARD_SW3_GPIO_PORT, BOARD_SW3_GPIO_PIN))
- {
-
- delay();
- if (GPIO_ReadPinInput(BOARD_SW3_GPIO, BOARD_SW3_GPIO_PORT, BOARD_SW3_GPIO_PIN)!=0)
- {
- while (MAILBOX_GetMutex(MAILBOX) == 0){}
- g_shared++;
- PRINTF("Core0 has mailbox mutex, update shared variable to: %d\n", g_shared);
- MAILBOX_SetMutex(MAILBOX);
- }
- }
- PRINTF("CM4 core mailbox received:%d\r\n",g_shared);
- delay();
- }
复制代码 CM0工程里mailbox的初始化,还需要定义volatile 空指针用来指向共享变量,开启中断使能,和中断服务函数。
- volatile uint32_t *g_shared = NULL;
- void MAILBOX_IRQHandler()
- {
- g_shared = (uint32_t *)MAILBOX_GetValue(MAILBOX, kMAILBOX_CM0Plus);
- MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM0Plus, 0xffffffff);
- }
- MAILBOX_Init(MAILBOX);
- NVIC_EnableIRQ(MAILBOX_IRQn);
复制代码 在while循环里同样通过自己定义的按键实现当按下按键时,检测互斥,成功时改写变量。
- while (1)
- {
- delay();
- LED_TOGGLE();
- PRINTF("CM0 core mailbox received:%d\r\n",*g_shared);
- if (!GPIO_ReadPinInput(BOARD_SW1_GPIO, BOARD_SW1_GPIO_PORT, BOARD_SW1_GPIO_PIN))
- {
- /* Get Mailbox mutex */
- while (MAILBOX_GetMutex(MAILBOX) == 0)
- ;
- /* The core1 has mutex, can change shared variable g_shared */
- if (g_shared != NULL)
- {
- (*g_shared)++;
- PRINTF("Core1 has mailbox mutex, update shared variable to: %d\n", *g_shared);
- }
- /* Set mutex to allow access other core to shared variable */
- MAILBOX_SetMutex(MAILBOX);
-
- }
-
- }
复制代码 这样无论是按那个按键,都可以对共享变量在互斥操作下进行改写,实现了双核通讯,当然也可以在M0和M4中各建一个变量,两个工程同时开启邮箱中断,通过互斥来通讯,就像上面的流程一样。
添加读取串口数据
- while (MAILBOX_GetMutex(MAILBOX) == 0)
- ;
- /* The core1 has mutex, can change shared variable g_shared */
- if (g_shared != NULL)
- {
- uint32_t a;
- PRINTF("input a\r\n");
- SCANF("%d",&a);
- PRINTF("a=%d\r\n",a);
- (*g_shared)=a;
- PRINTF("Core1 has mailbox mutex, update shared variable to: %d\n", *g_shared);
- }
- /* Set mutex to allow access other core to shared variable */
- MAILBOX_SetMutex(MAILBOX);
复制代码
|
|