坛子大神都在讨论双核的启动
撸主来玩玩双核工作的代码
还是从闪灯开始
代码库里头有m0和m4的blinky例程:multicore_m0slave_blinky 和 multicore_m4master_blinky
刚开始,有些小误解
以为是分别使用m0和m4来进行blinky
实际测试中,multicore_m0slave_blinky 这个工程实际上是无法debug的
只有multicore_m4master_blinky可以使开发板正常工作起来
在multicore_m4master_blinky工程里面找了半天,都没有发现m0工作的代码
后来在multicore_m4master_blinky的readme.txt这个文件里面发现了端倪:
- This project is meant to work with the m0slave_blinky
- project as the slave and the m4master_blinky project as the master.
会不会是multicore_m0slave_blinky 和 multicore_m4master_blinky必须同时编译,才能够得到实际的双核运行效果?
修改了一下代码,做个测试
m0slave_blinky.c代码中,把MAILBOX_IRQHandler代码修改为:
- void MAILBOX_IRQHandler(void)
- {
- /* Slave core uses passed mailbox value as address to shared LED state values */
- uint32_t *psharedLEDStates = (uint32_t *) Chip_MBOX_GetValue(LPC_MBOX, myCoreBox);
- /* Toggle LED bit state for this core usign mutex */
- mutexTake();
- cnt++;
- if(cnt >= 5){
- sharedLEDStates = *psharedLEDStates;
- ledToggleBit(1);
- *psharedLEDStates = sharedLEDStates;
- cnt = 0;
- }
- mutexGive();
- /* Clear this MCU's mailbox */
- Chip_MBOX_ClearValueBits(LPC_MBOX, myCoreBox, 0xFFFFFFFF);
- /* Signal master code about the change */
- Chip_MBOX_SetValue(LPC_MBOX, otherCoreBox, 1);
- }
每通过mialbox通信5次,LED1翻转一次
这里0-红灯、1-绿灯、2-蓝灯
观察m4slave_blinky.c的SysTick_Handler:
- void SysTick_Handler(void)
- {
- cnt25++;
- if (cnt25 >= 25) {
- /* Toggle LED state for this CPU core */
- mutexTake();
- ledToggleBit(2);
- /* Give slave core the address of the shared LED value. The slave core
- will alter the address directly in memory for the 2nd LED state */
- Chip_MBOX_SetValue(LPC_MBOX, otherCoreBox, (uint32_t) &sharedLEDStates);
- mutexGive();
- cnt25 = 0;
- }
- }
不难理解,每25个systick翻转一次LED2蓝灯
同时向otherCoreBox传递一次数据
综合上面修改的代码,理论上蓝灯翻转5次,绿灯产生1次翻转
把m4slave_blinky.c文件进行编译,然后下载
上gif
果然是和预想的差不多
到这里,双核工程的秘密就被扒光了衣服
稍微总结一下目前的理解:
双核协同工作,m0和m4其实分属2个工程
m4的工程对外设及时钟进行初始化,m0的工程则进行一些其他的处理
产生2个hex或者axf文件
然后由编译器进行这俩文件的合并,生成最终下载文件
这个文件是m4的下载文件
尝试了一下,m4工程去blink,m0的工程调用Board_UARTPutSTR()串口打印
结果编译报错,重定义之类