了解加载应用程序后启动脚本如何将.data节从FLASH复制到SRAM

问题描述

我有一个经过测试和运行的非常简单的ARM 32位应用程序。我试图了解startup.c如何将.data初始化值从FLASH复制到SRAM。为此,我已经阅读了这篇文章Does the C startup code change addresses of data,但是在查看源文件时,我仍然不了解某些内容

所以,我有以下文件

链接描述文件

SECTIONS
{
    .text :
    {   
        _text = .;
        KEEP(*(.isr_vector))
        *(.text*)
        *(.rodata*)
        _etext = .;
    } > FLASH

    .data : AT(ADDR(.text) + SIZEOF(.text))
    {   
        _data = .;
        *(vtable)
        *(.data*)
        _edata = .;
    } > SRAM
...
...
}

startup.c

void
ResetISR(void)
{
    uint32_t *pui32Src,*pui32Dest;

    //  
    // copy the data segment initializers from flash to SRAM.
    //  
    pui32Src = &_etext;
    for(pui32Dest = &_data; pui32Dest < &_edata; )
    {   
        *pui32Dest++ = *pui32Src++;
    }   

    ...
    ...

    //
    // Call the application's entry point.
    //
    main();
}

我不了解的是链接器符号实际指向的位置,让我解释一下:

启动脚本使用_etext作为源指针,使用_data作为目标指针。我的理解是,由于_etext部分中的> FLASH.text指向FLASH中的某个位置,而_data_edata包含SRAM地址是因为> SRAM部分定义中使用的.data这正确吗?

但是,.data部分定义为 AT(ADDR(.text) + SIZEOF(.text))。因此,_data实际上指向与_etext相同的地方吗?如果是这样,启动脚本会将值从某个地址复制到同一地址吗?

我怀疑.data可能是由于.text而在: AT(ADDR(...) + ..)之后,而符号_data_edata则指向SRAM是因为> SRAM结尾的.data我错了吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)