2959|3

3414

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

【LPC54100】双核协同工作NO.1点灯 [复制链接]

前面简单了解了一下双核的基本配置

以及双核间的通信

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



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

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. }
复制代码



有图有真相







到现在,C语言还是有很多不明白的东西,学无止境啊
此帖出自NXP MCU论坛

最新回复

不错,期待进一步的总结。  详情 回复 发表于 2015-3-23 08:31

赞赏

1

查看全部赞赏

点赞 关注
个人签名

So TM what......?

 

回复
举报

3414

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
沙发不留
此帖出自NXP MCU论坛
 
个人签名

So TM what......?

 

 

回复

1403

帖子

1

TA的资源

纯净的硅(中级)

板凳
 
不错哈,赞一个,我的板子还没玩起来~~
此帖出自NXP MCU论坛
 
个人签名HELLO_WATER
 
 

回复

4997

帖子

19

TA的资源

裸片初长成(初级)

4
 
不错,期待进一步的总结。
此帖出自NXP MCU论坛
 
个人签名我的博客
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表