Florence 发表于 2024-2-29 19:41:31

STM32CubeIDE实现在不同的RAM区域定义有初始值的全局变量(RW-data)

本帖最后由 Florence 于 2024-2-29 22:08 编辑

使用安富莱V7开发板,主RAM使用内核直连的DCTRAM。这里在RAM_D1里定义RW-data举例,


第一步:主RAM修改为DTCRAM。
cubemx生成的ld文件默认主RAM为RAM_D1,在xxxx_FLASH.ld文件中把RAM_D1修改为DTCRAM

第二步在xxxx_FLASH.ld文件中,添加RAM_D1的Section。


    /* used by the startup to initialize data */
_siram_d1_data = LOADADDR(.ram_d1_data);

    /* Initialized data sections goes into RAM, load LMA copy after code */
.ram_d1_data :
{
    . = ALIGN(4);
    _sram_d1 = .;       /* create a global symbol at ram_d1 start */
    *(.ram_d1_data)
    *(.ram_d1_data*)      

    . = ALIGN(4);
    _eram_d1 = .;       /* create a global symbol at ram_d1 end */

} >RAM_D1 AT> FLASH
第三步在startup_xxxx.s中添加拷贝RW-data的代码ldr r0, =_sram_d1
ldr r1, =_eram_d1
ldr r2, =_siram_d1_data
movs r3, #0
b LoopCopyRAMD1DataInit

CopyRAMD1DataInit:
ldr r4,
str r4,
adds r3, r3, #4

LoopCopyRAMD1DataInit:
adds r4, r0, r3
cmp r4, r1
bcc CopyRAMD1DataInit
第四步在main函数中定义在RAM_D1中的变量使用__attribute__((section(".ram_d1_data")))定义变量并给定一个初始值


第五步编译仿真调试可以看到赋值成功

总结优点:无需担心变量初值不确定的情况,也不用在项目代码上增加初始化的部分缺点:ZIdata也会占用FLASH空间,如有需要得额外增加ZIdata的section来管理
一顿折腾下来感觉还是MDK的编译工具链好用啊,直接自动识别变量是RW还是ZO,简短的SCT文件代码就能实现这个功能

Florence 发表于 2024-2-29 19:48:48

论坛图片好像加载不出来,我把文件贴上来吧

eric2013 发表于 2024-3-1 09:01:54

谢谢楼主分享。
页: [1]
查看完整版本: STM32CubeIDE实现在不同的RAM区域定义有初始值的全局变量(RW-data)