打印
[G32A]

R501-双核MCU调试经验分享1-双核工程创建指导

[复制链接]
96|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zyz0926|  楼主 | 2025-2-24 08:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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);


使用特权

评论回复
沙发
电竞孔乙己| | 2025-2-24 11:50 | 只看该作者
这个运行起来没问题吗

使用特权

评论回复
板凳
zyz0926|  楼主 | 2025-2-24 14:38 | 只看该作者
没有问题的,已经装在六轴机械手上运行了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

8

帖子

0

粉丝