--- /dev/null
+GROUP (\r
+ "libgcc.a"\r
+ "libc_nano.a"\r
+ "libm.a"\r
+ "libcr_newlib_semihost.a"\r
+)\r
+\r
+MEMORY\r
+{\r
+ /* Define each memory region. */\r
+ PROGRAM_FLASH (rx) : ORIGIN = 0x00010000, LENGTH = 0x72000 /* 456K bytes (alias Flash). */\r
+ Ram0 (rwx) : ORIGIN = 0x20008000, LENGTH = 0x2b000 /* 172K bytes (alias RAM). */\r
+}\r
+\r
+/* Define a symbol for the top of each memory region. */\r
+__base_PROGRAM_FLASH = 0x00010000; /* PROGRAM_FLASH. */\r
+__base_Flash = 0x00010000; /* Flash. */\r
+__top_PROGRAM_FLASH = 0x00010000 + 0x72000; /* 456K bytes. */\r
+__top_Flash = 0x00010000 + 0x72000; /* 456K bytes. */\r
+\r
+__base_Ram0 = 0x20008000; /* Ram0. */\r
+__base_RAM = 0x20008000; /* RAM. */\r
+__top_Ram0 = 0x20008000 + 0x2b000; /* 172K bytes. */\r
+__top_RAM = 0x20008000 + 0x2b000; /* 172K bytes. */\r
+\r
+/* Entry point. */\r
+ENTRY(ResetISR)\r
+\r
+SECTIONS\r
+{\r
+ /* Vector Table Section. */\r
+ .text : ALIGN(4)\r
+ {\r
+ FILL(0xff)\r
+ __vectors_start__ = ABSOLUTE(.);\r
+ KEEP(*(.isr_vector))\r
+\r
+ /* Global Section Table. */\r
+ . = ALIGN(4);\r
+ __section_table_start = .;\r
+\r
+ __data_section_table = .;\r
+ LONG(LOADADDR(.data));\r
+ LONG( ADDR(.data));\r
+ LONG( SIZEOF(.data));\r
+ __data_section_table_end = .;\r
+\r
+ __bss_section_table = .;\r
+ LONG( ADDR(.bss));\r
+ LONG( SIZEOF(.bss));\r
+ __bss_section_table_end = .;\r
+\r
+ __section_table_end = .;\r
+ /* End of Global Section Table. */\r
+\r
+ *(.after_vectors*)\r
+ } > PROGRAM_FLASH\r
+\r
+ /* Privileged functions - Section needs to be 32 byte aligned to satisfy MPU requirements. */\r
+ .privileged_functions : ALIGN(32)\r
+ {\r
+ . = ALIGN(32);\r
+ __privileged_functions_start__ = .;\r
+ *(privileged_functions)\r
+ . = ALIGN(32);\r
+ /* End address must be the last address in the region, therefore, -1. */\r
+ __privileged_functions_end__ = . - 1;\r
+ } > PROGRAM_FLASH\r
+\r
+ /* FreeRTOS System calls - Section needs to be 32 byte aligned to satisfy MPU requirements. */\r
+ .freertos_system_calls : ALIGN(32)\r
+ {\r
+ . = ALIGN(32);\r
+ __syscalls_flash_start__ = .;\r
+ *(freertos_system_calls)\r
+ . = ALIGN(32);\r
+ /* End address must be the last address in the region, therefore, -1. */\r
+ __syscalls_flash_end__ = . - 1;\r
+ } > PROGRAM_FLASH\r
+\r
+ /* Main Text Section - Section needs to be 32 byte aligned to satisfy MPU requirements. */\r
+ .text : ALIGN(32)\r
+ {\r
+ . = ALIGN(32);\r
+ __unprivileged_flash_start__ = .;\r
+ *(.text*)\r
+ *(.rodata .rodata.* .constdata .constdata.*)\r
+ . = ALIGN(32);\r
+ /* End address must be the last address in the region, therefore, -1. */\r
+ __unprivileged_flash_end__ = . - 1;\r
+ } > PROGRAM_FLASH\r
+\r
+ /* For exception handling/unwind - some Newlib functions (in common\r
+ * with C++ and StdC++) use this. */\r
+ .ARM.extab : ALIGN(4)\r
+ {\r
+ *(.ARM.extab* .gnu.linkonce.armextab.*)\r
+ } > PROGRAM_FLASH\r
+\r
+ __exidx_start = .;\r
+ .ARM.exidx : ALIGN(4)\r
+ {\r
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)\r
+ } > PROGRAM_FLASH\r
+ __exidx_end = .;\r
+\r
+ /* Text Section End. */\r
+ _etext = .;\r
+\r
+ /* Uninit Reserved Section. */\r
+ .uninit_RESERVED : ALIGN(4)\r
+ {\r
+ KEEP(*(.bss.$RESERVED*))\r
+ . = ALIGN(4);\r
+ _end_uninit_RESERVED = .;\r
+ } > Ram0\r
+\r
+ /* Main Data section (Ram0). */\r
+ .data : ALIGN(4)\r
+ {\r
+ FILL(0xff)\r
+ _data = .;\r
+\r
+ /* Privileged data - It needs to be 32 byte aligned to satisfy MPU requirements. */\r
+ . = ALIGN(32);\r
+ __privileged_sram_start__ = .;\r
+ *(privileged_data);\r
+ . = ALIGN(32);\r
+ /* End address must be the last address in the region, therefore, -1. */\r
+ __privileged_sram_end__ = . - 1;\r
+\r
+ *(vtable)\r
+ *(.ramfunc*)\r
+ *(.data*)\r
+ _edata = .;\r
+ } > Ram0 AT>PROGRAM_FLASH\r
+\r
+ /* Main BSS Section. */\r
+ .bss : ALIGN(4)\r
+ {\r
+ _bss = .;\r
+ *(.bss*)\r
+ *(COMMON)\r
+ . = ALIGN(4);\r
+ _ebss = .;\r
+ PROVIDE(end = .);\r
+ } > Ram0\r
+\r
+ /* Default Noinit Section. */\r
+ .noinit (NOLOAD) : ALIGN(4)\r
+ {\r
+ _noinit = .;\r
+ *(.noinit*)\r
+ . = ALIGN(4);\r
+ _end_noinit = .;\r
+ } > Ram0\r
+\r
+ /* Reserve space and place heap in memory map. */\r
+ _HeapSize = 0x1000;\r
+ .heap : ALIGN(4)\r
+ {\r
+ _pvHeapStart = .;\r
+ . += _HeapSize;\r
+ . = ALIGN(4);\r
+ _pvHeapLimit = .;\r
+ } > Ram0\r
+\r
+ /* Reserve space for stack in memory. */\r
+ _StackSize = 0x1000;\r
+ .heap2stackfill :\r
+ {\r
+ . += _StackSize;\r
+ } > Ram0\r
+\r
+ /* Place actual stack in memory map. */\r
+ .stack ORIGIN(Ram0) + LENGTH(Ram0) - _StackSize - 0 : ALIGN(4)\r
+ {\r
+ _vStackBase = .;\r
+ . = ALIGN(4);\r
+ _vStackTop = . + _StackSize;\r
+ } > Ram0\r
+\r
+ /* Create checksum value (used in startup). */\r
+ PROVIDE(__valid_user_code_checksum = 0 -\r
+ (_vStackTop\r
+ + (ResetISR + 1)\r
+ + (NMI_Handler + 1)\r
+ + (HardFault_Handler + 1)\r
+ + (( DEFINED(MemManage_Handler) ? MemManage_Handler : 0 ) + 1) /* MemManage_Handler may not be defined. */\r
+ + (( DEFINED(BusFault_Handler) ? BusFault_Handler : 0 ) + 1) /* BusFault_Handler may not be defined. */\r
+ + (( DEFINED(UsageFault_Handler) ? UsageFault_Handler : 0 ) + 1) /* UsageFault_Handler may not be defined. */\r
+ ) );\r
+\r
+ /* Provide basic symbols giving location and size of main text block,\r
+ * including initial values of RW data sections. Note that these will need\r
+ * extending to give a complete picture with complex images\r
+ * (e.g multiple Flash banks). */\r
+ _image_start = LOADADDR(.text);\r
+ _image_end = LOADADDR(.data) + SIZEOF(.data);\r
+ _image_size = _image_end - _image_start;\r
+}\r