I am developing with SW4STM32 since its very first release.
Now I am working with OpenSTM32 IDE v2.4.0 and ARM Compiler for MCU v1.15.0 on a STM32F401 mcu with 256K flash and 64K ram.
For a bootloader purpose, my application has to be relocated at 0x08010000. So, I use my attached modified linker script, where I re-define the available memory areas for my application:
/* Specify the memory areas */
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
FLASH (rx) : ORIGIN = 0x08010000, LENGTH = 192K /* with bootloader */
Because I use FreeRTOS heap4 heap handler, I add my HEAP4 heap section to the default .user_heap_stack section:
/* Generate a link error if heap and stack don’t fit into RAM */
_Min_Heap_Size = 0x0; /* required amount of heap */
_Min_Stack_Size = 0x400; /* required amount of stack */
/* User_heap_stack section, used to check that there is enough RAM left */
. = ALIGN(8);
*(HEAP4) /* FreeRTOS heap4 */
PROVIDE ( end = . );
PROVIDE ( _end = . );
. = . + _Min_Heap_Size;
. = . + _Min_Stack_Size;
. = ALIGN(8);
I know my application size is about 0x273E8 bytes: I know this, because I have a different build configuration where the application start is the default address 0x08000000.
Compiling my application with the attached linker script I get the linker error:
section `._user_heap_stack’ will not fit in region `FLASH’
region `FLASH’ overflowed by 5096 bytes
Why .user_heap_stack section is considered to belong to the FLASH area, when in the linker script is specified to belong to RAM area?
Looking to the attached linker map output file, I see the following lines:
0x20001910 0xa000 load address 0x080373e8
0x20001910 . = ALIGN (0x8)
HEAP4 0x20001910 0x9c00 Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o
!provide PROVIDE (end, .)
!provide PROVIDE (_end, .)
0x2000b510 . = (. + _Min_Heap_Size)
0x2000b910 . = (. + _Min_Stack_Size)
*fill* 0x2000b510 0x400
0x2000b910 . = ALIGN (0x8)
So it looks like:
- the FLASH location counter (load address, LMA) comes to the 0x080373e8 value;
- the ._user_heap_stack section starts at 0x20001910 (RAM) and its size is 0xA000 bytes.
- for the sections in RAM the linker seems to consider the same location counter for FLASH: in fact, 0x080373e8 + 0xA000 = 0x080413E8 and so the region `FLASH’ is overflowed by 5096 (0x13E8) bytes.
How should I tell to the linker to consider a different location counter for all the sections in RAM?
This is a critical issue for my application development. Could you please help me to fix it?