aboutsummaryrefslogtreecommitdiffstats
path: root/boards/base/STM32F469i-Discovery/CubeHAL/STM32_FLASH.ld
diff options
context:
space:
mode:
Diffstat (limited to 'boards/base/STM32F469i-Discovery/CubeHAL/STM32_FLASH.ld')
-rw-r--r--boards/base/STM32F469i-Discovery/CubeHAL/STM32_FLASH.ld186
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);