From a01757670687b3f5cd207b8f5e1008b687be27ea Mon Sep 17 00:00:00 2001 From: Damien George Date: Wed, 4 Mar 2020 13:31:36 +1100 Subject: [PATCH] esp8266/machine_pin: Disable ets_loop_iter during hard IRQ handler. Otherwise ets_loop_iter may be reentered. Related to issue #5714. --- ports/esp8266/machine_pin.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ports/esp8266/machine_pin.c b/ports/esp8266/machine_pin.c index c77bd5572..dcecea0b5 100644 --- a/ports/esp8266/machine_pin.c +++ b/ports/esp8266/machine_pin.c @@ -37,6 +37,7 @@ #include "py/gc.h" #include "py/mphal.h" #include "extmod/virtpin.h" +#include "ets_alt_task.h" #include "modmachine.h" #define GET_TRIGGER(phys_port) \ @@ -103,23 +104,26 @@ void pin_init0(void) { } void pin_intr_handler(uint32_t status) { - mp_sched_lock(); - gc_lock(); status &= 0xffff; for (int p = 0; status; ++p, status >>= 1) { if (status & 1) { mp_obj_t handler = MP_STATE_PORT(pin_irq_handler)[p]; if (handler != MP_OBJ_NULL) { if (pin_irq_is_hard[p]) { + int orig_ets_loop_iter_disable = ets_loop_iter_disable; + ets_loop_iter_disable = 1; + mp_sched_lock(); + gc_lock(); mp_call_function_1_protected(handler, MP_OBJ_FROM_PTR(&pyb_pin_obj[p])); + gc_unlock(); + mp_sched_unlock(); + ets_loop_iter_disable = orig_ets_loop_iter_disable; } else { mp_sched_schedule(handler, MP_OBJ_FROM_PTR(&pyb_pin_obj[p])); } } } } - gc_unlock(); - mp_sched_unlock(); } pyb_pin_obj_t *mp_obj_get_pin_obj(mp_obj_t pin_in) {