查看: 2697|回复: 0

[原创] 【LPC54114双核任务二】双核pingpang互传信息,并输出结果

[复制链接]

该用户从未签到

25

主题

64

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1025
最后登录
2024-3-31
发表于 2017-6-29 16:50:33 | 显示全部楼层 |阅读模式
1、这个双核直接信息互传的任务,在pingpang的例程中可以实现。
具体实现结果如下,
1.JPG
cm0和cm4直接互相传递信息,直到100次自动停止。
2、这个过程中和hello world过程相似,但是,增加了一个使用互传的api,rpmsg_lite_xxx
通过这个instance,执行init,send,received的过程。
具体这个过程中共用的是数据结构,在.h头文件中定义.
这个过程的设计需要比较精巧,而且调试过程不是一周可以实现的,所以本周任务,仍然是以测试为主,如果完成高难的还是不容易的
内核通信,可以共用内存,也可以通过mailbox,还可以通过中断,方法很多,这里是通过数据结构传送的,效率高,但是不适合大数据量的传递.
3.代码比描述更清楚,可以直接看代码,主要代码如下:
cm0
  1. int main(void)
  2. {
  3.     volatile int has_received = 0;
  4.     struct rpmsg_lite_ept_static_context my_ept_context;
  5.     struct rpmsg_lite_endpoint *my_ept;
  6.     struct rpmsg_lite_instance rpmsg_ctxt;
  7.     struct rpmsg_lite_instance *my_rpmsg;

  8.     /* Initialize standard SDK demo application pins */
  9.     BOARD_InitPins_Core1();

  10. #ifdef MCMGR_USED
  11.     uint32_t startupData;

  12.     /* Initialize MCMGR before calling its API */
  13.     MCMGR_Init();

  14.     /* Get the startup data */
  15.     MCMGR_GetStartupData(kMCMGR_Core1, &startupData);

  16.     my_rpmsg = rpmsg_lite_remote_init((void *)startupData, RPMSG_LITE_LINK_ID, RL_NO_FLAGS, &rpmsg_ctxt);

  17.     /* Signal the other core we are ready */
  18.     MCMGR_SignalReady(kMCMGR_Core1);
  19. #else
  20.     my_rpmsg = rpmsg_lite_remote_init((void *)RPMSG_LITE_SHMEM_BASE, RPMSG_LITE_LINK_ID, RL_NO_FLAGS, &rpmsg_ctxt);
  21. #endif /* MCMGR_USED */

  22.     while (!rpmsg_lite_is_link_up(my_rpmsg))
  23.         ;

  24.     my_ept = rpmsg_lite_create_ept(my_rpmsg, LOCAL_EPT_ADDR, my_ept_read_cb, (void *)&has_received, &my_ept_context);
  25. #ifdef RPMSG_LITE_NS_USED
  26.     rpmsg_ns_announce(my_rpmsg, my_ept, RPMSG_LITE_NS_ANNOUNCE_STRING, RL_NS_CREATE);
  27. #endif /*RPMSG_LITE_NS_USED*/
  28.     has_received = 0;

  29.     while (msg.DATA <= 100)
  30.     {
  31.         if (has_received)
  32.         {
  33.             has_received = 0;
  34.             msg.DATA++;
  35.             rpmsg_lite_send(my_rpmsg, my_ept, remote_addr, (char *)&msg, sizeof(THE_MESSAGE), RL_DONT_BLOCK);
  36.         }
  37.     }

  38.     rpmsg_lite_destroy_ept(my_rpmsg, my_ept);
  39.     my_ept = NULL;
  40.     rpmsg_lite_deinit(my_rpmsg);
  41.     msg.DATA = 0;

  42.     /* End of example */
  43.     while (1)
  44.         ;
  45. }
复制代码
OM13090_LPC54114_01.gif

cm4部分
  1. int main(void)
  2. {
  3.     volatile int has_received;
  4.     struct rpmsg_lite_ept_static_context my_ept_context;
  5.     struct rpmsg_lite_endpoint *my_ept;
  6.     struct rpmsg_lite_instance rpmsg_ctxt;
  7.     struct rpmsg_lite_instance *my_rpmsg;

  8.     /* Initialize standard SDK demo application pins */
  9.     /* attach 12 MHz clock to FLEXCOMM0 (debug console) */
  10.     CLOCK_AttachClk(kFRO12M_to_FLEXCOMM0);

  11.     BOARD_InitPins_Core0();
  12.     BOARD_BootClockFROHF48M();
  13.     BOARD_InitDebugConsole();

  14. #ifdef CORE1_IMAGE_COPY_TO_RAM
  15.     /* Calculate size of the image */
  16.     uint32_t core1_image_size;
  17.     core1_image_size = get_core1_image_size();
  18.     PRINTF("Copy CORE1 image to address: 0x%x, size: %d\n", CORE1_BOOT_ADDRESS, core1_image_size);

  19.     /* Copy application from FLASH to RAM */
  20.     memcpy(CORE1_BOOT_ADDRESS, (void *)CORE1_IMAGE_START, core1_image_size);
  21. #endif

  22.     /* Initialize MCMGR before calling its API */
  23.     MCMGR_Init();

  24.     /* Boot Secondary core application */
  25.     MCMGR_StartCore(kMCMGR_Core1, CORE1_BOOT_ADDRESS, (uint32_t)rpmsg_lite_base, kMCMGR_Start_Synchronous);

  26.     // Print the initial banner
  27.     PRINTF("\r\nRPMsg demo starts\n\n\r");

  28.     my_rpmsg = rpmsg_lite_master_init(rpmsg_lite_base, SH_MEM_TOTAL_SIZE, RPMSG_LITE_LINK_ID, RL_NO_FLAGS, &rpmsg_ctxt);

  29.     my_ept = rpmsg_lite_create_ept(my_rpmsg, LOCAL_EPT_ADDR, my_ept_read_cb, (void *)&has_received, &my_ept_context);

  30.     has_received = 0;

  31.     /* Send the first message to the remoteproc */
  32.     msg.DATA = 0;
  33.     rpmsg_lite_send(my_rpmsg, my_ept, REMOTE_EPT_ADDR, (char *)&msg, sizeof(THE_MESSAGE), RL_DONT_BLOCK);

  34.     while (msg.DATA <= 100)
  35.     {
  36.         if (has_received)
  37.         {
  38.             has_received = 0;
  39.             msg.DATA++;
  40.             rpmsg_lite_send(my_rpmsg, my_ept, 30, (char *)&msg, sizeof(THE_MESSAGE), RL_DONT_BLOCK);
  41.         }
  42.     }

  43.     rpmsg_lite_destroy_ept(my_rpmsg, my_ept);
  44.     my_ept = NULL;
  45.     rpmsg_lite_deinit(my_rpmsg);

  46.     // Print the ending banner
  47.     PRINTF("\r\nRPMsg demo ends\n\n\r");
  48.     while (1)
  49.         ;
  50. }
复制代码
这两个代码有很多相似的地方,但是在cm4中有引入cm0的部分,这个部分是关键数据.
回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /4 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2024-5-7 02:03 , Processed in 0.103753 second(s), 20 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表