我可以轻松地将一些代码RO部分放在特定地址(可能是RAM地址)的特定执行区域。由于正确的链接,我的程序完整性没有问题。 问题是放在RAM地址的那些RO部分在断电/上电后不会出现在RAM上。他们将失踪。我对吗? 当然我可以使用bootloader将它们加载到位,但现在情况并非如此。 我的问题是:有没有可靠的默认方法来解决这个问题?也许有些属性等。例如,有可能在C库启动时复制RO部分(如RW)?
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka11494.html 正如这篇文章所暗示的,这是不正确的。正如我之前提到的,重启后RAM不会包含任何RO数据。
答案 0 :(得分:2)
在具有.data区域的嵌入式系统中,您已经遇到此问题。 .bss只是在引导程序中被归零,但是.data需要在非易失性存储中,所以当你启动时它就在那里,但它需要在ram中存在。典型的解决方案是在链接器脚本中将其标记为我通常从ram运行但希望存储在rom中的二进制文件中。
使用gnu工具你可以做些什么事情
MEMORY
{
bob : ORIGIN = 0x8000, LENGTH = 0x1000
ted : ORIGIN = 0xA000, LENGTH = 0x1000
}
SECTIONS
{
.text : { *(.text*) } > bob
__data_rom_start__ = .;
.data : {
__data_start__ = .;
*(.data*)
} > ted AT > bob
__data_end__ = .;
__data_size__ = __data_end__ - __data_start__;
.bss : {
__bss_start__ = .;
*(.bss*)
} > bob
__bss_end__ = .;
__bss_size__ = __bss_end__ - __bss_start__;
}
链接器脚本或其他控制链接器的方式非常特定于工具链,我不会自动期望武器工具使用与gnus工具或其他工具相同的解决方案。他们可能会让我们其他人保持理智,但这不是标准机构所管理的事情。
然后你必须将你的引导代码与链接器脚本方案相匹配并复制数据。
如果您想要移动的代码部分而不仅仅是数据或代替数据,您将使用完全相同的方案,添加链接器脚本的东西以标记该代码blob在运行时希望生活在此但希望生存在二进制图像中。并且你的引导程序或一些代码必须在程序使用之前将程序的那一部分复制到ram中。
答案 1 :(得分:2)
(以及其他任务)C运行时启动代码(在执行main()
之前运行)的责任是将RAM可执行代码从ROM映像复制到RAM。在某些情况下,可以压缩ROM映像,以便启动代码也必须执行解压缩。
您的工具链可能已经提供了合适的启动代码,或者您可能必须修改现有的运行时启动代码才能支持此功能。