我在链接器文件中分配了一个内存部分
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
assembly
文件中,我们已经清除了 tem_data
,如下所示。
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
我想知道如何在
startup
期间将此区域初始化为零。我们需要写任何assembly code
来清除my_data
吗?请帮忙。
你的问题里已经有答案了。
__temp_data_start__ = ORIGIN(temp_data);
__temp_data_end__ = ORIGIN(temp_data) + LENGTH(temp_data);
只需将
temp_data
替换为 MydataRAM_noinit
。 不要在部分中定义它,因为这些值是相对于部分的。 节外定义的值是绝对的。 最后一部分是调用两次clear。
ldr r3, = __temp_data_end__
ldr r2, = __temp_data_start__
bl _clear_sysram
ldr r3, = __MydataRAM_noinit_end__ # new code.
ldr r2, = __MydataRAM_noinit_start__
bl _clear_sysram
我认为你的问题有一些无关的空格。