Sanify Teensy linker script
There were a bunch of specially named sections that were either not used
or used for something different than their name, and they were all
unnecessary.
Change-Id: I378f6affdc0cd208c876aa00ca2f80d9b53abce1
diff --git a/motors/core/mk20dx128.c b/motors/core/mk20dx128.c
index 9709a11..f7dbd09 100644
--- a/motors/core/mk20dx128.c
+++ b/motors/core/mk20dx128.c
@@ -50,13 +50,13 @@
// Flash Options
#define FOPT 0xF9
-extern unsigned long _stext;
-extern unsigned long _etext;
-extern unsigned long _sdata;
-extern unsigned long _edata;
-extern unsigned long _sbss;
-extern unsigned long _ebss;
-extern unsigned long _estack;
+extern uint32_t __bss_ram_start__[];
+extern uint32_t __bss_ram_end__[];
+extern uint32_t __data_ram_start__[];
+extern uint32_t __data_ram_end__[];
+extern uint32_t __data_flash_start__[];
+extern uint32_t __heap_start__[];
+extern uint32_t __stack_end__[];
extern int main(void);
void ResetHandler(void);
@@ -191,27 +191,28 @@
void portcd_isr(void) __attribute__((weak, alias("unused_isr")));
void software_isr(void) __attribute__((weak, alias("unused_isr")));
-__attribute__((section(".dmabuffers"), used, aligned(512))) void (
+__attribute__((used, aligned(512))) void (
*_VectorsRam[NVIC_NUM_INTERRUPTS + 16])(void);
__attribute__((section(".vectors"), used)) void (
*const _VectorsFlash[NVIC_NUM_INTERRUPTS + 16])(void) = {
- (void (*)(void))((unsigned long)&_estack), // 0 ARM: Initial Stack Pointer
- ResetHandler, // 1 ARM: Initial Program Counter
- nmi_isr, // 2 ARM: Non-maskable Interrupt (NMI)
- hard_fault_isr, // 3 ARM: Hard Fault
- memmanage_fault_isr, // 4 ARM: MemManage Fault
- bus_fault_isr, // 5 ARM: Bus Fault
- usage_fault_isr, // 6 ARM: Usage Fault
- fault_isr, // 7 --
- fault_isr, // 8 --
- fault_isr, // 9 --
- fault_isr, // 10 --
- svcall_isr, // 11 ARM: Supervisor call (SVCall)
- debugmonitor_isr, // 12 ARM: Debug Monitor
- fault_isr, // 13 --
- pendablesrvreq_isr, // 14 ARM: Pendable req serv(PendableSrvReq)
- systick_isr, // 15 ARM: System tick timer (SysTick)
+ (void (*)(void))((unsigned long)
+ __stack_end__), // 0 ARM: Initial Stack Pointer
+ ResetHandler, // 1 ARM: Initial Program Counter
+ nmi_isr, // 2 ARM: Non-maskable Interrupt (NMI)
+ hard_fault_isr, // 3 ARM: Hard Fault
+ memmanage_fault_isr, // 4 ARM: MemManage Fault
+ bus_fault_isr, // 5 ARM: Bus Fault
+ usage_fault_isr, // 6 ARM: Usage Fault
+ fault_isr, // 7 --
+ fault_isr, // 8 --
+ fault_isr, // 9 --
+ fault_isr, // 10 --
+ svcall_isr, // 11 ARM: Supervisor call (SVCall)
+ debugmonitor_isr, // 12 ARM: Debug Monitor
+ fault_isr, // 13 --
+ pendablesrvreq_isr, // 14 ARM: Pendable req serv(PendableSrvReq)
+ systick_isr, // 15 ARM: System tick timer (SysTick)
#if defined(__MK20DX256__)
dma_ch0_isr, // 16 DMA channel 0 transfer complete
dma_ch1_isr, // 17 DMA channel 1 transfer complete
@@ -410,8 +411,6 @@
__attribute__((section(".startup"), optimize("-Os")))
#endif
void ResetHandler(void) {
- uint32_t *src = &_etext;
- uint32_t *dest = &_sdata;
unsigned int i;
WDOG_UNLOCK = WDOG_UNLOCK_SEQ1;
@@ -446,10 +445,19 @@
// so we can into other sleep modes in the future at any speed
SMC_PMPROT = SMC_PMPROT_AVLP | SMC_PMPROT_ALLS | SMC_PMPROT_AVLLS;
- // TODO: do this while the PLL is waiting to lock....
- while (dest < &_edata) *dest++ = *src++;
- dest = &_sbss;
- while (dest < &_ebss) *dest++ = 0;
+ {
+ uint32_t *src = __data_flash_start__;
+ uint32_t *dest = __data_ram_start__;
+ while (dest < __data_ram_end__) {
+ *dest++ = *src++;
+ }
+ }
+ {
+ uint32_t *dest = __bss_ram_start__;
+ while (dest < __bss_ram_end__) {
+ *dest++ = 0;
+ }
+ }
// default all interrupts to medium priority level
for (i = 0; i < NVIC_NUM_INTERRUPTS + 16; i++)
@@ -547,7 +555,7 @@
}
}
-char *__brkval = (char *)&_ebss;
+char *__brkval = (char *)__heap_start__;
#ifndef STACK_MARGIN
#if defined(__MKL26Z64__)
diff --git a/motors/core/mk64fx512.ld b/motors/core/mk64fx512.ld
index 43a63ad..df874a6 100644
--- a/motors/core/mk64fx512.ld
+++ b/motors/core/mk64fx512.ld
@@ -34,6 +34,7 @@
RAM (rwx) : ORIGIN = 0x1FFF0000, LENGTH = 192K
}
+ENTRY(_VectorsFlash);
SECTIONS
{
@@ -64,48 +65,32 @@
} > FLASH
_etext = .;
- .usbdescriptortable (NOLOAD) : {
- /* . = ORIGIN(RAM); */
- _sram = .;
- . = ALIGN(512);
- *(.usbdescriptortable*)
- } > RAM
-
- .dmabuffers (NOLOAD) : {
- . = ALIGN(4);
- *(.dmabuffers*)
- } > RAM
-
- .usbbuffers (NOLOAD) : {
- . = ALIGN(4);
- *(.usbbuffers*)
- } > RAM
-
- .data : AT (_etext) {
- . = ALIGN(4);
- _sdata = .;
- *(SORT_BY_ALIGNMENT(.data*))
- . = ALIGN(4);
- _edata = .;
- } > RAM
-
- .noinit (NOLOAD) : {
- *(.noinit*)
- } > RAM
-
+ /* Deliberately putting .bss before .data because we end up with some things
+ * in here that have large alignments, so this minimizes padding.
+ */
.bss : {
. = ALIGN(4);
- _sbss = .;
- __bss_start__ = .;
+ __bss_ram_start__ = .;
*(SORT_BY_ALIGNMENT(.bss*))
/* Stupid precompiled libc has common symbols, so stick them in. */
*/libc_nano.a:*(COMMON)
. = ALIGN(4);
- _ebss = .;
- __bss_end = .;
- __bss_end__ = .;
+ __bss_ram_end__ = .;
} > RAM
+ .data : AT (_etext) {
+ . = ALIGN(4);
+ __data_ram_start__ = .;
+ *(SORT_BY_ALIGNMENT(.data*))
+ . = ALIGN(4);
+ __data_ram_end__ = .;
+ } > RAM
+
+ __data_flash_start__ = LOADADDR(.data);
+
+ . = ALIGN(8);
+ __heap_start__ = .;
+
/* We don't want any common symbols, so just don't include them which results
* in linker errors if any do show up somehow.
* Contrary to sanity, even with --orphan-handling=error the linker will still
@@ -114,9 +99,5 @@
*(COMMON);
}
- _estack = ORIGIN(RAM) + LENGTH(RAM);
+ __stack_end__ = ORIGIN(RAM) + LENGTH(RAM);
}
-
-
-
-
diff --git a/motors/medium_salsa.cc b/motors/medium_salsa.cc
index 1a899b1..1fbe9a6 100644
--- a/motors/medium_salsa.cc
+++ b/motors/medium_salsa.cc
@@ -20,9 +20,9 @@
void __stack_chk_fail(void);
extern char *__brkval;
-extern unsigned long _ebss;
-extern unsigned long _sram;
-extern unsigned long _estack;
+extern uint32_t __bss_ram_start__[];
+extern uint32_t __heap_start__[];
+extern uint32_t __stack_end__[];
} // extern "C"
@@ -51,14 +51,14 @@
// Give everything a chance to get going.
delay(100);
- printf("Ram start: %p\n", &_sram);
- printf("Heap start: %p\n", &_ebss);
+ printf("Ram start: %p\n", __bss_ram_start__);
+ printf("Heap start: %p\n", __heap_start__);
printf("Heap end: %p\n", __brkval);
- printf("Stack start: %p\n", &_estack);
+ printf("Stack start: %p\n", __stack_end__);
GPIOC_PSOR = 1 << 5;
-
while (true) {}
+
return 0;
}
diff --git a/motors/usb/usb_dev.c b/motors/usb/usb_dev.c
index 8dc8e1f..703ec50 100644
--- a/motors/usb/usb_dev.c
+++ b/motors/usb/usb_dev.c
@@ -63,8 +63,7 @@
const void * addr;
} bdt_t;
-__attribute__ ((section(".usbdescriptortable"), used))
-static bdt_t table[(NUM_ENDPOINTS+1)*4];
+__attribute__((aligned(512), used)) static bdt_t table[(NUM_ENDPOINTS + 1) * 4];
static usb_packet_t *rx_first[NUM_ENDPOINTS];
static usb_packet_t *rx_last[NUM_ENDPOINTS];
diff --git a/motors/usb/usb_mem.c b/motors/usb/usb_mem.c
index e21e5a9..ac883be 100644
--- a/motors/usb/usb_mem.c
+++ b/motors/usb/usb_mem.c
@@ -35,8 +35,9 @@
//#include "HardwareSerial.h"
#include "motors/usb/usb_mem.h"
-__attribute__ ((section(".usbbuffers"), used))
-unsigned char usb_buffer_memory[NUM_USB_BUFFERS * sizeof(usb_packet_t)];
+__attribute__((
+ aligned(128))) unsigned char usb_buffer_memory[NUM_USB_BUFFERS *
+ sizeof(usb_packet_t)];
static uint32_t usb_buffer_available = 0xFFFFFFFF;