2017-04-26 47 views
0

我已经通过编译使用Keil实例项目生成* .o文件的具体地址ELF文件,然后我编辑过我想要的默认0x08000000代替地址* SCT文件并生成* .elf在指定载荷并执行地址。生成与

我已装入* .elf文件到闪存和它的工作。它是在指定的地址下载的,但是当我检查内存时,我发现数据已经改变,这是因为我没有触及* .o文件,每次只调用链接器。

我的问题是,为什么用同样的*的.o,只是通过改变地址,我的数据也会受到影响?

回答

1

对于大多数嵌入式平台,您必须遵循一些规则。

  1. 重置处理程序和向量表必须位于由硬件指定的定义位置。

  2. 你不能有复位启动区域不同的加载和执行地址区域(LR/ER)。链接器插入一个脚本,该脚本将数据从加载区复制到执行区,如果它们不重叠的话。如下面的区域RW_IRAM1。由于在正常情况下无法写入闪存,因此失败。

  3. ,如果它没有被编译进是独立的存储位置,则无法编译后更改的内存区域。代码可能包含绝对跳转。
    例如:跳转到0x0800400为foo()。或者为char x读取0x0802FFE。

有效分散文件的示例。

LR_IROM1 0x08000000 0x00100000 { ; load region size_region 
    ER_IROM1 0x08000000 0x00001000 { ; load address = execution address 
    *.o (RESET, +First) ; boot code 
    *(InRoot$$Sections) ; linker loader parts, initializes RW_IRAM1 
    .ANY (+RO)   ; your code 
    } 
    RW_IRAM1 0x20000000 0x00020000 { ; RW data 
    .ANY (+RW +ZI) 
    } 
} 

您可以为外部存储器添加额外的加载区域(LR)。如果loader application设置了界面。
您可以添加额外的区域,用于诸如非易失性内存仿真之类的内容。在编程期间预先加载或跳过它。

在这里你可以找到一切为了the linker。其中有一段分散加载。

+0

谢谢,所以我需要检查是否有可能使编译成为内存位置独立? – erfaheel

+0

是的,但请记住,您必须在内存的前几个单词上添加内容,以告诉硬件从何处开始。 – Jeroen3

+0

好的,谢谢。 – erfaheel