基于keil的多核实现 看了一些官方的文档和网络上的试用帖,大家都是基于NXP的官方开发环境进行双核开发调试,或者采用IAR进行多核调试。这里将采用Keil完成开发和调试的经过简述和记录一下。 1. 项目建立按照项目建立帖的说明,利用MCUXpressoConfig Tools工具从SDK中的MutiCore例子中选择hello_world,创建多核应用。工程创建时,直接生成两个工程,一个是Core0的工程,一个是Core1的工程。 通过工具配置硬件资源后,生成驱动代码。 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系列芯片的烧写工具,支持按照地址空间烧写代码。 在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可以正确的运行。 串口打印效果 Core1控制蓝色小灯闪烁
经过实际测试,推荐采用方法2的处理方式,更加符合设计需要。
|