如何在启动时初始化内存部分?

问题描述 投票:0回答:1

我在链接器文件中分配了一个内存部分

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
吗?请帮忙。

assembly linker arm ram linker-scripts
1个回答
0
投票

你的问题里已经有答案了。

__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   

我认为你的问题有一些无关的空格。

© www.soinside.com 2019 - 2024. All rights reserved.