Stack and Heap

Sysprogs forums Forums VisualGDB Stack and Heap

Viewing 3 posts - 1 through 3 (of 3 total)
  • Author
    Posts
  • #823
    darksilence
    Participant

    Hello!
    I started to use VisualGDB and I don’t understand how to define stack and heap pointers and their sizes.

    In linker script file I found only this:
    _estack = 0x2001c000;I think it’s the address of stack, but where should I define stack size?

    #3172
    support
    Keymaster

    The GCC compiler does not have a concept of “stack size”. It uses all space between the end of data and _estack as the stack. If you want to reserve a certain amount for the stack, you can define an array of that size, put it to a separate section and modify the linker script to place it after the data. In that case if the overall amount of used memory exceeds the device SRAM size, you will get a linker error.

    #3173
    darksilence
    Participant

    ya.. thanks, I found linkerScript in STM site

    
    /* Generated by LinkerScriptGenerator [http://visualgdb.com/tools/LinkerScriptGenerator]
    * Target: STM32F405xG
    * The file is provided under the BSD license.
    * FLASH (RX)        : ORIGIN = 0x08000000, LENGTH = 1M 0x8020000
    */
    
    ENTRY(Reset_Handler)
    
    /* Highest address of the user mode stack */
    _estack = 0x2001FFFF;    /* end of RAM */
    
    /* Generate a link error if heap and stack don't fit into RAM */
    _Min_Heap_Size = 0x100;      /* required amount of heap  */
    _Min_Stack_Size = 0x400; /* required amount of stack */
    
    MEMORY
    {
    FLASH (RX)        : ORIGIN = 0x8020000, LENGTH = 896K
    SRAM (RWX)        : ORIGIN = 0x20000000, LENGTH = 128K
    SRAM2 (RWX)       : ORIGIN = 0x10000000, LENGTH = 64K
    BACKUP_SRAM (RWX) : ORIGIN = 0x40024000, LENGTH = 4K
    }
    
    /* Define output sections */
    SECTIONS
    {
    /* The startup code goes first into FLASH */
    .isr_vector :
    {
    . = ALIGN(4);
    KEEP(*(.isr_vector)) /* Startup code */
    . = ALIGN(4);
    } >FLASH

    /* The program code and other data goes into FLASH */
    .text :
    {
    . = ALIGN(4);
    *(.text) /* .text sections (code) */
    *(.text*) /* .text* sections (code) */
    *(.glue_7) /* glue arm to thumb code */
    *(.glue_7t) /* glue thumb to arm code */
    *(.eh_frame)

    KEEP (*(.init))
    KEEP (*(.fini))

    . = ALIGN(4);
    _etext = .; /* define a global symbols at end of code */
    } >FLASH

    /* Constant data goes into FLASH */
    .rodata :
    {
    . = ALIGN(4);
    *(.rodata) /* .rodata sections (constants, strings, etc.) */
    *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
    . = ALIGN(4);
    } >FLASH

    .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
    .ARM : {
    __exidx_start = .;
    *(.ARM.exidx*)
    __exidx_end = .;
    } >FLASH

    .preinit_array :
    {
    PROVIDE_HIDDEN (__preinit_array_start = .);
    KEEP (*(.preinit_array*))
    PROVIDE_HIDDEN (__preinit_array_end = .);
    } >FLASH
    .init_array :
    {
    PROVIDE_HIDDEN (__init_array_start = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array*))
    PROVIDE_HIDDEN (__init_array_end = .);
    } >FLASH
    .fini_array :
    {
    PROVIDE_HIDDEN (__fini_array_start = .);
    KEEP (*(SORT(.fini_array.*)))
    KEEP (*(.fini_array*))
    PROVIDE_HIDDEN (__fini_array_end = .);
    } >FLASH


    /* CCM-RAM section
    _siccmram = LOADADDR(.ccmram);
    *
    * IMPORTANT NOTE!
    * If initialized variables will be placed in this section,
    * the startup code needs to be modified to copy the init-values.
    */
    .ccmram (NOLOAD):
    {
    . = ALIGN(4);
    _sccmram = .; /* create a global symbol at ccmram start */
    *(.ccmram)
    *(.ccmram*)

    . = ALIGN(4);
    _eccmram = .; /* create a global symbol at ccmram end */
    } >SRAM2

    /* used by the startup to initialize data */
    _sidata = LOADADDR(.data);

    /* Initialized data sections goes into RAM, load LMA copy after code */
    .data :
    {
    . = ALIGN(4);
    _sdata = .; /* create a global symbol at data start */
    *(.data) /* .data sections */
    *(.data*) /* .data* sections */

    . = ALIGN(4);
    _edata = .; /* define a global symbol at data end */
    } >SRAM AT> FLASH


    /* Uninitialized data section */
    . = ALIGN(4);
    .bss (NOLOAD):
    {
    /* This is used by the startup in order to initialize the .bss secion */
    _sbss = .; /* define a global symbol at bss start */
    __bss_start__ = _sbss;
    *(.bss)
    *(.bss*)
    *(COMMON)

    . = ALIGN(4);
    _ebss = .; /* define a global symbol at bss end */
    __bss_end__ = _ebss;
    } >SRAM

    /* User_heap_stack section, used to check that there is enough RAM left */
    ._user_heap_stack :
    {
    . = ALIGN(4);
    PROVIDE ( end = . );
    PROVIDE ( _end = . );
    . = . + _Min_Heap_Size;
    . = . + _Min_Stack_Size;
    . = ALIGN(4);
    } >SRAM



    /* Remove information from the standard libraries */
    /DISCARD/ :
    {
    libc.a ( * )
    libm.a ( * )
    libgcc.a ( * )
    }

    .ARM.attributes 0 : { *(.ARM.attributes) }
    }
Viewing 3 posts - 1 through 3 (of 3 total)
  • You must be logged in to reply to this topic.