196 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			196 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /* Linker script to configure memory regions. */ | ||
|  | MEMORY | ||
|  | { | ||
|  |   FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x40000   /* 256k */ | ||
|  |   RAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 0x5000    /*  20k */ | ||
|  | } | ||
|  | 
 | ||
|  | /* 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) | ||
|  | 
 | ||
|  | 		*(.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") | ||
|  | } |