Define USE_LATE_TASK_STATISTICS for AT32 (#12328)
[betaflight.git] / src / link / stm32_flash_g4_split.ld
blob7820c38964a1d6576a591054eb44354b249cb55a
1 /*
2 *****************************************************************************
3 **
4 **  File        : stm32_flash_g4_split.ld
5 **
6 **  Abstract    : Common linker script for STM32 devices.
7 **
8 *****************************************************************************
9 */
11 /* Entry Point */
12 ENTRY(Reset_Handler)
14 /* Highest address of the user mode stack */
15 _Hot_Reboot_Flags_Size = 16;
16 _estack = ORIGIN(STACKRAM) + LENGTH(STACKRAM) - _Hot_Reboot_Flags_Size;    /* end of RAM */
18 /* Base address where the config is stored. */
19 __config_start = ORIGIN(FLASH_CONFIG);
20 __config_end = ORIGIN(FLASH_CONFIG) + LENGTH(FLASH_CONFIG);
22 /* Generate a link error if heap and stack don't fit into RAM */
23 _Min_Heap_Size = 0;      /* required amount of heap  */
24 _Min_Stack_Size = 0x800; /* required amount of stack */
26 /* Define output sections */
27 SECTIONS
29   /*
30    * The ISR vector table is loaded at the beginning of the FLASH,
31    * But it is linked (space reserved) at the beginning of the VECTAB region,
32    * which is aliased either to FLASH or RAM.
33    * When linked to RAM, the table can optionally be copied from FLASH to RAM
34    * for table relocation.
35    */
37   _isr_vector_table_flash_base = LOADADDR(.isr_vector);
38   PROVIDE (isr_vector_table_flash_base = _isr_vector_table_flash_base);
40   .isr_vector :
41   {
42     . = ALIGN(512);
43     PROVIDE (isr_vector_table_base = .);
44     KEEP(*(.isr_vector)) /* Startup code */
45     . = ALIGN(4);
46     PROVIDE (isr_vector_table_end = .);
47   } >VECTAB AT> FLASH
49   /* System memory (read-only bootloader) interrupt vector */
50   .system_isr_vector (NOLOAD) :
51   {
52     . = ALIGN(4);
53     PROVIDE (system_isr_vector_table_base = .);
54     KEEP(*(.system_isr_vector)) /* Bootloader code */
55     . = ALIGN(4);
56   } >SYSTEM_MEMORY
58   /* The program code and other data goes into FLASH */
59   .text :
60   {
61     . = ALIGN(4);
62     *(.text)           /* .text sections (code) */
63     *(.text*)          /* .text* sections (code) */
64     *(.rodata)         /* .rodata sections (constants, strings, etc.) */
65     *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
66     *(.glue_7)         /* glue arm to thumb code */
67     *(.glue_7t)        /* glue thumb to arm code */
68     *(.eh_frame)
70     KEEP (*(.init))
71     KEEP (*(.fini))
73     . = ALIGN(4);
74     _etext = .;        /* define a global symbols at end of code */
75   } >FLASH1
78    .ARM.extab   : {
79        *(.ARM.extab* .gnu.linkonce.armextab.*)
80    } >MOVABLE_FLASH
82     .ARM : {
83     __exidx_start = .;
84       *(.ARM.exidx*)
85       __exidx_end = .;
86     } >MOVABLE_FLASH
88   .preinit_array     :
89   {
90     PROVIDE_HIDDEN (__preinit_array_start = .);
91     KEEP (*(.preinit_array*))
92     PROVIDE_HIDDEN (__preinit_array_end = .);
93   } >FLASH1
94   .init_array :
95   {
96     PROVIDE_HIDDEN (__init_array_start = .);
97     KEEP (*(SORT(.init_array.*)))
98     KEEP (*(.init_array*))
99     PROVIDE_HIDDEN (__init_array_end = .);
100   } >FLASH1
101   .fini_array :
102   {
103     PROVIDE_HIDDEN (__fini_array_start = .);
104     KEEP (*(.fini_array*))
105     KEEP (*(SORT(.fini_array.*)))
106     PROVIDE_HIDDEN (__fini_array_end = .);
107   } >FLASH1
108   .pg_registry :
109   {
110     PROVIDE_HIDDEN (__pg_registry_start = .);
111     KEEP (*(.pg_registry))
112     KEEP (*(SORT(.pg_registry.*)))
113     PROVIDE_HIDDEN (__pg_registry_end = .);
114   } >FLASH1
115   .pg_resetdata :
116   {
117     PROVIDE_HIDDEN (__pg_resetdata_start = .);
118     KEEP (*(.pg_resetdata))
119     PROVIDE_HIDDEN (__pg_resetdata_end = .);
120   } >FLASH1
122   /* Storage for the address for the configuration section so we can grab it out of the hex file */
123   .custom_defaults :
124   {
125     . = ALIGN(4);
126     KEEP (*(.custom_defaults_start_address))
127     . = ALIGN(4);
128     KEEP (*(.custom_defaults_end_address))
129     . = ALIGN(4);
130     __custom_defaults_internal_start = .;
131     KEEP (*(.custom_defaults))
132     . = ALIGN(4);
133   } >FLASH_CUSTOM_DEFAULTS
135   PROVIDE_HIDDEN (__custom_defaults_start = DEFINED(USE_CUSTOM_DEFAULTS_EXTENDED) ? ORIGIN(FLASH_CUSTOM_DEFAULTS_EXTENDED) : __custom_defaults_internal_start);
136   PROVIDE_HIDDEN (__custom_defaults_end = DEFINED(USE_CUSTOM_DEFAULTS_EXTENDED) ? ORIGIN(FLASH_CUSTOM_DEFAULTS_EXTENDED) + LENGTH(FLASH_CUSTOM_DEFAULTS_EXTENDED) : ORIGIN(FLASH_CUSTOM_DEFAULTS) + LENGTH(FLASH_CUSTOM_DEFAULTS));
138   /* used by the startup to initialize data */
139   _sidata = LOADADDR(.data);
141   /* Initialized data sections goes into RAM, load LMA copy after code */
142   .data :
143   {
144     . = ALIGN(4);
145     _sdata = .;        /* create a global symbol at data start */
146     *(.data)           /* .data sections */
147     *(.data*)          /* .data* sections */
149     . = ALIGN(4);
150     _edata = .;        /* define a global symbol at data end */
151   } >RAM AT> FLASH1
153   /* Uninitialized data section */
154   . = ALIGN(4);
155   .bss (NOLOAD) :
156   {
157     /* This is used by the startup in order to initialize the .bss secion */
158     _sbss = .;         /* define a global symbol at bss start */
159     __bss_start__ = _sbss;
160     *(.bss)
161     *(SORT_BY_ALIGNMENT(.bss*))
162     *(COMMON)
164     . = ALIGN(4);
165     _ebss = .;         /* define a global symbol at bss end */
166     __bss_end__ = _ebss;
167   } >RAM
169   /* used during startup to initialized fastram_data */
170   _sfastram_idata = LOADADDR(.fastram_data);
172   /* Initialized FAST_RAM section for unsuspecting developers */
173   .fastram_data :
174   {
175     . = ALIGN(4);
176     _sfastram_data = .;        /* create a global symbol at data start */
177     *(.fastram_data)           /* .data sections */
178     *(.fastram_data*)          /* .data* sections */
180     . = ALIGN(4);
181     _efastram_data = .;        /* define a global symbol at data end */
182   } >FASTRAM AT> FLASH1
184   . = ALIGN(4);
185   .fastram_bss (NOLOAD) :
186   {
187     _sfastram_bss = .;
188     __fastram_bss_start__ = _sfastram_bss;
189     *(.fastram_bss)
190     *(SORT_BY_ALIGNMENT(.fastram_bss*))
191     . = ALIGN(4);
192     _efastram_bss = .;
193     __fastram_bss_end__ = _efastram_bss;
194   } >FASTRAM
196   .persistent_data (NOLOAD) :
197   {
198     __persistent_data_start__ = .;
199     *(.persistent_data)
200     . = ALIGN(4);
201     __persistent_data_end__ = .;
202   } >RAM
204   .DMA_RAM_R (NOLOAD) :
205   {
206     . = ALIGN(32);
207     _sdma_ram_r = .;
208     PROVIDE(dma_ram_r_start = .);
209     _dma_ram_r_start__ = _sdma_ram_r;
210     KEEP(*(.DMA_RAM_R))
211     PROVIDE(dma_ram_r_end = .);
212     _edma_ram_r = .;
213     _dma_ram_r_end__ = _edma_ram_r;
214   } >RAM
216   .DMA_RAM_W (NOLOAD) :
217   {
218     . = ALIGN(32);
219     _sdma_ram_w = .;
220     PROVIDE(dma_ram_w_start = .);
221     _dma_ram_w_start__ = _sdma_ram_w;
222     KEEP(*(.DMA_RAM_W))
223     PROVIDE(dma_ram_w_end = .);
224     _edma_ram_w = .;
225     _dma_ram_w_end__ = _edma_ram_w;
226   } >RAM
228   .DMA_RAM_RW (NOLOAD) :
229   {
230     . = ALIGN(32);
231     _sdma_ram_rw = .;
232     PROVIDE(dma_ram_rw_start = .);
233     _dma_ram_rw_start__ = _sdma_ram_rw;
234     KEEP(*(.DMA_RAM_RW))
235     PROVIDE(dma_ram_rw_end = .);
236     _edma_ram_rw = .;
237     _dma_ram_rw_end__ = _edma_ram_rw;
238   } >RAM
240   /* User_heap_stack section, used to check that there is enough RAM left */
241   _heap_stack_end = ORIGIN(STACKRAM) + LENGTH(STACKRAM) - _Hot_Reboot_Flags_Size;
242   _heap_stack_begin = _heap_stack_end - _Min_Stack_Size  - _Min_Heap_Size;
243   . = _heap_stack_begin;
244   ._user_heap_stack :
245   {
246     . = ALIGN(4);
247     PROVIDE ( end = . );
248     PROVIDE ( _end = . );
249     . = . + _Min_Heap_Size;
250     . = . + _Min_Stack_Size;
251     . = ALIGN(4);
252   } >STACKRAM = 0xa5
254   /* MEMORY_bank1 section, code must be located here explicitly            */
255   /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */
256   .memory_b1_text :
257   {
258     *(.mb1text)        /* .mb1text sections (code) */
259     *(.mb1text*)       /* .mb1text* sections (code)  */
260     *(.mb1rodata)      /* read-only data (constants) */
261     *(.mb1rodata*)
262   } >MEMORY_B1
264   /* Remove information from the standard libraries */
265   /DISCARD/ :
266   {
267     libc.a ( * )
268     libm.a ( * )
269     libgcc.a ( * )
270   }
272   .ARM.attributes 0 : { *(.ARM.attributes) }