从RAM ARM Cortex M4执行

时间:2018-04-19 01:54:05

标签: c assembly linker arm bootloader

我真的很困惑分散文件和在RAM中执行所需的步骤(对于引导加载程序)。

根据我的理解,startup.S文件和sysinit需要从Flash执行,在此期间,向量表需要在跳转到main之前复制到RAM吗?

我也不太了解散点文件的用途,如果我在跳转之前将向量和代码复制到ram,为什么我甚至需要它。

这是我错误的分散文件:

LR_IROM1 0x14000000 0x00400000  {    ; load region size_region
  ER_IROM1 0x14000000 0x00400000  {  ; load address = execution address
    startup.o (RESET, +FIRST)
     * (InRoot$$Sections)
  }
  RW_IRAM1 0x10000000 0x00020000  {  ; RW data
    *.o
  }
  RW_IRAM2 0x20000000 0x00010000 {
    * (+RO,+RW,+ZI)
  }
}

1 个答案:

答案 0 :(得分:1)

基于引导加载程序ram的链接描述文件的一种解决方案。假设您正在使用gnu链接器。这样做的方法不止一种。

MEMORY
{
    ram : ORIGIN = 0x20000000, LENGTH = 0x2000
}
SECTIONS
{
    .text : { *(.text*) } > ram
    .rodata : { *(.rodata*) } > ram
    .bss : { *(.bss*) } > ram
    .data : { *(.data*) } > ram
}

如果您的代码需要将.bss归零,您可以向链接描述文件添加更多代码,并为引导程序添加更多代码,但如果您使用上述内容并且保证至少有一个字节,gnu将为您执行此操作。某处的数据(当对二进制文件执行objcopy时,它将使用零填充.bss以获取正确相对位置的.data项目)。你选择如何解决这个问题。如果你不需要.bss归零,那么交换.data和.bss会使二进制文件更小。你要么在非常有效的循环中复制零,要么在链接器脚本中处理对齐时,在可能有效的循环中写入零。

如果它只需要像这样的东西

,那么复制和跳转方面
MEMORY
{
    rom : ORIGIN = 0x00000000, LENGTH = 0x2000
}
SECTIONS
{
    .text : { *(.text*) } > rom
    .rodata : { *(.rodata*) } > rom
}

最坏的情况(对于简单的程序集复制和跳转),也许可以摆脱.rodata行

以上是针对gnu ld假设你正在使用的,请注意内存名称没有意义,你可以这样做:

MEMORY
{
    bob : ORIGIN = 0x00000000, LENGTH = 0x2000
}
SECTIONS
{
    .text : { *(.text*) } > bob
    .rodata : { *(.rodata*) } > bob
}

MEMORY
{
    joe : ORIGIN = 0x00000000, LENGTH = 0x2000
}
SECTIONS
{
    .text : { *(.text*) } > joe
    .rodata : { *(.rodata*) } > joe
}

MEMORY
{
    pizza : ORIGIN = 0x00000000, LENGTH = 0x2000
}
SECTIONS
{
    .text : { *(.text*) } > pizza
    .rodata : { *(.rodata*) } > pizza
}

MEMORY
{
    thehut : ORIGIN = 0x08000000, LENGTH = 0x2000
    pizza : ORIGIN = 0x20000000, LENGTH = 0x2000
}
SECTIONS
{
    .text : { *(.text*) } > thehut
    .rodata : { *(.rodata*) } > thehut
    .bss : { *(.bss*) } > pizza
    .data : { *(.data*) } > pizza AT > thehut
}

你可以使用gnu ld攻击MEMORY或SECTIONS方面的内容。如果你觉得需要两个.texts或两个.datas两个.bss等(一个用于bootloader的复制/跳转部分,一个用于bootloader本身,并且有一个链接器脚本和所有bootloader的链接)你可以做那件事或采取你正在采取的方法。但是除了每个与链接器脚本密切相关的引导程序之外,还必须使用工具链特定的解决方案,使ram上的引导加载程序适合于正确的.text / .bss等,或者将它们覆盖到其他一些(。 my_bl_text ...)或在链接描述文件或其他解决方案中调用目标文件名。不幸的是,gnu链接器脚本语言具有许多功能,同时,假设您已经了解该语言,则文档更多地是一个参考。很难看出编写精心设计的链接描述文件的人如何从现有的gnu文档中找出,然后尝试编写第一个或修改别人的文件。我推荐两个程序ram程序和包含ram程序作为数据的复制跳转程序。