2012-01-15 5 views
2

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

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 
} 

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

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

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

ответ

3

Просто разделить область RAM в двух:

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 

}