问题描述
我有一个经过测试和运行的非常简单的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 (将#修改为@)