diff --git a/hardware/arduino/sam/cores/arduino/cortex_handlers.c b/hardware/arduino/sam/cores/arduino/cortex_handlers.c index 924110b90..bf0a69c97 100644 --- a/hardware/arduino/sam/cores/arduino/cortex_handlers.c +++ b/hardware/arduino/sam/cores/arduino/cortex_handlers.c @@ -17,50 +17,109 @@ */ #include "Arduino.h" +#include "Reset.h" #ifdef __cplusplus extern "C" { #endif -void NMI_Handler( void ) -{ - for ( ;; ) ; +static void __halt() { + // Halts + while (1) + ; } -void HardFault_Handler( void ) +extern void svcHook(void); +extern void pendSVHook(void); +extern int sysTickHook(void); + +/* Cortex-M3 core handlers */ +void NMI_Handler (void) __attribute__ ((weak, alias("__halt"))); +void HardFault_Handler (void) __attribute__ ((weak, alias("__halt"))); +void MemManage_Handler (void) __attribute__ ((weak, alias("__halt"))); +void BusFault_Handler (void) __attribute__ ((weak, alias("__halt"))); +void UsageFault_Handler(void) __attribute__ ((weak, alias("__halt"))); +void DebugMon_Handler (void) __attribute__ ((weak, alias("__halt"))); +void SVC_Handler (void) { svcHook(); } +void PendSV_Handler (void) { pendSVHook(); } + +void SysTick_Handler(void) { - for ( ;; ) ; + if (sysTickHook()) + return; + + tickReset(); + + // Increment tick count each ms + TimeTick_Increment(); } -void MemManage_Handler( void ) -{ - for ( ;; ) ; -} - -void BusFault_Handler( void ) -{ - for ( ;; ) ; -} - -void UsageFault_Handler( void ) -{ - for ( ;; ) ; -} - -void SVC_Handler( void ) -{ - for ( ;; ) ; -} - -void DebugMon_Handler( void ) -{ - for ( ;; ) ; -} - -void PendSV_Handler( void ) -{ - for ( ;; ) ; -} +/* Peripherals handlers */ +void SUPC_Handler (void) __attribute__ ((weak, alias("__halt"))); +void RSTC_Handler (void) __attribute__ ((weak, alias("__halt"))); +void RTC_Handler (void) __attribute__ ((weak, alias("__halt"))); +void RTT_Handler (void) __attribute__ ((weak, alias("__halt"))); +void WDT_Handler (void) __attribute__ ((weak, alias("__halt"))); +void PMC_Handler (void) __attribute__ ((weak, alias("__halt"))); +void EFC0_Handler (void) __attribute__ ((weak, alias("__halt"))); +void EFC1_Handler (void) __attribute__ ((weak, alias("__halt"))); +void UART_Handler (void) __attribute__ ((weak, alias("__halt"))); +#ifdef _SAM3XA_SMC_INSTANCE_ +void SMC_Handler (void) __attribute__ ((weak, alias("__halt"))); +#endif +#ifdef _SAM3XA_SDRAMC_INSTANCE_ +void SDRAMC_Handler (void) __attribute__ ((weak, alias("__halt"))); +#endif +void PIOA_Handler (void) __attribute__ ((weak, alias("__halt"))); +void PIOB_Handler (void) __attribute__ ((weak, alias("__halt"))); +#ifdef _SAM3XA_PIOC_INSTANCE_ +void PIOC_Handler (void) __attribute__ ((weak, alias("__halt"))); +#endif +#ifdef _SAM3XA_PIOD_INSTANCE_ +void PIOD_Handler (void) __attribute__ ((weak, alias("__halt"))); +#endif +#ifdef _SAM3XA_PIOE_INSTANCE_ +void PIOE_Handler (void) __attribute__ ((weak, alias("__halt"))); +#endif +#ifdef _SAM3XA_PIOF_INSTANCE_ +void PIOF_Handler (void) __attribute__ ((weak, alias("__halt"))); +#endif +void USART0_Handler (void) __attribute__ ((weak, alias("__halt"))); +void USART1_Handler (void) __attribute__ ((weak, alias("__halt"))); +void USART2_Handler (void) __attribute__ ((weak, alias("__halt"))); +#ifdef _SAM3XA_USART3_INSTANCE_ +void USART3_Handler (void) __attribute__ ((weak, alias("__halt"))); +#endif +void HSMCI_Handler (void) __attribute__ ((weak, alias("__halt"))); +void TWI0_Handler (void) __attribute__ ((weak, alias("__halt"))); +void TWI1_Handler (void) __attribute__ ((weak, alias("__halt"))); +void SPI0_Handler (void) __attribute__ ((weak, alias("__halt"))); +#ifdef _SAM3XA_SPI1_INSTANCE_ +void SPI1_Handler (void) __attribute__ ((weak, alias("__halt"))); +#endif +void SSC_Handler (void) __attribute__ ((weak, alias("__halt"))); +void TC0_Handler (void) __attribute__ ((weak, alias("__halt"))); +void TC1_Handler (void) __attribute__ ((weak, alias("__halt"))); +void TC2_Handler (void) __attribute__ ((weak, alias("__halt"))); +void TC3_Handler (void) __attribute__ ((weak, alias("__halt"))); +void TC4_Handler (void) __attribute__ ((weak, alias("__halt"))); +void TC5_Handler (void) __attribute__ ((weak, alias("__halt"))); +#ifdef _SAM3XA_TC2_INSTANCE_ +void TC6_Handler (void) __attribute__ ((weak, alias("__halt"))); +void TC7_Handler (void) __attribute__ ((weak, alias("__halt"))); +void TC8_Handler (void) __attribute__ ((weak, alias("__halt"))); +#endif +void PWM_Handler (void) __attribute__ ((weak, alias("__halt"))); +void ADC_Handler (void) __attribute__ ((weak, alias("__halt"))); +void DACC_Handler (void) __attribute__ ((weak, alias("__halt"))); +void DMAC_Handler (void) __attribute__ ((weak, alias("__halt"))); +void UOTGHS_Handler (void) __attribute__ ((weak, alias("__halt"))); +void TRNG_Handler (void) __attribute__ ((weak, alias("__halt"))); +#ifdef _SAM3XA_EMAC_INSTANCE_ +void EMAC_Handler (void) __attribute__ ((weak, alias("__halt"))); +#endif +void CAN0_Handler (void) __attribute__ ((weak, alias("__halt"))); +void CAN1_Handler (void) __attribute__ ((weak, alias("__halt"))); #ifdef __cplusplus } diff --git a/hardware/arduino/sam/cores/arduino/hooks.c b/hardware/arduino/sam/cores/arduino/hooks.c index 641eabc73..aa16d1190 100644 --- a/hardware/arduino/sam/cores/arduino/hooks.c +++ b/hardware/arduino/sam/cores/arduino/hooks.c @@ -29,3 +29,30 @@ static void __empty() { // Empty } void yield(void) __attribute__ ((weak, alias("__empty"))); + +/** + * SysTick hook + * + * This function is called from SysTick handler, before the default + * handler provided by Arduino. + */ +static int __false() { + // Return false + return 0; +} +int sysTickHook(void) __attribute__ ((weak, alias("__false"))); + +/** + * SVC hook + * PendSV hook + * + * These functions are called from SVC handler, and PensSV handler. + * Default action is halting. + */ +static void __halt() { + // Halts + while (1) + ; +} +void svcHook(void) __attribute__ ((weak, alias("__halt"))); +void pendSVHook(void) __attribute__ ((weak, alias("__halt"))); diff --git a/hardware/arduino/sam/cores/arduino/wiring.c b/hardware/arduino/sam/cores/arduino/wiring.c index e7400bf3d..431761b44 100644 --- a/hardware/arduino/sam/cores/arduino/wiring.c +++ b/hardware/arduino/sam/cores/arduino/wiring.c @@ -17,7 +17,6 @@ */ #include "Arduino.h" -#include "Reset.h" #ifdef __cplusplus extern "C" { @@ -57,17 +56,6 @@ void delayMicroseconds( uint32_t us ) ; } -/* - * Cortex-M3 Systick IT handler: MOVED TO MAIN DUE TO WEAK SYMBOL ISSUE NOT RESOLVED - */ -void SysTick_Handler( void ) -{ - tickReset(); - - // Increment tick count each ms - TimeTick_Increment() ; -} - #if defined ( __ICCARM__ ) /* IAR Ewarm 5.41+ */ extern signed int putchar( signed int c ) ; /** diff --git a/hardware/arduino/sam/system/CMSIS/Device/ATMEL/sam3xa/source/gcc/startup_sam3xa.c b/hardware/arduino/sam/system/CMSIS/Device/ATMEL/sam3xa/source/gcc/startup_sam3xa.c index 224edaef3..698df1d9a 100644 --- a/hardware/arduino/sam/system/CMSIS/Device/ATMEL/sam3xa/source/gcc/startup_sam3xa.c +++ b/hardware/arduino/sam/system/CMSIS/Device/ATMEL/sam3xa/source/gcc/startup_sam3xa.c @@ -47,86 +47,7 @@ int main(void); // Arduino: we must setup hardware before doing this // void __libc_init_array(void); -/* Default empty handler */ -void Dummy_Handler(void); - -/* Cortex-M3 core handlers */ -void NMI_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void HardFault_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void MemManage_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void BusFault_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void UsageFault_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void SVC_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void DebugMon_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void PendSV_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void SysTick_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); - -/* Peripherals handlers */ -void SUPC_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void RSTC_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void RTC_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void RTT_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void WDT_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void PMC_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void EFC0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void EFC1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void UART_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -#ifdef _SAM3XA_SMC_INSTANCE_ -void SMC_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -#endif /* _SAM3XA_SMC_INSTANCE_ */ -#ifdef _SAM3XA_SDRAMC_INSTANCE_ -void SDRAMC_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -#endif /* _SAM3XA_SDRAMC_INSTANCE_ */ -void PIOA_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void PIOB_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -#ifdef _SAM3XA_PIOC_INSTANCE_ -void PIOC_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -#endif /* _SAM3XA_PIOC_INSTANCE_ */ -#ifdef _SAM3XA_PIOD_INSTANCE_ -void PIOD_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -#endif /* _SAM3XA_PIOD_INSTANCE_ */ -#ifdef _SAM3XA_PIOE_INSTANCE_ -void PIOE_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -#endif /* _SAM3XA_PIOE_INSTANCE_ */ -#ifdef _SAM3XA_PIOF_INSTANCE_ -void PIOF_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -#endif /* _SAM3XA_PIOF_INSTANCE_ */ -void USART0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void USART1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void USART2_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -#ifdef _SAM3XA_USART3_INSTANCE_ -void USART3_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -#endif /* _SAM3XA_USART3_INSTANCE_ */ -void HSMCI_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void TWI0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void TWI1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void SPI0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -#ifdef _SAM3XA_SPI1_INSTANCE_ -void SPI1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -#endif /* _SAM3XA_SPI1_INSTANCE_ */ -void SSC_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void TC0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void TC1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void TC2_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void TC3_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void TC4_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void TC5_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -#ifdef _SAM3XA_TC2_INSTANCE_ -void TC6_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void TC7_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void TC8_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -#endif /* _SAM3XA_TC2_INSTANCE_ */ -void PWM_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void ADC_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void DACC_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void DMAC_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void UOTGHS_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void TRNG_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -#ifdef _SAM3XA_EMAC_INSTANCE_ -void EMAC_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -#endif /* _SAM3XA_EMAC_INSTANCE_ */ -void CAN0_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); -void CAN1_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler"))); +// Arduino: handlers weak symbols moved into main /* Exception Table */ __attribute__ ((section(".vectors"))) @@ -283,13 +204,3 @@ void Reset_Handler(void) /* Infinite loop */ while (1); } - -/** - * \brief Default interrupt handler for unused IRQs. - */ -void Dummy_Handler(void) -{ - while (1) { - } -} - diff --git a/hardware/arduino/sam/variants/arduino_due_x/libsam_sam3x8e_gcc_rel.a b/hardware/arduino/sam/variants/arduino_due_x/libsam_sam3x8e_gcc_rel.a index 822990651..390d2532e 100644 Binary files a/hardware/arduino/sam/variants/arduino_due_x/libsam_sam3x8e_gcc_rel.a and b/hardware/arduino/sam/variants/arduino_due_x/libsam_sam3x8e_gcc_rel.a differ diff --git a/hardware/arduino/sam/variants/arduino_due_x/libsam_sam3x8e_gcc_rel.a.txt b/hardware/arduino/sam/variants/arduino_due_x/libsam_sam3x8e_gcc_rel.a.txt index 1854c378a..600f00497 100644 --- a/hardware/arduino/sam/variants/arduino_due_x/libsam_sam3x8e_gcc_rel.a.txt +++ b/hardware/arduino/sam/variants/arduino_due_x/libsam_sam3x8e_gcc_rel.a.txt @@ -236,58 +236,57 @@ system_sam3xa.o: 00000000 T system_init_flash startup_sam3xa.o: -00000000 W ADC_Handler -00000000 W BusFault_Handler -00000000 W CAN0_Handler -00000000 W CAN1_Handler -00000000 W DACC_Handler -00000000 W DMAC_Handler -00000000 W DebugMon_Handler -00000000 T Dummy_Handler -00000000 W EFC0_Handler -00000000 W EFC1_Handler -00000000 W EMAC_Handler -00000000 W HSMCI_Handler -00000000 W HardFault_Handler -00000000 W MemManage_Handler -00000000 W NMI_Handler -00000000 W PIOA_Handler -00000000 W PIOB_Handler -00000000 W PIOC_Handler -00000000 W PIOD_Handler -00000000 W PMC_Handler -00000000 W PWM_Handler -00000000 W PendSV_Handler -00000000 W RSTC_Handler -00000000 W RTC_Handler -00000000 W RTT_Handler + U ADC_Handler + U BusFault_Handler + U CAN0_Handler + U CAN1_Handler + U DACC_Handler + U DMAC_Handler + U DebugMon_Handler + U EFC0_Handler + U EFC1_Handler + U EMAC_Handler + U HSMCI_Handler + U HardFault_Handler + U MemManage_Handler + U NMI_Handler + U PIOA_Handler + U PIOB_Handler + U PIOC_Handler + U PIOD_Handler + U PMC_Handler + U PWM_Handler + U PendSV_Handler + U RSTC_Handler + U RTC_Handler + U RTT_Handler 00000000 T Reset_Handler -00000000 W SMC_Handler -00000000 W SPI0_Handler -00000000 W SSC_Handler -00000000 W SUPC_Handler -00000000 W SVC_Handler -00000000 W SysTick_Handler -00000000 W TC0_Handler -00000000 W TC1_Handler -00000000 W TC2_Handler -00000000 W TC3_Handler -00000000 W TC4_Handler -00000000 W TC5_Handler -00000000 W TC6_Handler -00000000 W TC7_Handler -00000000 W TC8_Handler -00000000 W TRNG_Handler -00000000 W TWI0_Handler -00000000 W TWI1_Handler -00000000 W UART_Handler -00000000 W UOTGHS_Handler -00000000 W USART0_Handler -00000000 W USART1_Handler -00000000 W USART2_Handler -00000000 W USART3_Handler -00000000 W UsageFault_Handler -00000000 W WDT_Handler + U SMC_Handler + U SPI0_Handler + U SSC_Handler + U SUPC_Handler + U SVC_Handler + U SysTick_Handler + U TC0_Handler + U TC1_Handler + U TC2_Handler + U TC3_Handler + U TC4_Handler + U TC5_Handler + U TC6_Handler + U TC7_Handler + U TC8_Handler + U TRNG_Handler + U TWI0_Handler + U TWI1_Handler + U UART_Handler + U UOTGHS_Handler + U USART0_Handler + U USART1_Handler + U USART2_Handler + U USART3_Handler + U UsageFault_Handler + U WDT_Handler U _erelocate U _estack U _etext