89c481c606
RTOS Timer tick handler is now the same as any other ISR. This causes a few subtle behaviour changes that seem OK but are worth noting: * RTOS tick handler sdk__xt_timer_int() is now called from one stack frame deeper (inside _xt_isr_handler()), whereas before it was called from the level above in UserHandleInterrupt. I can't see any way that the extra ~40 bytes of stack use here hurt, though. * sdk__xt_timer_int() was previous called after all other interrupts flagged in the handler, now it's called before the TIMER FRC1 & FRC2 handlers. The tick handler doesn't appear to do anything particularly timing intensive, though. * GPIO interrupt (value 3) is now lower priority than the SPI interrupt (value 2), whereas before it would have been called before SPI if both interrupts triggered at once.
39 lines
832 B
C
39 lines
832 B
C
/* ESP8266 Xtensa interrupt management functions
|
|
*
|
|
*
|
|
* Part of esp-open-rtos
|
|
* Copyright (C) 2015 Angus Gratton
|
|
* BSD Licensed as described in the file LICENSE
|
|
*/
|
|
#include <esp/interrupts.h>
|
|
|
|
_xt_isr isr[16];
|
|
|
|
void IRAM _xt_isr_attach(uint8_t i, _xt_isr func)
|
|
{
|
|
isr[i] = func;
|
|
}
|
|
|
|
/* Generic ISR handler.
|
|
|
|
Handles all flags set for interrupts in 'intset'.
|
|
*/
|
|
uint16_t IRAM _xt_isr_handler(uint16_t intset)
|
|
{
|
|
/* WDT has highest priority (occasional WDT resets otherwise) */
|
|
if(intset & BIT(INUM_WDT)) {
|
|
_xt_clear_ints(BIT(INUM_WDT));
|
|
isr[INUM_WDT]();
|
|
intset -= BIT(INUM_WDT);
|
|
}
|
|
|
|
while(intset) {
|
|
uint8_t index = __builtin_ffs(intset) - 1;
|
|
uint16_t mask = BIT(index);
|
|
_xt_clear_ints(mask);
|
|
isr[index]();
|
|
intset -= mask;
|
|
}
|
|
|
|
return 0;
|
|
}
|