将嵌入式程序拆分为内存中的多个部分

Che*_*ron 5 embedded linker linker-scripts

我正在开发一个嵌入式系统(Stellaris Launchpad)并编写一个简单的操作系统(作为一个爱好项目)。使用的工具链是 gcc-none-eabi。

我的下一步是习惯 MPU 以允许内核阻止用户程序更改特定数据。我有一堆 C 文件,我把它们分成两部分:内核和其他。我有以下链接器脚本可以开始:

MEMORY
{
    FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000
    SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000
}

SECTIONS
{
    .text :
    {
        _text = .;
        KEEP(*(.isr_vector))
        *(.text*)
        *(.rodata*)
        _etext = .;
    } > FLASH

    .data : /*AT(ADDR(.text) + SIZEOF(.text))*/ /*contains initialized data*/
    {
        _data = .;
        *(vtable)
        *(.data*)
        _edata = .;
    } > SRAM AT > FLASH

    .bss : AT (ADDR(.data) + SIZEOF(.data)) /*contains unitialized data (should be set to all zero's)*/
    {
        _bss = .;
        *(.bss*)
        *(COMMON)
        _ebss = .;
        _start_heap = .;
    } > SRAM

    _stack_top = ORIGIN(SRAM) + LENGTH(SRAM) - 1; /*The starting point of the stack, at the very bottom of the RAM*/
Run Code Online (Sandbox Code Playgroud)

}

在阅读了链接器脚本之后,我知道我可以用文件名替换星号,从而开始将闪存分成多个部分。例如,我会创建一个 .kernel.bss 部分并将所有内核对象文件而不是星号放在该部分中。我剩下的唯一问题是内核不是一个文件,而是一大堆文件。并且可能会添加、删除文件等。那么我该怎么做呢?如何更改我的链接描述文件,以便将动态的第一组文件映射到第一位,并将动态的第二组文件映射到第二位?

小智 5

您知道可以指定将哪些文件用作某个部分的输入吗?我们使用它来将内核和应用程序代码分成快速的内部闪存和较慢的外部闪存,如下所示:

.kernel_text :
{
     build/kernel/*.o (.text*) /*text section from files in build/kernel*/
} > INT_FLASH

.app_text:
{
    build/app/*.o(.text*)
} > EXT_FLASH
Run Code Online (Sandbox Code Playgroud)

第 4.6.4 节可能会有所帮助,(更详细地描述输入部分) https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/4/html/Using_ld_the_GNU_Linker/sections.html