Elengedtem a makrót, végül ezt csináltam:
typedef void (*isr_t)(void);
static inline bool interrupt_test_and_run(uint8_t pie, uint8_t pir, uint8_t mask, isr_t isr) {
bool ret;
ret = isr && (pie & pir & mask);
if (ret) isr();
return ret;
}
void __interrupt() INTERRUPT_InterruptManager(void) {
bool done;
done = false;
done |= interrupt_test_and_run(PIE3, PIR3, _PIR3_TMR0IF_MASK, tmr0_isr);
done |= interrupt_test_and_run(PIE4, PIR4, _PIR4_U1RXIF_MASK, rx_isr);
done |= interrupt_test_and_run(PIE4, PIR4, _PIR4_U1TXIF_MASK, tx_isr);
if (!done) RESET(); // unhandled interrupt
}
Kérdés, hogy a függvénypointer átadásánál rájön-e arra, hogy ez fordítási időben eldől, mert már akkor tudható a cím, és közvetlenül egy hívássá fordítható mindenféle futásidejű címszámítás nélkül.