[原创] 【LPC54100】让两个核分别blinky

ljj3166   2015-3-12 00:31 楼主
坛子大神都在讨论双核的启动
撸主来玩玩双核工作的代码



还是从闪灯开始

代码库里头有m0和m4的blinky例程:multicore_m0slave_blinky 和 multicore_m4master_blinky

1.jpg

刚开始,有些小误解

以为是分别使用m0和m4来进行blinky

实际测试中,multicore_m0slave_blinky 这个工程实际上是无法debug的

只有multicore_m4master_blinky可以使开发板正常工作起来

在multicore_m4master_blinky工程里面找了半天,都没有发现m0工作的代码

后来在multicore_m4master_blinky的readme.txt这个文件里面发现了端倪:

  1. This project is meant to work with the m0slave_blinky
  2. project as the slave and the m4master_blinky project as the master.



会不会是multicore_m0slave_blinky 和 multicore_m4master_blinky必须同时编译,才能够得到实际的双核运行效果?

修改了一下代码,做个测试

m0slave_blinky.c代码中,把MAILBOX_IRQHandler代码修改为:

  1. void MAILBOX_IRQHandler(void)
  2. {
  3.         /* Slave core uses passed mailbox value as address to shared LED state values */
  4.         uint32_t *psharedLEDStates = (uint32_t *) Chip_MBOX_GetValue(LPC_MBOX, myCoreBox);

  5.         /* Toggle LED bit state for this core usign mutex */
  6.         mutexTake();
  7.         cnt++;
  8.         if(cnt >= 5){
  9.         sharedLEDStates = *psharedLEDStates;
  10.         ledToggleBit(1);
  11.         *psharedLEDStates = sharedLEDStates;
  12.         cnt = 0;
  13.         }
  14.         mutexGive();
  15.         /* Clear this MCU's mailbox */
  16.         Chip_MBOX_ClearValueBits(LPC_MBOX, myCoreBox, 0xFFFFFFFF);

  17.         /* Signal master code about the change */
  18.         Chip_MBOX_SetValue(LPC_MBOX, otherCoreBox, 1);
  19. }



每通过mialbox通信5次,LED1翻转一次

这里0-红灯、1-绿灯、2-蓝灯



观察m4slave_blinky.c的SysTick_Handler:

  1. void SysTick_Handler(void)
  2. {
  3.         cnt25++;
  4.         if (cnt25 >= 25) {
  5.                 /* Toggle LED state for this CPU core */
  6.                 mutexTake();
  7.                 ledToggleBit(2);

  8.                 /* Give slave core the address of the shared LED value. The slave core
  9.                    will alter the address directly in memory for the 2nd LED state */
  10.                 Chip_MBOX_SetValue(LPC_MBOX, otherCoreBox, (uint32_t) &sharedLEDStates);
  11.                 mutexGive();
  12.                 cnt25 = 0;
  13.         }
  14. }



不难理解,每25个systick翻转一次LED2蓝灯

同时向otherCoreBox传递一次数据



综合上面修改的代码,理论上蓝灯翻转5次,绿灯产生1次翻转

把m4slave_blinky.c文件进行编译,然后下载

上gif

5r3425.gif



果然是和预想的差不多

到这里,双核工程的秘密就被扒光了衣服

稍微总结一下目前的理解:

双核协同工作,m0和m4其实分属2个工程

m4的工程对外设及时钟进行初始化,m0的工程则进行一些其他的处理

产生2个hex或者axf文件

然后由编译器进行这俩文件的合并,生成最终下载文件

这个文件是m4的下载文件



尝试了一下,m4工程去blink,m0的工程调用Board_UARTPutSTR()串口打印

结果编译报错,重定义之类




So TM what......?

回复评论 (6)

帮顶,问下楼主,两个工程如何同时下载到板子呢?板子还没到,提前请教。
点赞  2015-3-12 09:41
编译器会自动把两个文件合并,从master工程调试或下载就好了
点赞  2015-3-12 09:53
引用: shinykongcn 发表于 2015-3-12 09:41
帮顶,问下楼主,两个工程如何同时下载到板子呢?板子还没到,提前请教。
两个工程分别下载,然后在M4工程内指定M0核的入口地址,并启动M0核心



要666
点赞  2015-3-12 09:53
可能其他编译器是这样吧,官方的是把映像合并了。
点赞  2015-3-12 10:07
呵呵,等等该弄4核了。
我的博客
点赞  2015-3-12 13:11
保存中!!!
不做电源了,做ARM
点赞  2016-5-17 21:29
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复