我已经通过编译使用Keil实例项目生成* .o文件的具体地址ELF文件,然后我编辑过我想要的默认0x08000000
代替地址* SCT文件并生成* .elf在指定载荷并执行地址。生成与
我已装入* .elf文件到闪存和它的工作。它是在指定的地址下载的,但是当我检查内存时,我发现数据已经改变,这是因为我没有触及* .o文件,每次只调用链接器。
我的问题是,为什么用同样的*的.o,只是通过改变地址,我的数据也会受到影响?
我已经通过编译使用Keil实例项目生成* .o文件的具体地址ELF文件,然后我编辑过我想要的默认0x08000000
代替地址* SCT文件并生成* .elf在指定载荷并执行地址。生成与
我已装入* .elf文件到闪存和它的工作。它是在指定的地址下载的,但是当我检查内存时,我发现数据已经改变,这是因为我没有触及* .o文件,每次只调用链接器。
我的问题是,为什么用同样的*的.o,只是通过改变地址,我的数据也会受到影响?
对于大多数嵌入式平台,您必须遵循一些规则。
重置处理程序和向量表必须位于由硬件指定的定义位置。
你不能有复位启动区域不同的加载和执行地址区域(LR/ER)。链接器插入一个脚本,该脚本将数据从加载区复制到执行区,如果它们不重叠的话。如下面的区域RW_IRAM1。由于在正常情况下无法写入闪存,因此失败。
,如果它没有被编译进是独立的存储位置,则无法编译后更改的内存区域。代码可能包含绝对跳转。
例如:跳转到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。其中有一段分散加载。
谢谢,所以我需要检查是否有可能使编译成为内存位置独立? – erfaheel
是的,但请记住,您必须在内存的前几个单词上添加内容,以告诉硬件从何处开始。 – Jeroen3
好的,谢谢。 – erfaheel