From 65f00a69c74ca0def8d7f1d7597327945a04a33f Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Mon, 19 Nov 2012 23:37:19 +0100 Subject: [PATCH] Fixed weak-symbol issue with system interrupt handlers. --- .../sam/cores/arduino/cortex_handlers.c | 127 +++++++++++++----- hardware/arduino/sam/cores/arduino/hooks.c | 27 ++++ hardware/arduino/sam/cores/arduino/wiring.c | 12 -- .../ATMEL/sam3xa/source/gcc/startup_sam3xa.c | 91 +------------ .../arduino_due_x/libsam_sam3x8e_gcc_rel.a | Bin 86302 -> 85290 bytes .../libsam_sam3x8e_gcc_rel.a.txt | 101 +++++++------- 6 files changed, 171 insertions(+), 187 deletions(-) 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 822990651270eb1ce2ed99bfa977cfe85551ed13..390d2532e79be39d2f0dc6e8cb78087ff48162e4 100644 GIT binary patch delta 3121 zcmcJRZA@Eb6vzM1g?7ACUfZz&-Nq2KLKy`*b(0~}ec%I$)67LP-kRu~PzO#vpw}pg zm=M$Ll9Vh?8(Gv$KIp3HK4^l9W--R-GNP6y(0j6xL`UXyNx)jId=g<7WWR@?fq$};BbrlL!> zrfj3Rz!7`bt|rr>PdJy-q66y&)6CRk%vHHgR(@?uVr1AA{k`gZmX)v6_taW>B+s7nJMHecLokc%v1@cT!@Z?~w;;h7dy zwu~R+ySa#Qc>b?i^D9i-<0_vP5KlmC)`k^D(#CjcS%}! zCPy7Kb}e{SiSg#2<;MG-LgVzpD1F%gIRW?dsb6@jLDm4IU7@U-09CpAj4qd`$2OT?Ar+ zKN9?f;03`;f>rX*Mo){MSe{^goe0zj_6cqk+#z_6;6A~@RMs()8o-#~3BeJ;(}GV4 z{!s9l6mA6OQv$%Rg8vYlVLZ3^h%+$U8wd_PG|<0qsJrJt0Q&-iL*2a(M|T!Pv;*{@ zJ4sqDu$w&(pv?d@+PK}%PH&=%y#VNAF9f)cRzyGSC5fb=Q7YiXp_S6d%+2I4M=J+z;|mo)D|;ot`9*UlvX8a_=wRMxE^w2%z$$Zro6QAQn+v?b zTwsm4z}iIO(QX8Wc$}MnVRBvb(Ef)5Hv?nrb+q?kuLnZxUfScZHvp6DTYwkX>G?<4 zeZXt%O~5pJGw=p`3-A`ZA2`Ln6?ljJ7GQ?`R$!L1h(@=4ngiQ_PuRBupRwOg+YzyfxWIlVaFP8kpu4ZPZlFG~|K{I@Mzcn>(7D&^b-Rt9 ztMa0=zZ_qGwN%BZdR@@2B9|#wY$R8mOO2Jrf(})dZWh5_80 z{RYVTd=N0}%V^-PNxhrFRuD@K-N~J^!2ck1B^MR;dIXf_hj3U|BX#M??gt^3s~xQn z|4La)PS7T^)3pP56tQ`g@=DS`60RGhN}i?iq(tUNtmQCyG-23iz;81grpwh|_+((XIS`TkD=% z&`vsSL)We1ls5Qotn+}U$KwmHV2RJ;_mu=zRsZRWSh3|;JWxYn$Ux6iKr!TvBtf#0 z_;{0~Xd*W?{V{6snP3jU7_}F*GkK}Cho}`x3LWDVbcBX-Y#WK=b8HWZBe+R?ygu~D zE^$wC7d4{*Z=jDpKGwc^E#LApjXa@syRs9;X#Pb~0-a0L&bup_C#d98UpRq-(ttLJy%Han z_<4z6k$6<%i@g5y7f#@^#M2VrkoY@^f05WmOG{nh_-PWWSyD%d#M>m^E%5<~AD8&B z#7{-Cif1A_Fd*@;#BWJ_N#YMB{zT&02;OPM?T8L579|$+*qN6wQQ{2k{LRi~)MB;C z)8lJtdlGnvzmO#0VRk#fr9nvsxOgZjKr?$P(9WKQz;mgj6EN=!mI@^?SS}Ptu!Ja1 zfI>l82hbEK833JvvK}aAchOJX&5aGgnxe;h`bxqj>>|xFZ_Os_03FjIK z=NSp-8wnQ}2^Sg(7a0j}4pu9LuI}SF>K1z2?al>y{+U(Y4D#I{wymu zHrwh