diff options
| author | Damien George <damien@micropython.org> | 2023-11-27 12:00:16 +1100 |
|---|---|---|
| committer | Damien George <damien@micropython.org> | 2023-11-30 16:11:11 +1100 |
| commit | 39d4153a8d91f1db3f2f034e5fa448b79ca14bc7 (patch) | |
| tree | a41ab2b6bc943e6056aee150a1f77ec28aebc80e | |
| parent | 4bf7987f0abfde47b0bac4e2e8546979802ba3c6 (diff) | |
esp8266/esp_mphal: Make atomic section more atomic.
By disabling ets_loop_iter when the atomic section is active.
Signed-off-by: Damien George <damien@micropython.org>
| -rw-r--r-- | ports/esp8266/esp_mphal.c | 15 | ||||
| -rw-r--r-- | ports/esp8266/mpconfigport.h | 8 |
2 files changed, 20 insertions, 3 deletions
diff --git a/ports/esp8266/esp_mphal.c b/ports/esp8266/esp_mphal.c index 7606bd4f6..06502e85c 100644 --- a/ports/esp8266/esp_mphal.c +++ b/ports/esp8266/esp_mphal.c @@ -166,6 +166,21 @@ void mp_hal_signal_dupterm_input(void) { system_os_post(DUPTERM_TASK_ID, 0, 0); } +// this bit is unused in the Xtensa PS register +#define ETS_LOOP_ITER_BIT (12) + +uint32_t esp_disable_irq(void) { + uint32_t state = disable_irq(); + state = (state & ~(1 << ETS_LOOP_ITER_BIT)) | (ets_loop_iter_disable << ETS_LOOP_ITER_BIT); + ets_loop_iter_disable = 1; + return state; +} + +void esp_enable_irq(uint32_t state) { + ets_loop_iter_disable = (state >> ETS_LOOP_ITER_BIT) & 1; + enable_irq(state & ~(1 << ETS_LOOP_ITER_BIT)); +} + // Get pointer to esf_buf bookkeeping structure void *ets_get_esf_buf_ctlblk(void) { // Get literal ptr before start of esf_rx_buf_alloc func diff --git a/ports/esp8266/mpconfigport.h b/ports/esp8266/mpconfigport.h index 1925fc3e7..ec36291ed 100644 --- a/ports/esp8266/mpconfigport.h +++ b/ports/esp8266/mpconfigport.h @@ -126,9 +126,8 @@ #define MICROPY_VM_HOOK_LOOP MICROPY_VM_HOOK_POLL #define MICROPY_VM_HOOK_RETURN MICROPY_VM_HOOK_POLL -#include "xtirq.h" -#define MICROPY_BEGIN_ATOMIC_SECTION() disable_irq() -#define MICROPY_END_ATOMIC_SECTION(state) enable_irq(state) +#define MICROPY_BEGIN_ATOMIC_SECTION() esp_disable_irq() +#define MICROPY_END_ATOMIC_SECTION(state) esp_enable_irq(state) // type definitions for the specific machine @@ -173,3 +172,6 @@ extern const struct _mp_print_t mp_debug_print; #define WDEV_HWRNG ((volatile uint32_t *)0x3ff20e44) #define _assert(expr) ((expr) ? (void)0 : __assert_func(__FILE__, __LINE__, __func__, #expr)) + +uint32_t esp_disable_irq(void); +void esp_enable_irq(uint32_t state); |
