在线时间95 小时
UID3332856
注册时间2016-11-28
NXP金币203
该用户从未签到
金牌会员
- 积分
- 1025
- 最后登录
- 2024-3-31
|
1、这个双核直接信息互传的任务,在pingpang的例程中可以实现。
具体实现结果如下,
cm0和cm4直接互相传递信息,直到100次自动停止。
2、这个过程中和hello world过程相似,但是,增加了一个使用互传的api,rpmsg_lite_xxx
通过这个instance,执行init,send,received的过程。
具体这个过程中共用的是数据结构,在.h头文件中定义.
这个过程的设计需要比较精巧,而且调试过程不是一周可以实现的,所以本周任务,仍然是以测试为主,如果完成高难的还是不容易的
内核通信,可以共用内存,也可以通过mailbox,还可以通过中断,方法很多,这里是通过数据结构传送的,效率高,但是不适合大数据量的传递.
3.代码比描述更清楚,可以直接看代码,主要代码如下:
cm0
- int main(void)
- {
- volatile int has_received = 0;
- struct rpmsg_lite_ept_static_context my_ept_context;
- struct rpmsg_lite_endpoint *my_ept;
- struct rpmsg_lite_instance rpmsg_ctxt;
- struct rpmsg_lite_instance *my_rpmsg;
- /* Initialize standard SDK demo application pins */
- BOARD_InitPins_Core1();
- #ifdef MCMGR_USED
- uint32_t startupData;
- /* Initialize MCMGR before calling its API */
- MCMGR_Init();
- /* Get the startup data */
- MCMGR_GetStartupData(kMCMGR_Core1, &startupData);
- my_rpmsg = rpmsg_lite_remote_init((void *)startupData, RPMSG_LITE_LINK_ID, RL_NO_FLAGS, &rpmsg_ctxt);
- /* Signal the other core we are ready */
- MCMGR_SignalReady(kMCMGR_Core1);
- #else
- my_rpmsg = rpmsg_lite_remote_init((void *)RPMSG_LITE_SHMEM_BASE, RPMSG_LITE_LINK_ID, RL_NO_FLAGS, &rpmsg_ctxt);
- #endif /* MCMGR_USED */
- while (!rpmsg_lite_is_link_up(my_rpmsg))
- ;
- my_ept = rpmsg_lite_create_ept(my_rpmsg, LOCAL_EPT_ADDR, my_ept_read_cb, (void *)&has_received, &my_ept_context);
- #ifdef RPMSG_LITE_NS_USED
- rpmsg_ns_announce(my_rpmsg, my_ept, RPMSG_LITE_NS_ANNOUNCE_STRING, RL_NS_CREATE);
- #endif /*RPMSG_LITE_NS_USED*/
- has_received = 0;
- while (msg.DATA <= 100)
- {
- if (has_received)
- {
- has_received = 0;
- msg.DATA++;
- rpmsg_lite_send(my_rpmsg, my_ept, remote_addr, (char *)&msg, sizeof(THE_MESSAGE), RL_DONT_BLOCK);
- }
- }
- rpmsg_lite_destroy_ept(my_rpmsg, my_ept);
- my_ept = NULL;
- rpmsg_lite_deinit(my_rpmsg);
- msg.DATA = 0;
- /* End of example */
- while (1)
- ;
- }
复制代码
cm4部分
- int main(void)
- {
- volatile int has_received;
- struct rpmsg_lite_ept_static_context my_ept_context;
- struct rpmsg_lite_endpoint *my_ept;
- struct rpmsg_lite_instance rpmsg_ctxt;
- struct rpmsg_lite_instance *my_rpmsg;
- /* Initialize standard SDK demo application pins */
- /* attach 12 MHz clock to FLEXCOMM0 (debug console) */
- CLOCK_AttachClk(kFRO12M_to_FLEXCOMM0);
- BOARD_InitPins_Core0();
- BOARD_BootClockFROHF48M();
- BOARD_InitDebugConsole();
- #ifdef CORE1_IMAGE_COPY_TO_RAM
- /* Calculate size of the image */
- uint32_t core1_image_size;
- core1_image_size = get_core1_image_size();
- PRINTF("Copy CORE1 image to address: 0x%x, size: %d\n", CORE1_BOOT_ADDRESS, core1_image_size);
- /* Copy application from FLASH to RAM */
- memcpy(CORE1_BOOT_ADDRESS, (void *)CORE1_IMAGE_START, core1_image_size);
- #endif
- /* Initialize MCMGR before calling its API */
- MCMGR_Init();
- /* Boot Secondary core application */
- MCMGR_StartCore(kMCMGR_Core1, CORE1_BOOT_ADDRESS, (uint32_t)rpmsg_lite_base, kMCMGR_Start_Synchronous);
- // Print the initial banner
- PRINTF("\r\nRPMsg demo starts\n\n\r");
- my_rpmsg = rpmsg_lite_master_init(rpmsg_lite_base, SH_MEM_TOTAL_SIZE, RPMSG_LITE_LINK_ID, RL_NO_FLAGS, &rpmsg_ctxt);
- my_ept = rpmsg_lite_create_ept(my_rpmsg, LOCAL_EPT_ADDR, my_ept_read_cb, (void *)&has_received, &my_ept_context);
- has_received = 0;
- /* Send the first message to the remoteproc */
- msg.DATA = 0;
- rpmsg_lite_send(my_rpmsg, my_ept, REMOTE_EPT_ADDR, (char *)&msg, sizeof(THE_MESSAGE), RL_DONT_BLOCK);
- while (msg.DATA <= 100)
- {
- if (has_received)
- {
- has_received = 0;
- msg.DATA++;
- rpmsg_lite_send(my_rpmsg, my_ept, 30, (char *)&msg, sizeof(THE_MESSAGE), RL_DONT_BLOCK);
- }
- }
- rpmsg_lite_destroy_ept(my_rpmsg, my_ept);
- my_ept = NULL;
- rpmsg_lite_deinit(my_rpmsg);
- // Print the ending banner
- PRINTF("\r\nRPMsg demo ends\n\n\r");
- while (1)
- ;
- }
复制代码 这两个代码有很多相似的地方,但是在cm4中有引入cm0的部分,这个部分是关键数据.
|
|