Consolidate interrupt management in core as esp/interrupts.h & esp_interrupts.c
This commit is contained in:
parent
65307aed75
commit
ed8470631f
8 changed files with 83 additions and 98 deletions
|
@ -265,60 +265,3 @@ void IRAM vPortExitCritical( void )
|
|||
portENABLE_INTERRUPTS();
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* Main ISR handler for FreeRTOS side of the ESP libs?
|
||||
|
||||
As far as I can tell, the "real" Xtensa ISRs ("Exceptions") are
|
||||
handled in libmain.a (xtensa_vectors.o) which then can call into here
|
||||
passing an interrupt mask.
|
||||
*/
|
||||
|
||||
_xt_isr isr[16];
|
||||
|
||||
void IRAM _xt_isr_attach(uint8_t i, _xt_isr func)
|
||||
{
|
||||
isr[i] = func;
|
||||
}
|
||||
|
||||
uint16_t IRAM _xt_isr_handler(uint16_t i)
|
||||
{
|
||||
uint8_t index;
|
||||
|
||||
/* I think this is implementing some kind of interrupt priority or
|
||||
short-circuiting an expensive ffs for most common interrupts - ie
|
||||
WDT And GPIO are common or high priority, then remaining flags.
|
||||
*/
|
||||
if (i & (1 << INUM_WDT)) {
|
||||
index = INUM_WDT;
|
||||
}
|
||||
else if (i & (1 << INUM_GPIO)) {
|
||||
index = INUM_GPIO;
|
||||
}else {
|
||||
index = __builtin_ffs(i) - 1;
|
||||
|
||||
if (index == INUM_MAX) {
|
||||
/* I don't understand what happens here. INUM_MAX is not
|
||||
the highest interrupt number listed (and the isr array
|
||||
has 16 entries).
|
||||
|
||||
Clearing that flag and then setting index to
|
||||
__builtin_ffs(i)-1 may result in index == 255 if no
|
||||
higher flags are set, unless this is guarded against
|
||||
somehow by the caller?
|
||||
|
||||
I also don't understand why the code is written like
|
||||
this in esp_iot_rtos_sdk instead of just putting the i
|
||||
&= line near the top... Probably no good reason?
|
||||
*/
|
||||
i &= ~(1 << INUM_MAX);
|
||||
index = __builtin_ffs(i) - 1;
|
||||
}
|
||||
}
|
||||
|
||||
_xt_clear_ints(1<<index);
|
||||
|
||||
isr[index]();
|
||||
|
||||
return i & ~(1 << index);
|
||||
}
|
||||
|
|
|
@ -73,8 +73,8 @@ extern "C" {
|
|||
#include "esp8266.h"
|
||||
#include "espressif/esp8266/ets_sys.h"
|
||||
#include <stdint.h>
|
||||
#include "xtensa_rtos.h"
|
||||
#include "xtensa_interrupts.h"
|
||||
#include "xtensa_rtos.h"
|
||||
#include <esp/interrupts.h>
|
||||
|
||||
/*-----------------------------------------------------------
|
||||
* Port specific definitions for ESP8266
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue