diff options
Diffstat (limited to 'boards/base/STM32F469i-Discovery/CubeHAL/STM32_FLASH.ld')
-rw-r--r-- | boards/base/STM32F469i-Discovery/CubeHAL/STM32_FLASH.ld | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/boards/base/STM32F469i-Discovery/CubeHAL/STM32_FLASH.ld b/boards/base/STM32F469i-Discovery/CubeHAL/STM32_FLASH.ld new file mode 100644 index 00000000..8cdd7c0e --- /dev/null +++ b/boards/base/STM32F469i-Discovery/CubeHAL/STM32_FLASH.ld @@ -0,0 +1,186 @@ +/* + * GCC linker script for STM32 microcontrollers (ARM Cortex-M). + * + * It exports the symbols needed for the CMSIS assembler startup script for GCC + * ARM toolchains (_sidata, _sdata, _edata, _sbss, _ebss) and sets the entry + * point to Reset_Handler. + * + * Adapt FLASH/RAM size for your particular device below. + * + * @author Bjørn Forsman + */ + +MEMORY +{ + flash (rx) : ORIGIN = 0x08000000, LENGTH = 320K + ccmram (rw) : ORIGIN = 0x10000000, LENGTH = 64k + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 2048K +} + +ENTRY(Reset_Handler) + +/* + * Reserve memory for heap and stack. The linker will issue an error if there + * is not enough memory. + * + * NOTE: The reserved heap and stack will be added to the bss column of the + * binutils size command. + */ +_heap_size = 0x200; /* required amount of heap */ +_stack_size = 0x400; /* required amount of stack */ + +/* + * The stack starts at the end of RAM and grows downwards. Full-descending + * stack; decrement first, then store. + */ +_estack = ORIGIN(ram) + LENGTH(ram); + +SECTIONS +{ + /* Reset and ISR vectors */ + .isr_vector : + { + __isr_vector_start__ = .; + KEEP(*(.isr_vector)) /* without 'KEEP' the garbage collector discards this section */ + ASSERT(. != __isr_vector_start__, "The .isr_vector section is empty"); + } >flash + + + /* Text section (code and read-only data) */ + .text : + { + . = ALIGN(4); + _stext = .; + *(.text*) /* code */ + *(.rodata*) /* read only data */ + + /* + * NOTE: .glue_7 and .glue_7t sections are not needed because Cortex-M + * only supports Thumb instructions, no ARM/Thumb interworking. + */ + + /* Static constructors and destructors */ + KEEP(*(.init)) + KEEP(*(.fini)) + + . = ALIGN(4); + _etext = .; + } >flash + + + /* + * Stack unwinding and exception handling sections. + * + * ARM compilers emit object files with .ARM.extab and .ARM.exidx sections + * when using C++ exceptions. Also, at least GCC emits those sections when + * dividing large numbers (64-bit) in C. So we have to handle them. + * + * (ARM uses .ARM.extab and .ARM.exidx instead of the .eh_frame section + * used on x86.) + */ + .ARM.extab : /* exception unwinding information */ + { + *(.ARM.extab*) + } >flash + .ARM.exidx : /* index entries for section unwinding */ + { + *(.ARM.exidx*) + } >flash + + + /* + * Newlib and Eglibc (at least) need these for C++ support. + * + * (Copied from Sourcery CodeBench Lite: arm-none-eabi-gcc -V) + */ + .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 + + + /* + * Initialized data section. This section is programmed into FLASH (LMA + * address) and copied to RAM (VMA address) in startup code. + */ + _sidata = .; + .data : AT(_sidata) /* LMA address is _sidata (in FLASH) */ + { + . = ALIGN(4); + _sdata = .; /* data section VMA address (in RAM) */ + *(.data*) + . = ALIGN(4); + _edata = .; + } >ram + + /* + * CCM-RAM data section. Initialization variables can be placed here + * when the initialization code is provided by the user. Else it is used + * as an extra piece of memory for heap/stack + */ + _eidata = (_sidata + SIZEOF(.data)); + .ccm : AT(_sidata + SIZEOF(.data)) /* We want LMA address to be in FLASH (if used for init data) */ + { + . = ALIGN(4); + _sccm = .; /* data section VMA address (in CCMRAM) */ + *(.ccm) + . = ALIGN(4); + _eccm = .; + } >ccmram + + + /* Uninitialized data section (zeroed out by startup code) */ + .bss : + { + . = ALIGN(4); + _sbss = .; + __bss_start__ = _sbss; + *(.bss*) + *(COMMON) + . = ALIGN(4); + _ebss = .; + __bss_end__ = _ebss; + } >ram + + + /* + * Reserve memory for heap and stack. The linker will issue an error if + * there is not enough memory. + */ + ._heap : + { + . = ALIGN(4); + _end = .; + __end__ = _end; + . = . + _heap_size; + . = ALIGN(4); + } >ram + ._stack : + { + . = ALIGN(4); + . = . + _stack_size; + . = ALIGN(4); + } >ram +} + +/* Nice to have */ +__isr_vector_size__ = SIZEOF(.isr_vector); +__text_size__ = SIZEOF(.text); +__data_size__ = SIZEOF(.data); +__bss_size__ = SIZEOF(.bss); |