summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2020-03-04 13:31:36 +1100
committerDamien George <damien.p.george@gmail.com>2020-03-10 16:48:34 +1100
commita01757670687b3f5cd207b8f5e1008b687be27ea (patch)
tree61f044e1f726802f1b5fa3ed6da8b2bf0d70ca1b
parent4fda7a5b44535d67a3778a2228dadbdcfa50d1b9 (diff)
esp8266/machine_pin: Disable ets_loop_iter during hard IRQ handler.
Otherwise ets_loop_iter may be reentered. Related to issue #5714.
-rw-r--r--ports/esp8266/machine_pin.c12
1 files 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) {