|
@@ -9,7 +9,151 @@ MEMORY
|
|
|
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x40000
|
|
|
}
|
|
|
|
|
|
-INCLUDE "packages/nrfx-v2.1.0/mdk/nrf_common.ld"
|
|
|
+ENTRY(Reset_Handler)
|
|
|
|
|
|
+SECTIONS
|
|
|
+{
|
|
|
+ .text :
|
|
|
+ {
|
|
|
+ KEEP(*(.isr_vector))
|
|
|
+ *(.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*))
|
|
|
+ /* section information for finsh shell */
|
|
|
+ . = ALIGN(4);
|
|
|
+ __fsymtab_start = .;
|
|
|
+ KEEP(*(FSymTab))
|
|
|
+ __fsymtab_end = .;
|
|
|
+
|
|
|
+ . = ALIGN(4);
|
|
|
+ __vsymtab_start = .;
|
|
|
+ KEEP(*(VSymTab))
|
|
|
+ __vsymtab_end = .;
|
|
|
+
|
|
|
+ /* section information for initial. */
|
|
|
+ . = ALIGN(4);
|
|
|
+ __rt_init_start = .;
|
|
|
+ KEEP(*(SORT(.rti_fn*)))
|
|
|
+ __rt_init_end = .;
|
|
|
+
|
|
|
+ . = ALIGN(4);
|
|
|
+
|
|
|
+ PROVIDE(__ctors_start__ = .);
|
|
|
+ KEEP (*(SORT(.init_array.*)))
|
|
|
+ KEEP (*(.init_array))
|
|
|
+ PROVIDE(__ctors_end__ = .);
|
|
|
+
|
|
|
+ } > FLASH
|
|
|
+
|
|
|
+ .ARM.extab :
|
|
|
+ {
|
|
|
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
|
|
|
+ } > FLASH
|
|
|
+
|
|
|
+ __exidx_start = .;
|
|
|
+ .ARM.exidx :
|
|
|
+ {
|
|
|
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
|
|
+ } > FLASH
|
|
|
+ __exidx_end = .;
|
|
|
+
|
|
|
+ __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__ = .;
|
|
|
+ PROVIDE(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")
|
|
|
+
|
|
|
+ /* Check if text sections + data exceeds FLASH limit */
|
|
|
+ DataInitFlashUsed = __bss_start__ - __data_start__;
|
|
|
+ CodeFlashUsed = __etext - ORIGIN(FLASH);
|
|
|
+ TotalFlashUsed = CodeFlashUsed + DataInitFlashUsed;
|
|
|
+ ASSERT(TotalFlashUsed <= LENGTH(FLASH), "region FLASH overflowed with .data and user data")
|
|
|
+
|
|
|
+}
|
|
|
|
|
|
|