| 
									
										
										
										
											2020-01-04 10:31:55 -06:00
										 |  |  | /* Linker script to configure memory regions. */ | 
					
						
							|  |  |  | MEMORY | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x8000    /* 32k */ | 
					
						
							|  |  |  |   RAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 0x2000    /* 8k  */ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Library configurations */ | 
					
						
							|  |  |  | GROUP(libgcc.a libc.a libm.a libnosys.a) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Linker script to place sections and symbol values. Should be used together | 
					
						
							|  |  |  |  * with other linker script that defines memory regions FLASH and RAM. | 
					
						
							|  |  |  |  * It references following symbols, which must be defined in code: | 
					
						
							|  |  |  |  *   Reset_Handler : Entry of reset handler | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * It defines following symbols, which code can use without definition: | 
					
						
							|  |  |  |  *   __exidx_start | 
					
						
							|  |  |  |  *   __exidx_end | 
					
						
							|  |  |  |  *   __copy_table_start__ | 
					
						
							|  |  |  |  *   __copy_table_end__ | 
					
						
							|  |  |  |  *   __zero_table_start__ | 
					
						
							|  |  |  |  *   __zero_table_end__ | 
					
						
							|  |  |  |  *   __etext | 
					
						
							|  |  |  |  *   __data_start__ | 
					
						
							|  |  |  |  *   __preinit_array_start | 
					
						
							|  |  |  |  *   __preinit_array_end | 
					
						
							|  |  |  |  *   __init_array_start | 
					
						
							|  |  |  |  *   __init_array_end | 
					
						
							|  |  |  |  *   __fini_array_start | 
					
						
							|  |  |  |  *   __fini_array_end | 
					
						
							|  |  |  |  *   __data_end__ | 
					
						
							|  |  |  |  *   __bss_start__ | 
					
						
							|  |  |  |  *   __bss_end__ | 
					
						
							|  |  |  |  *   __end__ | 
					
						
							|  |  |  |  *   end | 
					
						
							|  |  |  |  *   __HeapLimit | 
					
						
							|  |  |  |  *   __StackLimit | 
					
						
							|  |  |  |  *   __StackTop | 
					
						
							|  |  |  |  *   __stack | 
					
						
							|  |  |  |  *   __Vectors_End | 
					
						
							|  |  |  |  *   __Vectors_Size | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | ENTRY(Reset_Handler) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SECTIONS | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	.text : | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		KEEP(*(.vectors)) | 
					
						
							|  |  |  | 		__Vectors_End = .; | 
					
						
							|  |  |  | 		__Vectors_Size = __Vectors_End - __Vectors; | 
					
						
							|  |  |  | 		__end__ = .; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		*(.text*) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		KEEP(*(.init)) | 
					
						
							|  |  |  | 		KEEP(*(.fini)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/* .ctors */ | 
					
						
							|  |  |  | 		*crtbegin.o(.ctors) | 
					
						
							|  |  |  | 		*crtbegin?.o(.ctors) | 
					
						
							|  |  |  | 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) | 
					
						
							|  |  |  | 		*(SORT(.ctors.*)) | 
					
						
							|  |  |  | 		*(.ctors) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/* .dtors */ | 
					
						
							|  |  |  |  		*crtbegin.o(.dtors) | 
					
						
							|  |  |  |  		*crtbegin?.o(.dtors) | 
					
						
							|  |  |  |  		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) | 
					
						
							|  |  |  |  		*(SORT(.dtors.*)) | 
					
						
							|  |  |  |  		*(.dtors) | 
					
						
							| 
									
										
										
										
											2023-03-17 16:12:49 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-04 10:31:55 -06:00
										 |  |  | 		*(.rodata*) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		KEEP(*(.eh_frame*)) | 
					
						
							|  |  |  | 	} > FLASH | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	.ARM.extab : | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		*(.ARM.extab* .gnu.linkonce.armextab.*) | 
					
						
							|  |  |  | 	} > FLASH | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	__exidx_start = .; | 
					
						
							|  |  |  | 	.ARM.exidx : | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		*(.ARM.exidx* .gnu.linkonce.armexidx.*) | 
					
						
							|  |  |  | 	} > FLASH | 
					
						
							|  |  |  | 	__exidx_end = .; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* To copy multiple ROM to RAM sections, | 
					
						
							|  |  |  | 	 * uncomment .copy.table section and, | 
					
						
							|  |  |  | 	 * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */ | 
					
						
							|  |  |  | 	/* | 
					
						
							|  |  |  | 	.copy.table : | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		. = ALIGN(4); | 
					
						
							|  |  |  | 		__copy_table_start__ = .; | 
					
						
							|  |  |  | 		LONG (__etext) | 
					
						
							|  |  |  | 		LONG (__data_start__) | 
					
						
							|  |  |  | 		LONG (__data_end__ - __data_start__) | 
					
						
							|  |  |  | 		LONG (__etext2) | 
					
						
							|  |  |  | 		LONG (__data2_start__) | 
					
						
							|  |  |  | 		LONG (__data2_end__ - __data2_start__) | 
					
						
							|  |  |  | 		__copy_table_end__ = .; | 
					
						
							|  |  |  | 	} > FLASH | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* To clear multiple BSS sections, | 
					
						
							|  |  |  | 	 * uncomment .zero.table section and, | 
					
						
							|  |  |  | 	 * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */ | 
					
						
							|  |  |  | 	/* | 
					
						
							|  |  |  | 	.zero.table : | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		. = ALIGN(4); | 
					
						
							|  |  |  | 		__zero_table_start__ = .; | 
					
						
							|  |  |  | 		LONG (__bss_start__) | 
					
						
							|  |  |  | 		LONG (__bss_end__ - __bss_start__) | 
					
						
							|  |  |  | 		LONG (__bss2_start__) | 
					
						
							|  |  |  | 		LONG (__bss2_end__ - __bss2_start__) | 
					
						
							|  |  |  | 		__zero_table_end__ = .; | 
					
						
							|  |  |  | 	} > FLASH | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	__etext = .; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	.data : AT (__etext) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		__data_start__ = .; | 
					
						
							|  |  |  | 		*(vtable) | 
					
						
							|  |  |  | 		*(.data*) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		. = ALIGN(4); | 
					
						
							|  |  |  | 		/* preinit data */ | 
					
						
							|  |  |  | 		PROVIDE_HIDDEN (__preinit_array_start = .); | 
					
						
							|  |  |  | 		KEEP(*(.preinit_array)) | 
					
						
							|  |  |  | 		PROVIDE_HIDDEN (__preinit_array_end = .); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		. = ALIGN(4); | 
					
						
							|  |  |  | 		/* init data */ | 
					
						
							|  |  |  | 		PROVIDE_HIDDEN (__init_array_start = .); | 
					
						
							|  |  |  | 		KEEP(*(SORT(.init_array.*))) | 
					
						
							|  |  |  | 		KEEP(*(.init_array)) | 
					
						
							|  |  |  | 		PROVIDE_HIDDEN (__init_array_end = .); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		. = ALIGN(4); | 
					
						
							|  |  |  | 		/* finit data */ | 
					
						
							|  |  |  | 		PROVIDE_HIDDEN (__fini_array_start = .); | 
					
						
							|  |  |  | 		KEEP(*(SORT(.fini_array.*))) | 
					
						
							|  |  |  | 		KEEP(*(.fini_array)) | 
					
						
							|  |  |  | 		PROVIDE_HIDDEN (__fini_array_end = .); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		KEEP(*(.jcr*)) | 
					
						
							|  |  |  | 		. = ALIGN(4); | 
					
						
							|  |  |  | 		/* All data end */ | 
					
						
							|  |  |  | 		__data_end__ = .; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	} > RAM | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	.bss : | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		. = ALIGN(4); | 
					
						
							|  |  |  | 		__bss_start__ = .; | 
					
						
							|  |  |  | 		*(.bss*) | 
					
						
							|  |  |  | 		*(COMMON) | 
					
						
							|  |  |  | 		. = ALIGN(4); | 
					
						
							|  |  |  | 		__bss_end__ = .; | 
					
						
							|  |  |  | 	} > RAM | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	.heap (COPY): | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		__HeapBase = .; | 
					
						
							|  |  |  | 		__end__ = .; | 
					
						
							|  |  |  | 		end = __end__; | 
					
						
							|  |  |  | 		KEEP(*(.heap*)) | 
					
						
							|  |  |  | 		__HeapLimit = .; | 
					
						
							|  |  |  | 	} > RAM | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* .stack_dummy section doesn't contains any symbols. It is only | 
					
						
							|  |  |  | 	 * used for linker to calculate size of stack sections, and assign | 
					
						
							|  |  |  | 	 * values to stack symbols later */ | 
					
						
							|  |  |  | 	.stack_dummy (COPY): | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		KEEP(*(.stack*)) | 
					
						
							|  |  |  | 	} > RAM | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Set stack top to end of RAM, and stack limit move down by | 
					
						
							|  |  |  | 	 * size of stack_dummy section */ | 
					
						
							|  |  |  | 	__StackTop = ORIGIN(RAM) + LENGTH(RAM); | 
					
						
							|  |  |  | 	__StackLimit = __StackTop - SIZEOF(.stack_dummy); | 
					
						
							|  |  |  | 	PROVIDE(__stack = __StackTop); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Check if data + heap + stack exceeds RAM limit */ | 
					
						
							|  |  |  | 	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") | 
					
						
							|  |  |  | } |