本帖最后由 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。
[C] 纯文本查看 复制代码 /* 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的代码 [Asm] 纯文本查看 复制代码 ldr r0, =_sram_d1
ldr r1, =_eram_d1
ldr r2, =_siram_d1_data
movs r3, #0
b LoopCopyRAMD1DataInit
CopyRAMD1DataInit:
ldr r4, [r2, r3]
str r4, [r0, r3]
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文件代码就能实现这个功能
|