Linker ARM从嵌入式RAM执行代码

Linker ARM从嵌入式RAM执行代码,linker,arm,embedded,ram,execute,Linker,Arm,Embedded,Ram,Execute,我可以很容易地将一些代码RO部分放在特定地址(可能是RAM地址)的特定执行区域。由于链接正确,我的程序完整性不会有问题。 问题在于,在断电/通电后,位于RAM地址的RO部分不会出现在RAM上。他们会失踪的。我说得对吗? 当然,我可以用bootloader将它们加载到位,但现在不是这样。 我的问题是:有没有可信的默认方法来解决这个问题?可能是一些属性等。例如,可能有一种方法可以通过C库在启动时复制RO部分(如RW) 正如这篇文章所暗示的,这是不正确的。正如我前面提到的,重新启动后RAM将不包含任

我可以很容易地将一些代码RO部分放在特定地址(可能是RAM地址)的特定执行区域。由于链接正确,我的程序完整性不会有问题。 问题在于,在断电/通电后,位于RAM地址的RO部分不会出现在RAM上。他们会失踪的。我说得对吗? 当然,我可以用bootloader将它们加载到位,但现在不是这样。 我的问题是:有没有可信的默认方法来解决这个问题?可能是一些属性等。例如,可能有一种方法可以通过C库在启动时复制RO部分(如RW)


正如这篇文章所暗示的,这是不正确的。正如我前面提到的,重新启动后RAM将不包含任何RO数据。

在带有.data区域的嵌入式系统中,您已经遇到了这个问题。bss只是在引导过程中被归零,但是。数据需要在非易失性存储器中,所以当你通电时它就在那里,但它需要存在于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__;
}
链接器脚本或其他控制链接器的方法对于工具链来说非常特殊,我不会自动期望arms工具使用与gnus工具或其他工具相同的解决方案。他们可能会让我们其他人保持理智,但这不是标准机构管理的事情

然后,您必须将引导代码与链接器脚本方案相匹配,并复制数据


如果您有要移动的代码段,而不仅仅是数据或数据,您将使用完全相同的方案,请添加链接器脚本内容,以将该代码块标记为希望在运行时留在此处,但希望在二进制映像中留在此处。您的引导程序或某些代码在使用前必须将该部分程序复制到ram。

在带有.data区域的嵌入式系统中,您已经遇到了这个问题。bss只是在引导过程中被归零,但是。数据需要在非易失性存储器中,所以当你通电时它就在那里,但它需要存在于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__;
}
链接器脚本或其他控制链接器的方法对于工具链来说非常特殊,我不会自动期望arms工具使用与gnus工具或其他工具相同的解决方案。他们可能会让我们其他人保持理智,但这不是标准机构管理的事情

然后,您必须将引导代码与链接器脚本方案相匹配,并复制数据

如果您有要移动的代码段,而不仅仅是数据或数据,您将使用完全相同的方案,请添加链接器脚本内容,以将该代码块标记为希望在运行时留在此处,但希望在二进制映像中留在此处。在使用之前,引导程序或某些代码必须将该部分程序复制到ram。

C运行时启动代码(在执行
main()
之前运行的启动代码)负责将ram可执行代码从ROM映像复制到ram。在某些情况下,ROM映像可能会被压缩,因此启动代码也必须执行解压缩

您的工具链可能已经提供了合适的启动代码,或者您可能必须修改现有的运行时启动代码以支持这一点。

C运行时启动代码(在执行
main()
之前运行的代码)负责将RAM可执行代码从ROM映像复制到RAM。在某些情况下,ROM映像可能会被压缩,因此启动代码也必须执行解压缩

您的工具链可能已经提供了合适的启动代码,或者您可能必须修改现有的运行时启动代码以支持此功能