查看: 4746|回复: 1

[原创] 逐飞LPC55S69 IOT开发板双系统运行及核间通信

[复制链接]
  • TA的每日心情
    奋斗
    昨天 10:10
  • 签到天数: 871 天

    连续签到: 2 天

    [LV.10]以坛为家III

    69

    主题

    3285

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    10422
    最后登录
    2025-9-5
    发表于 2020-11-17 21:43:23 | 显示全部楼层 |阅读模式
    本帖最后由 andeyqi 于 2020-12-2 21:35 编辑

    之前的开箱帖子已经在逐飞的板子上CORE0运行起来RTT系统了,基于开箱帖子的基础上能否在CORE1上跑起来系统,很庆幸的是逐飞的开源库已经开放了双系统的demo,使用逐飞开源库的demo还是很容易运行起来双系统的。我们直接运行逐飞例程中的如下路径的demo程序。**\LPC55S69_Library\example_project\coreboard_multicore_example

    该目录下包含了core0 和 core1 两个MDK工程,编译两个工程时需要注意先编译core1的工程,之后编译core0工程下载运行即可,我们先看下运行起来的效果。

    微信截图_20201117201906.png


    系统运行起来后会输出当前运行的core ID,并开始运行time_run的task输出系统运行时间,从输出的log可以发现core1 的 计数是小于core0的计数,从而从侧面印证了之前的描述core1是通过core0来启动的说法,在core0的main函数内调用MCMGR_StartCore 接口启动core1,从而启动core1对应的程序,在调用该函数之前需要对MCMGR 组件进行初始化,core0的初始化操作在rt_hw_board_init 函数中对其进行了初始化操作。


    1. int main(void)
    2. {
    3.         rt_kprintf("core0 running.\r\n");

    4.         zf_gpio_default_init(PIO1, PIN12, PIN_DIR_OUT);
    5.         (void)MCMGR_StartCore(kMCMGR_Core1, (void *)(char *)CORE1_BOOT_ADDRESS, 2, kMCMGR_Start_Synchronous);
    6.         rt_thread_t tid;

    7.         tid = rt_thread_create("runtime_print", print_runtime, RT_NULL, 1024, 12, 28);  
    8.         RT_ASSERT(tid != RT_NULL);
    9.         rt_thread_startup(tid);

    10.         while (1)
    11.         {
    12.                 zf_gpio_output_not(PIO1, PIN12);
    13.                 delay_ms(2000);
    14.         }
    15. }
    复制代码

    MCMGR_StartCore 接口是NXP LPCS55S69 SDK提供的接口,根据接口API描述可知cor0启动core1,CORE1的镜像地址为#define CORE1_BOOT_ADDRESS 0x00072000,根据CORE1工程的链接脚本(.\LPC55S69_cm33_core1_flash.scf)可以发现该地址对应core1代码段的中断向量表的首地址。

    微信截图_20201117210005.png

    1. /*!
    2. * @brief Start a selected core
    3. *
    4. * This function causes a selected core to initialize and start the code execution.
    5. * If the secondary core application boots from RAM, then there is a need to call the function,
    6. * which copies this app. Image to RAM prior this function.
    7. *
    8. * @param[in] coreNum Enum of the core to be started.
    9. * @param[in] bootAddress Boot address of the core to be started application.
    10. * @param[in] startupData Data which can be get by the other core on startup.
    11. * @param[in] mode Start mode, use kMCMGR_Start_Synchronous for synchronous mode (wait until the
    12. *            core is started), kMCMGR_Start_Asynchronous for asynchronous mode (do not wait).
    13. *
    14. * @return kStatus_MCMGR_Success on success or kStatus_MCMGR_Error on failure.
    15. */
    16. mcmgr_status_t MCMGR_StartCore(mcmgr_core_t coreNum, void *bootAddress, uint32_t startupData, mcmgr_start_mode_t mode);
    复制代码

    我们下载的时候只是下载了core0工程的bin文件,并没有下载core1的镜像文件,core1是如何被加载的呢,实际上core0的代码中将core1生成的可执行文件core1_image.bin 作为代码段包含进工程中,所以我们只是更新了core0程序发现core1也正常的运行了,这个也是开头说的编译的时候要先编译core1工程的原因。
    微信截图_20201117210337.png


    通过上述LPCSS55S69 SDK提供的MCMGR组件的api文件可以发现,其不除了提供核间启动/停止的功能外,还提供了核间event通信方式。
    首先我们先介绍下核间通信方式1(Multicore Manager (MCMGR))--- EVENT
    如下为MCMGR 双核之间交互流程:
    MCMgrDataExchangeDiagram.png

    根据mcmgr.h说明可以如下API可以发送和接受event.对于这个api的实现方式暂时还没有研究,先不管那么多先用起来看看好不好用再说,实践才是检验真理的唯一标准,先跑起来之后再研究实现原理。
    1. /*!
    2. * @brief Register event handler
    3. *
    4. * This function registers an event handler.
    5. * for remote processor events handling.
    6. *
    7. * @param[in] type Type of the event.
    8. * @param[in] callback User callback.
    9. * @param[in] callbackData Data/context for user callback.
    10. *
    11. * @return kStatus_MCMGR_Success on success or kStatus_MCMGR_Error on failure.
    12. */
    13. mcmgr_status_t MCMGR_RegisterEvent(mcmgr_event_type_t type, mcmgr_event_callback_t callback, void *callbackData);

    14. /*!
    15. * @brief Trigger event handler
    16. *
    17. * This function triggers an event handler
    18. * on the remote core.
    19. *
    20. * @param[in] type Type of the event.
    21. * @param[in] eventData Data to send to remote core.
    22. *
    23. * @return kStatus_MCMGR_Success on success or kStatus_MCMGR_Error on failure.
    24. */
    25. mcmgr_status_t MCMGR_TriggerEvent(mcmgr_event_type_t type, uint16_t eventData);
    复制代码
    使用上述API,我们在core0的工程里注册事件,对应的回调函数内打印出事件的data,在core1的工程中发送事件,简单添加下代码如下。
    core0中注册接收事件函数:
    1. void recv_core0_event(uint16_t data,void * contex)
    2. {
    3.                 rt_kprintf("recv CORE1 event %d\n",data);
    4. }

    5. int main(void)
    6. {
    7.         rt_kprintf("core0 running.\r\n");

    8.         (void)MCMGR_StartCore(kMCMGR_Core1, (void *)(char *)CORE1_BOOT_ADDRESS, 2, kMCMGR_Start_Synchronous);
    9.         
    10.         if(kStatus_MCMGR_Success != MCMGR_RegisterEvent(kMCMGR_RemoteRPMsgEvent,recv_core0_event,NULL))
    11.         {
    12.                 rt_kprintf("reg event failed.\r\n");
    13.         }
    14.         else
    15.         {
    16.                 rt_kprintf("reg event success.\r\n");
    17.         }

    18.         rt_thread_t tid;

    19.         tid = rt_thread_create("runtime_print", print_runtime, RT_NULL, 1024, 12, 28);                                                                        
    20.         RT_ASSERT(tid != RT_NULL);
    21.         rt_thread_startup(tid);

    22.         while (1)
    23.         {
    24.                 zf_gpio_output_not(PIO1, PIN12);                                                               
    25.                 delay_ms(2000);
    26.         }
    27. }
    复制代码
    core1中通过命令来发送事件代码如下:
    1. void send_event (int argc)
    2. {
    3.         static int i = 1;
    4.         MCMGR_TriggerEvent(kMCMGR_RemoteRPMsgEvent, i++);
    5. }
    6. MSH_CMD_EXPORT(send_event, clear runtime with no param);        
    复制代码
    从如下的运行结果发现,core1发送的事件已经被core0接收和打印出来了,根据之前了解的资料核间的通讯方式还有其他的,现在已经有了工程模板了后续再此基础上在研究追加。
    微信截图_20201117214005.png


    其他方式,待后续研究继续追加..........




    --------------------------------------------资料分割线--------------------------------------------
    AN12335(双核通讯).pdf (448.42 KB, 下载次数: 20)
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3936

    主题

    7557

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    40194
    最后登录
    2025-9-5
    发表于 2020-11-18 08:59:33 | 显示全部楼层
    感谢分享
    qiandao qiandao
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-9-6 05:37 , Processed in 0.087426 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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