查看: 1558|回复: 1

[评测分享] 【NXP OKdo E1双核Cortex M33开发板】基于keil的多核开发方法

[复制链接]
  • TA的每日心情
    开心
    2022-11-7 10:36
  • 签到天数: 898 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2020-11-9 08:31:05 | 显示全部楼层 |阅读模式
    分享到:
    基于keil的多核实现
        看了一些官方的文档和网络上的试用帖,大家都是基于NXP的官方开发环境进行双核开发调试,或者采用IAR进行多核调试。这里将采用Keil完成开发和调试的经过简述和记录一下。
    1.  项目建立
    按照项目建立帖的说明,利用MCUXpressoConfig Tools工具从SDK中的MutiCore例子中选择hello_world,创建多核应用。工程创建时,直接生成两个工程,一个是Core0的工程,一个是Core1的工程。
    通过工具配置硬件资源后,生成驱动代码。
    1.png
    Core0的程序起动后,会将Core1的代码加载到指定的SRAM中,然后起动Core1运行程序。
    2.  双核代码烧录
    双核程序代码在开发环境下编译通过后,Core0的工程可以生成直接运行的可执行文件,并且可以通过仿真器烧写到芯片的flash中。Core1的工程生成一个Core1_image.bin格式的二进制文件,无法通过仿真器直接烧写到flash中。如何将两个Core执行代码烧写到flash中,并运行起来呢?这里的关键是Core1的执行代码。
    2.1.  Keil的分散加载文件
    首先看一下keil开发环境的Core0工程的分散加载文件LPC55S69_cm33_core0_flash.scf,其中对于flash空间的分区描述。
    #define  m_interrupts_start            0x00000000
    #define  m_interrupts_size             0x00000200
    #define  m_text_start                  0x00000200
    #define  m_text_size                   0x00071E00
    #define  m_core1_image_start           0x00072000
    #define  m_core1_image_size            0x00026000
        描述文件中定义,m_interrupts_start定义了Core0的中断向量起始地址,m_interrupts_size定义了Core0的中断向量长度;m_text_start和m_text_size分别定义了Core0代码的起始地址和长度;m_core1_image_start和m_core1_image_size定义了Core1代码的起始地址和长度。
        通过分散加载文件的描述,可以了解到Core1需要存储在flash地址为0x00072000开始的地方,最大长度为0x00026000 。
    2.2.  Core0引导Core1的实现
    Core1代码的执行地址空间定义:
        #define CORE1_BOOT_ADDRESS 0x20033000
    Core1代码存储空间定义:
        extern uint32_t Image$$CORE1_REGION$$Base;
    extern uint32_t Image$$CORE1_REGION$$Length;
    #define CORE1_IMAGE_START &Image$$CORE1_REGION$$Base
        Core1代码加载:
       uint32_t core1_image_size = get_core1_image_size();
       /* Copy Secondary core application from FLASH to the target memory. */
    (void)memcpy((void*)(char *)CORE1_BOOT_ADDRESS, (void *)CORE1_IMAGE_START, core1_image_size);
    2.3.  方法1
    通过工具生成一个适合的bin格式文件,在指定的位置上将core1的bin文件插入进去,通过工具烧录到LPC55S69的flash中。
    1) 二进制文件生成
    需要采用二进制文件合成工具,将Core0和Core1的可执行文件和成一个二进制文件。两个文件的起始地址按照分散加载的要求。
    使用的工具。
    2)ISP工具
    Flash Magic 是支持LPC系列芯片的烧写工具,支持按照地址空间烧写代码。
    2.png
    在Firmware处选择bin文件,然后开始烧录就可以了。
    2.4.  方法2
    利用分散加载文件的section定义,将core1的执行文件转为一个常量数组,并且指定到section位置保存。
    利用 __attribute__((section(".m0code")))指令完成重定位。
    为此,特意制作了一个工具convbin2h.exe,将指定的bin文件转换为h头文件,加入到系统中。
    转换工具的使用例子:convbin2h.execore1_image.bin
    提示转换成功后,会在同一个目录下生成core1_image.h文件。
    推荐采用这种方式,虽然目前无法在线调试,但是程序烧录,加载运行已经挺方便了。
    3.  实测效果
    打开core0工程的map文件,可以观察到,在CORE1_REGION中出现了core1的映像。这里地址不是0x00072000是因为我调整了core1印象的存储地址到0x00090000位置,实际测试后,core1可以正确的运行。
    5.png
    串口打印效果
    3.png
    Core1控制蓝色小灯闪烁
    4.jpg

    经过实际测试,推荐采用方法2的处理方式,更加符合设计需要。

    方法1的实现工具: tools-方法1.rar (36.16 KB, 下载次数: 5)
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2022-11-7 10:36
  • 签到天数: 898 天

    连续签到: 1 天

    [LV.10]以坛为家III

     楼主| 发表于 2020-11-22 08:51:51 | 显示全部楼层
    经过这段时间的研究,发现官方提供了更好的解决方案。需要向系统中增加一个汇编代码,将bin文件直接嵌入到core0的代码中。比转换成分头文件还要简单。
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-5-7 08:34 , Processed in 0.124385 second(s), 19 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.