[原创] 【LPC54100】双核协同工作NO.1点灯

ljj3166   2015-3-22 19:05 楼主
前面简单了解了一下双核的基本配置

以及双核间的通信

准备着手双核协同工作的一些内容了



简单设想了一下这次的方案:

M0产生一个随机数,共享给M4

M4读取这个随机数,并进行计算判断是否为偶数,并将结果通知M0

M0收到M4的计算判断结果后,,如果是,则点灯,如果不是,则灭灯




开搞,折腾了老半天,感觉LPCOpen的库有些很难描述的Bug,和c标准库之间的问题

有些时候会出现一些奇怪的现象,有空再复现一下,汇总起来



先上代码吧,很简单

M4侧:

  1. #include "board.h"
  2. #include <cr_section_macros.h>
  3. #include "boot_multicore_slave.h"
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. unsigned char cnt_m4;
  7. static MBOX_IDX_T myCoreBox, otherCoreBox;

  8. static void mutexTake(void)
  9. {
  10.         while (Chip_MBOX_GetMutex(LPC_MBOX) == 0) {}
  11. }

  12. static void mutexGive(void)
  13. {
  14.         Chip_MBOX_SetMutex(LPC_MBOX);
  15. }

  16. void MAILBOX_IRQHandler(void)
  17. {
  18.         char pdata[20];
  19.         uint32_t sdata,temp;
  20.         uint32_t *p = (uint32_t *)Chip_MBOX_GetValue(LPC_MBOX, myCoreBox);
  21.                 mutexTake();
  22.                 itoa(*p,pdata,10);//获取M0的随机数
  23.                 Board_UARTPutSTR("Core M4 get the randnum:");
  24.                 Board_UARTPutSTR(pdata);Board_UARTPutSTR("\r\n");
  25.                 Board_UARTPutSTR("Core M4 computed the result:");
  26.                 temp = (*p)%2;   //判断是否为偶数,是则sdata=1,否则sdata=0
  27.                 if(temp==0){sdata = 1;Board_UARTPutSTR("LED ON");}
  28.                 else{sdata = 0;Board_UARTPutSTR("LED OFF");}
  29.                 Board_UARTPutSTR("\r\n");
  30.                 Chip_MBOX_SetValue(LPC_MBOX, otherCoreBox, (uint32_t)&sdata);//把计算判断的结果返回给M0
  31.                         Chip_MBOX_ClearValueBits(LPC_MBOX, myCoreBox, 0xFFFFFFFF);
  32.                         mutexGive();

  33. }

  34. int main(void) {
  35.     SystemCoreClockUpdate();
  36.     Board_Init();
  37.         myCoreBox = MAILBOX_CM4;
  38.         otherCoreBox = MAILBOX_CM0PLUS;
  39.         Chip_MBOX_Init(LPC_MBOX);
  40.         mutexGive();
  41.     Board_UARTPutSTR("Core M4 boot......\r\n");
  42.     NVIC_EnableIRQ(MAILBOX_IRQn);
  43.     boot_multicore_slave();
  44.     volatile static int i = 0 ;
  45.     while(1) {
  46.         i++ ;
  47.     }
  48.     return 0 ;
  49. }



M0侧:

  1. #include "board.h"
  2. #include <cr_section_macros.h>
  3. #include "boot_multicore_slave.h"
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. static void mutexTake(void)
  7. {
  8.         while (Chip_MBOX_GetMutex(LPC_MBOX) == 0) {}
  9. }

  10. static void mutexGive(void)
  11. {
  12.         Chip_MBOX_SetMutex(LPC_MBOX);
  13. }

  14. unsigned char cnt_m0;
  15. static MBOX_IDX_T myCoreBox, otherCoreBox;

  16. void MAILBOX_IRQHandler(void)
  17. {
  18. uint32_t *p = (uint32_t *)Chip_MBOX_GetValue(LPC_MBOX, myCoreBox);
  19.         mutexTake();
  20.         Board_UARTPutSTR("Core M0+ get the Result from M4,");
  21.         if(*p==1){Board_LED_Set(1,true);Board_UARTPutSTR("SET LED ON");}  //获取M4计算判断的结果,并配置LED灯
  22.         else{Board_LED_Set(1,false);Board_UARTPutSTR("SET LED OFF");}
  23.         Board_UARTPutSTR("\r\n");
  24.                 Chip_MBOX_ClearValueBits(LPC_MBOX, myCoreBox, 0xFFFFFFFF);
  25.                 mutexGive();
  26. }


  27. int main(void) {

  28.     SystemCoreClockUpdate();
  29.     Board_Init();
  30.         myCoreBox = MAILBOX_CM0PLUS;
  31.         otherCoreBox = MAILBOX_CM4;
  32.         Chip_MBOX_Init(LPC_MBOX);
  33.         mutexGive();
  34.     Board_UARTPutSTR("Core M0+ boot......\r\n");
  35.     NVIC_EnableIRQ(MAILBOX_IRQn);
  36.     SysTick_Config(SystemCoreClock/10);
  37.     volatile static int i = 0 ;
  38.     while(1) {
  39.         i++ ;
  40.     }
  41.     return 0 ;
  42. }

  43. void SysTick_Handler(void)   //每10个systick产生一个伪随机数,并发送给M4进行计算
  44. {
  45.         char pdata[10];
  46.         int sdata;

  47.         cnt_m0++;
  48.         if(cnt_m0>=10)
  49.         {
  50.                 mutexTake();
  51.                 cnt_m0 = 0;
  52.                 //sprintf(pdata,"Core M0+ make rand_num:%d\r\n",rand());
  53.                 sdata = rand();
  54.                 Board_UARTPutSTR("Core M0+ make the randnum:");Board_UARTPutSTR(itoa(sdata,pdata,10));Board_UARTPutSTR("\r\n");
  55.                 Chip_MBOX_SetValue(LPC_MBOX, otherCoreBox, (uint32_t) &sdata);
  56.                 Chip_MBOX_ClearValueBits(LPC_MBOX, myCoreBox, 0xFFFFFFFF);
  57.                 mutexGive();
  58.         }
  59. }



有图有真相

dsafsdg.gif





到现在,C语言还是有很多不明白的东西,学无止境啊
So TM what......?

回复评论 (3)

沙发不留
So TM what......?
点赞  2015-3-22 19:06
不错哈,赞一个,我的板子还没玩起来~~
HELLO_WATER
点赞  2015-3-22 21:15
不错,期待进一步的总结。
我的博客
点赞  2015-3-23 08:31
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复