查看: 4669|回复: 0

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

[复制链接]
  • TA的每日心情
    擦汗
    2024-11-7 09:48
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    35

    主题

    83

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1263
    最后登录
    2025-8-26
    发表于 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的部分,这个部分是关键数据.
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-31 06:43 , Processed in 0.081855 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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