From 36f11ebcc622eb695e80c641dae0edad5b98e616 Mon Sep 17 00:00:00 2001 From: "Andrew J. Kroll" Date: Mon, 3 Nov 2014 08:57:03 -0500 Subject: AVR: Faster Interrupts, no size change. Fixes #2408 --- cores/arduino/WInterrupts.c | 60 ++++++++++++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 23 deletions(-) diff --git a/cores/arduino/WInterrupts.c b/cores/arduino/WInterrupts.c index 71dd45c..f974ce6 100644 --- a/cores/arduino/WInterrupts.c +++ b/cores/arduino/WInterrupts.c @@ -32,7 +32,37 @@ #include "wiring_private.h" -static volatile voidFuncPtr intFunc[EXTERNAL_NUM_INTERRUPTS]; +static void nothing(void) { +} + +static volatile voidFuncPtr intFunc[EXTERNAL_NUM_INTERRUPTS] = { +#if EXTERNAL_NUM_INTERRUPTS > 8 + #warning There are more than 8 external interrupts. Some callbacks may not be initialized. + nothing, +#endif +#if EXTERNAL_NUM_INTERRUPTS > 7 + nothing, +#endif +#if EXTERNAL_NUM_INTERRUPTS > 6 + nothing, +#endif +#if EXTERNAL_NUM_INTERRUPTS > 5 + nothing, +#endif +#if EXTERNAL_NUM_INTERRUPTS > 4 + nothing, +#endif +#if EXTERNAL_NUM_INTERRUPTS > 3 + nothing, +#endif +#if EXTERNAL_NUM_INTERRUPTS > 2 + nothing, +#endif +#if EXTERNAL_NUM_INTERRUPTS > 1 + nothing, +#endif + nothing +}; // volatile static voidFuncPtr twiIntFunc; void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) { @@ -238,7 +268,7 @@ void detachInterrupt(uint8_t interruptNum) { #endif } - intFunc[interruptNum] = 0; + intFunc[interruptNum] = nothing; } } @@ -250,87 +280,71 @@ void attachInterruptTwi(void (*userFunc)(void) ) { #if defined(__AVR_ATmega32U4__) ISR(INT0_vect) { - if(intFunc[EXTERNAL_INT_0]) - intFunc[EXTERNAL_INT_0](); + intFunc[EXTERNAL_INT_0](); } ISR(INT1_vect) { - if(intFunc[EXTERNAL_INT_1]) - intFunc[EXTERNAL_INT_1](); + intFunc[EXTERNAL_INT_1](); } ISR(INT2_vect) { - if(intFunc[EXTERNAL_INT_2]) - intFunc[EXTERNAL_INT_2](); + intFunc[EXTERNAL_INT_2](); } ISR(INT3_vect) { - if(intFunc[EXTERNAL_INT_3]) - intFunc[EXTERNAL_INT_3](); + intFunc[EXTERNAL_INT_3](); } ISR(INT6_vect) { - if(intFunc[EXTERNAL_INT_4]) - intFunc[EXTERNAL_INT_4](); + intFunc[EXTERNAL_INT_4](); } #elif defined(EICRA) && defined(EICRB) ISR(INT0_vect) { - if(intFunc[EXTERNAL_INT_2]) intFunc[EXTERNAL_INT_2](); } ISR(INT1_vect) { - if(intFunc[EXTERNAL_INT_3]) intFunc[EXTERNAL_INT_3](); } ISR(INT2_vect) { - if(intFunc[EXTERNAL_INT_4]) intFunc[EXTERNAL_INT_4](); } ISR(INT3_vect) { - if(intFunc[EXTERNAL_INT_5]) intFunc[EXTERNAL_INT_5](); } ISR(INT4_vect) { - if(intFunc[EXTERNAL_INT_0]) intFunc[EXTERNAL_INT_0](); } ISR(INT5_vect) { - if(intFunc[EXTERNAL_INT_1]) intFunc[EXTERNAL_INT_1](); } ISR(INT6_vect) { - if(intFunc[EXTERNAL_INT_6]) intFunc[EXTERNAL_INT_6](); } ISR(INT7_vect) { - if(intFunc[EXTERNAL_INT_7]) intFunc[EXTERNAL_INT_7](); } #else ISR(INT0_vect) { - if(intFunc[EXTERNAL_INT_0]) intFunc[EXTERNAL_INT_0](); } ISR(INT1_vect) { - if(intFunc[EXTERNAL_INT_1]) intFunc[EXTERNAL_INT_1](); } #if defined(EICRA) && defined(ISC20) ISR(INT2_vect) { - if(intFunc[EXTERNAL_INT_2]) intFunc[EXTERNAL_INT_2](); } #endif -- cgit v1.2.3-18-g5258