AnsweredAssumed Answered

s32k1xx_linker script

Question asked by Jongtae Park on Apr 9, 2018
Latest reply on Apr 9, 2018 by Jiri Kral

Hello,

 

I'm using s32studio ARM v.2.0 and s32k144 EVB.

 

there is one thing that I don't understand in s32k1xx_flash.ld from SDK.

 

as you can see below, .stack segment is located next to .heap not in the end of m_data_2.

[        m_data_2                       ]

[bss][heap][stack]

 

however, __StackTop is set to the end address of m_data_2 as depicted in the below.

[        m_data_2                       ]

[bss][heap][stack]                    ^

                                                |---- __StackTop

 

I believe it should be like the below.

[        m_data_2                       ]

[bss][heap][stack]                   

                           |---- __StackTop

 

Plus, stack limit indicates the wrong position according to the linker script from SDK.

  [        m_data_2                       ]

  [bss][heap][stack]          [--1K--]         

                             ^         |----  stack limit position.

  should be here --|

 

Did I understand incorrectly?

 

s32k1xx_flash.ld

/* Specify the memory areas */
MEMORY
{
/* Flash */
m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000400
m_flash_config (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000010
m_text (RX) : ORIGIN = 0x00000410, LENGTH = 0x0007FBF0

/* SRAM_L */
m_data (RW) : ORIGIN = 0x1FFF8000, LENGTH = 0x00008000

/* SRAM_U */
m_data_2 (RW) : ORIGIN = 0x20000000, LENGTH = 0x00007000
}

 

.customSectionBlock ORIGIN(m_data_2) :
{
KEEP(*(.customSection)) /* Keep section even if not referenced. */
} > m_data_2

/* Uninitialized data section. */
.bss :
{
/* This is used by the startup in order to initialize the .bss section. */
. = ALIGN(4);
__BSS_START = .;
__bss_start__ = .;
*(.bss)
*(.bss*)
*(COMMON)
. = ALIGN(4);
__bss_end__ = .;
__BSS_END = .;
} > m_data_2

.heap :
{
. = ALIGN(8);
__end__ = .;
PROVIDE(end = .);
PROVIDE(_end = .);
PROVIDE(__end = .);
__HeapBase = .;
. += HEAP_SIZE;
__HeapLimit = .;
__heap_limit = .;
} > m_data_2

.stack :
{
. = ALIGN(8);
. += STACK_SIZE;
} > m_data_2

/* Initializes stack on the end of block */
__StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2);
__StackLimit = __StackTop - STACK_SIZE;
PROVIDE(__stack = __StackTop);

.ARM.attributes 0 : { *(.ARM.attributes) }

 

 

Startup_S32k144.S

/* Initialize the stack pointer */
ldr r0,=__StackTop
mov r13,r0

Outcomes