本帖最后由 zyz0926 于 2025-2-24 08:55 编辑
#申请原创# 以本人开发的双核通用高压伺服软件为例来进行说明(KEIL5平台开发):
实现步骤:
1.建立工程
双核工程,需要为CPU0以及CPU1分别建立一套工程,两个工程各自执行相应的代码。
2.分配内存
主要是SCT文件的配置,主要是注意两个工程的内存不可共享,包括RAM以及ROM。
CPU0的SCT文件中:
程序存放ROM地址以及长度为:
#define __ROM_BASE 0x00100000
#define __ROM_SIZE 0x00040000
程序使用的RAM地址以及长度为(本芯片RAM是分散的,各自特点不同):
#define __RAM1_BASE 0x20100000 //SRAM1 16K
#define __RAM1_SIZE 0x00004000
#define __RAM2_BASE 0x20200000 //SRAM2 16K
#define __RAM2_SIZE 0x00004000
#define __RAM3_BASE 0x20300000 //SRAM3 32K
#define __RAM3_SIZE 0x00007000
#define __ITCM_BASE 0x00000000 //ITCM 16K
#define __ITCM_SIZE 0x00004000
#define __DTCM_BASE 0x20000000 //DTCM 16K
#define __DTCM_SIZE 0x00004000
CPU1的SCT文件中:
程序存放ROM地址以及长度为:
#define __ROM_BASE 0x00140000
#define __ROM_SIZE 0x00010000
程序使用的RAM地址以及长度为(本芯片ITCM,DTCM双核是独立的,这里不会涉及到内存共用):
#define __RAM1_BASE 0x20100000 //SRAM1 16K
#define __RAM1_SIZE 0x00004000
#define __RAM2_BASE 0x20200000 //SRAM2 16K
#define __RAM2_SIZE 0x00004000
#define __RAM3_BASE 0x20307000 //SRAM3 32K
#define __RAM3_SIZE 0x00001000
#define __ITCM_BASE 0x00000000 //ITCM 8K
#define __ITCM_SIZE 0x00003000
#define __DTCM_BASE 0x20000000 //DTCM 8K
#define __DTCM_SIZE 0x00003000
这里需要屏蔽掉RAM1,RAM2,防止内存与CPU0重叠。且RAM3的内存分配也对应错开,满足不重叠的条件。
3.在CPU1的工程内,通过预处理文件,生成BIN文件
通过该预处理,每次编译CPU1的工程,均可以生成CPU1的工程的BIN文件,自动存放到CPU0工程文件夹下的MDK文件下,命名为cpu1_image.bin
预处理命令为:fromelf.exe --output "..\..\cpu0\MDK\cpu1_image.bin" --bincombined "#L"
4.在CPU0的工程内,在SCT文件内定义CPU1的ROM内存分配,存放的代码为cpu1_code
#define __ROM1_BASE 0x00140000#define __ROM1_SIZE 0x00020000
LR_ROM_CPU1 __ROM1_BASE __ROM1_SIZE{
ER_ROM_CPU1 __ROM1_BASE __ROM1_SIZE{
.ANY (cpu1_code)
}
5.在CPU0的工程内,做如下定义
//
// This function includes the CPU1 image file
//
__attribute__((__used__, section("cpu1_code")))
void G32R501_incbin(void)
{
__asm(".incbin \"cpu1_image.bin\"");
}
同时在main函数中,定义cpu1内存地址以及长度
uint32_t cpu1_imageSize = 0;
uint32_t cpu1_imageStartAddr = 0;
//
// Get CPU1 boot address, and the size of the CPU1 image file
//
cpu1_imageSize = (uint32_t)&Image$$ER_ROM_CPU1$$Length;
cpu1_imageStartAddr = (uint32_t)&Image$$ER_ROM_CPU1$$Base;
这样,用户可以先编译cpu1的工程,再编译cpu0的工程,然后CPU0工程编译后的HEX文件,就同时包括了两个核的代码,这样就不需要烧录两次程序了。
6.在CPU0的工程内,mian()函数初始化时,boot启动CPU1,注意加一定的延时时间来确保CPU1启动完成。
//
// Boot CPU1
//
APP_bootCPU1(cpu1_imageStartAddr);
DELAY_US(200000);
|