Pergunta

Estou trabalhando em um chip cortex-m3.O espaço de pilha foi reservado no código-fonte com uma matriz não inicializada na seção bss.O script do vinculador que usei é o seguinte:

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
}

Estou tentando alocar uma seção para a pilha no início da região SRAM para que eu possa detectar o estouro da pilha com falha de uso.

Eu adicionei uma seção chamada .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
}

A vinculação é feita sem nenhum erro ou aviso, mas o problema é que __stack_end não está na região SRAM, mas na região FLASH.

Sei que posso usar uma seção separada fornecida com __attribute __ ((section ("name"))), mas acho que seria melhor se eu pudesse lidar com isso no script do vinculador.

Como posso criar uma seção vazia na região SRAM?

Foi útil?

Solução

Basta dividir a área de RAM em duas:

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

}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top