如何在启动阶段初始化my_data内存段?
启动阶段清零my_data内存段的实现方案
我在链接脚本中分配了my_data内存段用于存储共享变量,但启动后进行内存转储时发现该区域存在未知值。需要在启动阶段将该区域清零,请问是否需要编写汇编代码实现?
我的链接脚本
MEMORY { my_data : org = 0x52000000, len = 32k temp_data : org = 0x52008000, len = 32k } SECTIONS { .MydataRAM_noinit (ORIGIN(my_data)): ALIGN(16) { __MydataRAM_noinit_start__ = .; KEEP(*(.test1)) KEEP(*(.test2)) __MydataRAM_noinit_end__ = .; } > my_data __temp_data_start__ = ORIGIN(temp_data ); __temp_data_end__ = ORIGIN(temp_data ) + LENGTH(temp_data ); }
现有RAM初始化汇编代码
ALIGN(4) .globl _sysraminit .weak _sysraminit .type _sysraminit, _ASM_FUNCTION_ _sysraminit: mov r7, lr ldr r0, =get_cluster_id blx r0 cmp r0, 0 bne _exit_sysram /* exit if no cluster 0 */ ldr r0, =get_core_id blx r0 cmp r0, 0 bne _exit_sysram /* exit if no core 0 */ ldr r3, = __temp_data_end__ ldr r2, = __temp_data_start__ bl _clear_sysram _exit_sysram: bx r7 ALIGN(4) _clear_sysram: cmp r2, r3 bne 1f bx lr 1: mov r5, 0 mov r6, 0 2: strd r5, r6, [r2], 8 cmp r2, r3 bne 2b bx lr
解决方案
需要在启动汇编代码中添加对my_data段的清零逻辑,你可以复用现有的_clear_sysram函数,无需重新编写清零逻辑。具体修改步骤如下:
- 在
_sysraminit函数中,清理完temp_data后,添加清理my_data的代码,利用链接脚本中已定义的__MydataRAM_noinit_start__和__MydataRAM_noinit_end__符号指定内存范围。
修改后的_sysraminit函数如下:
ALIGN(4) .globl _sysraminit .weak _sysraminit .type _sysraminit, _ASM_FUNCTION_ _sysraminit: mov r7, lr ldr r0, =get_cluster_id blx r0 cmp r0, 0 bne _exit_sysram /* exit if no cluster 0 */ ldr r0, =get_core_id blx r0 cmp r0, 0 bne _exit_sysram /* exit if no core 0 */ ; 清理temp_data区域 ldr r3, = __temp_data_end__ ldr r2, = __temp_data_start__ bl _clear_sysram ; 新增:清理my_data区域 ldr r3, = __MydataRAM_noinit_end__ ldr r2, = __MydataRAM_noinit_start__ bl _clear_sysram _exit_sysram: bx r7
说明
- 现有
_clear_sysram函数是通用的内存清零逻辑,只要传入起始地址(r2)和结束地址(r3),就能完成对应区域的清零操作,无需额外编写新的清零代码。 - 保留了原有的集群0和核心0判断,确保只有主核心执行内存清零操作,避免多核心同时操作共享内存区域引发的竞争问题。
内容的提问来源于stack exchange,提问作者user2986042
相关产品推荐
相关产品推荐

