查看: 6973|回复: 1

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

[复制链接]
  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3935

    主题

    7556

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    40184
    最后登录
    2025-9-4
    发表于 2020-12-2 14:32:19 | 显示全部楼层 |阅读模式
    OKdo E1双核Cortex M33开发板基于keil的多核开发方法


    基于keil的多核实现
        看了一些官方的文档和网络上的试用帖,大家都是基于NXP的官方开发环境进行双核开发调试,或者采用IAR进行多核调试。这里将采用Keil完成开发和调试的经过简述和记录一下。
    1.  项目建立
    按照项目建立帖的说明,利用MCUXpressoConfig Tools工具从SDK中的MutiCore例子中选择hello_world,创建多核应用。工程创建时,直接生成两个工程,一个是Core0的工程,一个是Core1的工程。
    通过工具配置硬件资源后,生成驱动代码。
    11.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空间的分区描述。
    1. #define  m_interrupts_start            0x00000000

    2. #define  m_interrupts_size             0x00000200

    3. #define  m_text_start                  0x00000200

    4. #define  m_text_size                   0x00071E00

    5. #define  m_core1_image_start           0x00072000

    6. #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代码的执行地址空间定义:

    1. #define CORE1_BOOT_ADDRESS 0x20033000
    复制代码

    Core1代码存储空间定义:
    1. <p>    extern uint32_t Image$CORE1_REGION$Base;</p><p>extern uint32_t Image$CORE1_REGION$Length;</p><p>#define CORE1_IMAGE_START &Image$CORE1_REGION$Base</p>
    复制代码

        Core1代码加载:
    uint32_t core1_image_size = get_core1_image_size();
    1. <p>   /* Copy Secondary core application from FLASH to the target memory. */</p><p>(void)memcpy((void*)(char *)CORE1_BOOT_ADDRESS, (void *)CORE1_IMAGE_START, core1_image_size);</p>
    复制代码

    2.3.  方法1
    通过工具生成一个适合的bin格式文件,在指定的位置上将core1的bin文件插入进去,通过工具烧录到LPC55S69的flash中。
    1) 二进制文件生成
    需要采用二进制文件合成工具,将Core0和Core1的可执行文件和成一个二进制文件。两个文件的起始地址按照分散加载的要求。
    使用的工具。
    2)ISP工具
    Flash Magic 是支持LPC系列芯片的烧写工具,支持按照地址空间烧写代码。
    12.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可以正确的运行。
    13.png
    串口打印效果
    14.png
    Core1控制蓝色小灯闪烁
    15.jpg
    经过实际测试,推荐采用方法2的处理方式,更加符合设计需要。

    qiandao qiandao
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-6-30 17:11
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    5

    主题

    441

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1146
    最后登录
    2025-8-27
    发表于 2020-12-2 17:51:15 | 显示全部楼层
    支持,期待更新帖子
    加油
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-9-5 02:52 , Processed in 0.084757 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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