Как сделать пустой раздел с помощью GNU ld? - PullRequest
2 голосов
/ 15 января 2012

Я работаю над чипом cortex-m3.Пространство стека было зарезервировано в исходном коде с неинициализированным массивом в секции bss.Сценарий компоновщика, который я использовал, выглядит следующим образом:

MEMORY
{
    FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 256k
    SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64k
}

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

    .data : {
        __data_start = .;
        *(.data*)
        __data_end = .;
    } >SRAM AT>FLASH

    .bss : {
        __bss_start = .;
        *(.bss*)
        __bss_end = .;
    } >SRAM
}

Я пытаюсь выделить раздел для стека в начале области SRAM, чтобы я мог обнаружить переполнение стека при ошибке использования.

Я добавил раздел с именем .stack:

SECTIONS {
    .text : {
        :
    } >FLASH

    .stack : {
        __stack_size = 4k;
        __stack_start = .;
        . = . + __stack_size;
        . = ALIGN(8);         /* cortex-m3 uses full-descending stack aligned with 8 bytes */
        __stack_end = .;
    } >SRAM

    .data : {
        :
    } >SRAM AT>FLASH

    .bss : {
        :
    } >SRAM
}

Связывание выполняется без каких-либо ошибок или предупреждений, но проблема в том, что __stack_end находится не в области SRAM, а в области FLASH.

Я знаю, что могу использовать отдельный раздел, заданный с __attribute __ ((section ("name"))), но я думаю, что было бы лучше, если бы я мог справиться с этим в скрипте компоновщика.

Как можноСделать пустой раздел в области SRAM?

1 Ответ

3 голосов
/ 27 января 2012

Просто разделите область ОЗУ на две части:

MEMORY
{
    FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 256k
    SRAM_STACK (rwx) : ORIGIN = 0x20000000, LENGTH = 4k
    SRAM (rwx) : ORIGIN = 0x20001000, LENGTH = 60k
}
SECTIONS {
.text : {
    KEEP(*(.isr_vector))
    *(.text*)
    *(.rodata*)
    __text_end = .;
} >FLASH

.data : {
     __data_start = .;
    *(.data*)
    __data_end = .;
} >SRAM AT>FLASH

.bss : {
    __bss_start = .;
    *(.bss*)
    __bss_end = .;
} >SRAM

.stack : {
    __stack_size = 4k;
    __stack_start = .;
    . = . + __stack_size;
    . = ALIGN(8);         /* cortex-m3 uses full-descending stack aligned with 8 bytes */
    __stack_end = .;
} >SRAM_STACK

}
...