From 9f7a5a7fdd53e7964b7bb699f5b261d6ee2720ae Mon Sep 17 00:00:00 2001 From: Angus Gratton Date: Thu, 24 Sep 2015 08:58:34 +1000 Subject: [PATCH] Consolidate interrupt management in core as esp/interrupts.h & esp_interrupts.c --- FreeRTOS/Source/portable/esp8266/port.c | 57 ------------------ FreeRTOS/Source/portable/esp8266/portmacro.h | 4 +- core/esp_interrupts.c | 60 +++++++++++++++++++ core/include/esp/cpu.h | 33 ---------- core/include/esp/gpio.h | 3 +- .../include/esp/interrupts.h | 19 +++++- core/include/esp/timer.h | 3 +- core/include/esp8266.h | 2 +- 8 files changed, 83 insertions(+), 98 deletions(-) create mode 100644 core/esp_interrupts.c delete mode 100644 core/include/esp/cpu.h rename include/xtensa_interrupts.h => core/include/esp/interrupts.h (79%) diff --git a/FreeRTOS/Source/portable/esp8266/port.c b/FreeRTOS/Source/portable/esp8266/port.c index 71c6658..89c95a1 100644 --- a/FreeRTOS/Source/portable/esp8266/port.c +++ b/FreeRTOS/Source/portable/esp8266/port.c @@ -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< -#include "xtensa_rtos.h" -#include "xtensa_interrupts.h" +#include "xtensa_rtos.h" +#include /*----------------------------------------------------------- * Port specific definitions for ESP8266 diff --git a/core/esp_interrupts.c b/core/esp_interrupts.c new file mode 100644 index 0000000..481011a --- /dev/null +++ b/core/esp_interrupts.c @@ -0,0 +1,60 @@ +/* ESP8266 Xtensa interrupt management functions + * + * + * Part of esp-open-rtos + * Copyright (C) 2015 Angus Gratton + * BSD Licensed as described in the file LICENSE + */ +#include + +_xt_isr isr[16]; + +void IRAM _xt_isr_attach(uint8_t i, _xt_isr func) +{ + isr[i] = func; +} + +/* This ISR handler is taken directly from the FreeRTOS port and + probably could use a cleanup. +*/ +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< - -/* Interrupt numbers for level 1 exception handler. - * - * Currently the UserExceptionVector calls down to _xt_isr_handler, - * defined in port.c, for at least some of these interrupts. Some are handled - * on the SDK side, though. - */ -typedef enum { - INUM_SPI = 2, - INUM_GPIO = 4, - INUM_UART = 5, - INUM_MAX = 6, /* in some places this is documented as timer0 CCOMPARE0 interrupt */ - INUM_SOFT = 7, - INUM_WDT = 8, - INUM_TIMER_FRC1 = 9, - - /* FRC2 default handler. Configured by sdk_ets_timer_init, which - runs as part of default libmain.a startup code, assigns - interrupt handler to sdk_vApplicationTickHook+0x68 - */ - INUM_TIMER_FRC2 = 10, -} xt_isr_num_t; - -#endif - diff --git a/core/include/esp/gpio.h b/core/include/esp/gpio.h index 4f431f2..da7bcfa 100644 --- a/core/include/esp/gpio.h +++ b/core/include/esp/gpio.h @@ -11,8 +11,7 @@ #include #include "esp/gpio_regs.h" #include "esp/iomux.h" -#include "esp/cpu.h" -#include "xtensa_interrupts.h" +#include "esp/interrupts.h" typedef enum { GPIO_INPUT, diff --git a/include/xtensa_interrupts.h b/core/include/esp/interrupts.h similarity index 79% rename from include/xtensa_interrupts.h rename to core/include/esp/interrupts.h index d06e2b9..f3d8279 100644 --- a/include/xtensa_interrupts.h +++ b/core/include/esp/interrupts.h @@ -1,4 +1,4 @@ -/* Xtensa interrupt management functions +/* ESP8266 Xtensa interrupt management functions * * Some (w/ sdk_ prefix) are implemented in binary libs, rest are * inlines replacing functions in the binary libraries. @@ -15,6 +15,23 @@ #include #include +/* Interrupt numbers for level 1 exception handler. */ +typedef enum { + INUM_SPI = 2, + INUM_GPIO = 4, + INUM_UART = 5, + INUM_MAX = 6, /* in some places this is documented as timer0 CCOMPARE0 interrupt */ + INUM_SOFT = 7, + INUM_WDT = 8, + INUM_TIMER_FRC1 = 9, + + /* FRC2 default handler. Configured by sdk_ets_timer_init, which + runs as part of default libmain.a startup code, assigns + interrupt handler to sdk_vApplicationTickHook+0x68 + */ + INUM_TIMER_FRC2 = 10, +} xt_isr_num_t; + void sdk__xt_int_exit (void); void _xt_user_exit (void); void sdk__xt_tick_timer_init (void); diff --git a/core/include/esp/timer.h b/core/include/esp/timer.h index b83a0ee..29c4a5b 100644 --- a/core/include/esp/timer.h +++ b/core/include/esp/timer.h @@ -10,9 +10,8 @@ #define _ESP_TIMER_H #include -#include #include "esp/timer_regs.h" -#include "esp/cpu.h" +#include "esp/interrupts.h" typedef enum { FRC1 = 0, diff --git a/core/include/esp8266.h b/core/include/esp8266.h index 968a522..d30ec0e 100644 --- a/core/include/esp8266.h +++ b/core/include/esp8266.h @@ -13,7 +13,7 @@ #include "common_macros.h" #include "esp/registers.h" -#include "esp/cpu.h" +#include "esp/interrupts.h" #include "esp/iomux.h" #include "esp/gpio.h" #include "esp/timer.h"