AVR: Faster Interrupts, no size change.

Fixes #2408
This commit is contained in:
Andrew J. Kroll 2014-11-03 08:57:03 -05:00 committed by Cristian Maglie
parent fb078fcb11
commit 36f11ebcc6
1 changed files with 37 additions and 23 deletions

View File

@ -32,7 +32,37 @@
#include "wiring_private.h" #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; // volatile static voidFuncPtr twiIntFunc;
void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) { void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) {
@ -238,7 +268,7 @@ void detachInterrupt(uint8_t interruptNum) {
#endif #endif
} }
intFunc[interruptNum] = 0; intFunc[interruptNum] = nothing;
} }
} }
@ -250,87 +280,71 @@ void attachInterruptTwi(void (*userFunc)(void) ) {
#if defined(__AVR_ATmega32U4__) #if defined(__AVR_ATmega32U4__)
ISR(INT0_vect) { ISR(INT0_vect) {
if(intFunc[EXTERNAL_INT_0]) intFunc[EXTERNAL_INT_0]();
intFunc[EXTERNAL_INT_0]();
} }
ISR(INT1_vect) { ISR(INT1_vect) {
if(intFunc[EXTERNAL_INT_1]) intFunc[EXTERNAL_INT_1]();
intFunc[EXTERNAL_INT_1]();
} }
ISR(INT2_vect) { ISR(INT2_vect) {
if(intFunc[EXTERNAL_INT_2]) intFunc[EXTERNAL_INT_2]();
intFunc[EXTERNAL_INT_2]();
} }
ISR(INT3_vect) { ISR(INT3_vect) {
if(intFunc[EXTERNAL_INT_3]) intFunc[EXTERNAL_INT_3]();
intFunc[EXTERNAL_INT_3]();
} }
ISR(INT6_vect) { ISR(INT6_vect) {
if(intFunc[EXTERNAL_INT_4]) intFunc[EXTERNAL_INT_4]();
intFunc[EXTERNAL_INT_4]();
} }
#elif defined(EICRA) && defined(EICRB) #elif defined(EICRA) && defined(EICRB)
ISR(INT0_vect) { ISR(INT0_vect) {
if(intFunc[EXTERNAL_INT_2])
intFunc[EXTERNAL_INT_2](); intFunc[EXTERNAL_INT_2]();
} }
ISR(INT1_vect) { ISR(INT1_vect) {
if(intFunc[EXTERNAL_INT_3])
intFunc[EXTERNAL_INT_3](); intFunc[EXTERNAL_INT_3]();
} }
ISR(INT2_vect) { ISR(INT2_vect) {
if(intFunc[EXTERNAL_INT_4])
intFunc[EXTERNAL_INT_4](); intFunc[EXTERNAL_INT_4]();
} }
ISR(INT3_vect) { ISR(INT3_vect) {
if(intFunc[EXTERNAL_INT_5])
intFunc[EXTERNAL_INT_5](); intFunc[EXTERNAL_INT_5]();
} }
ISR(INT4_vect) { ISR(INT4_vect) {
if(intFunc[EXTERNAL_INT_0])
intFunc[EXTERNAL_INT_0](); intFunc[EXTERNAL_INT_0]();
} }
ISR(INT5_vect) { ISR(INT5_vect) {
if(intFunc[EXTERNAL_INT_1])
intFunc[EXTERNAL_INT_1](); intFunc[EXTERNAL_INT_1]();
} }
ISR(INT6_vect) { ISR(INT6_vect) {
if(intFunc[EXTERNAL_INT_6])
intFunc[EXTERNAL_INT_6](); intFunc[EXTERNAL_INT_6]();
} }
ISR(INT7_vect) { ISR(INT7_vect) {
if(intFunc[EXTERNAL_INT_7])
intFunc[EXTERNAL_INT_7](); intFunc[EXTERNAL_INT_7]();
} }
#else #else
ISR(INT0_vect) { ISR(INT0_vect) {
if(intFunc[EXTERNAL_INT_0])
intFunc[EXTERNAL_INT_0](); intFunc[EXTERNAL_INT_0]();
} }
ISR(INT1_vect) { ISR(INT1_vect) {
if(intFunc[EXTERNAL_INT_1])
intFunc[EXTERNAL_INT_1](); intFunc[EXTERNAL_INT_1]();
} }
#if defined(EICRA) && defined(ISC20) #if defined(EICRA) && defined(ISC20)
ISR(INT2_vect) { ISR(INT2_vect) {
if(intFunc[EXTERNAL_INT_2])
intFunc[EXTERNAL_INT_2](); intFunc[EXTERNAL_INT_2]();
} }
#endif #endif