diff options
author | Damien George <damien.p.george@gmail.com> | 2016-06-01 17:26:49 +0100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2016-06-01 17:26:49 +0100 |
commit | 927388e80ecac345147597c1d7a53b0c1848f609 (patch) | |
tree | dc3789805d850535d82a30f48b3d71573fb97118 /esp8266 | |
parent | 752e952096815adc2e418967e4b056680924a584 (diff) | |
download | micropython-927388e80ecac345147597c1d7a53b0c1848f609.tar.gz micropython-927388e80ecac345147597c1d7a53b0c1848f609.zip |
esp8266: Provide a dedicated variable to disable ets_loop_iter.
So ets_loop_iter is now only disabled when using machine.disable_irq.
Diffstat (limited to 'esp8266')
-rw-r--r-- | esp8266/ets_alt_task.c | 6 | ||||
-rw-r--r-- | esp8266/ets_alt_task.h | 1 | ||||
-rw-r--r-- | esp8266/modmachine.c | 14 |
3 files changed, 16 insertions, 5 deletions
diff --git a/esp8266/ets_alt_task.c b/esp8266/ets_alt_task.c index 563aeb5acb..62872affb9 100644 --- a/esp8266/ets_alt_task.c +++ b/esp8266/ets_alt_task.c @@ -1,11 +1,11 @@ #include <stdio.h> -#include "xtirq.h" #include "osapi.h" #include "os_type.h" #include "ets_sys.h" #include <esp_sdk_ver.h> #include "etshal.h" #include "user_interface.h" +#include "ets_alt_task.h" // Use standard ets_task or alternative impl #define USE_ETS_TASK 0 @@ -108,8 +108,10 @@ bool ets_post(uint8 prio, os_signal_t sig, os_param_t param) { #endif } +int ets_loop_iter_disable = 0; + bool ets_loop_iter(void) { - if (query_irq() != 0) { + if (ets_loop_iter_disable) { return false; } //static unsigned cnt; diff --git a/esp8266/ets_alt_task.h b/esp8266/ets_alt_task.h index c423995841..4b5ba26dbd 100644 --- a/esp8266/ets_alt_task.h +++ b/esp8266/ets_alt_task.h @@ -1 +1,2 @@ +extern int ets_loop_iter_disable; bool ets_loop_iter(void); diff --git a/esp8266/modmachine.c b/esp8266/modmachine.c index 26494ac28e..36872c9dff 100644 --- a/esp8266/modmachine.c +++ b/esp8266/modmachine.c @@ -191,13 +191,21 @@ const mp_obj_type_t esp_timer_type = { .locals_dict = (mp_obj_t)&esp_timer_locals_dict, }; +// this bit is unused in the Xtensa PS register +#define ETS_LOOP_ITER_BIT (12) + STATIC mp_obj_t machine_disable_irq(void) { - return mp_obj_new_int(disable_irq()); + 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 mp_obj_new_int(state); } MP_DEFINE_CONST_FUN_OBJ_0(machine_disable_irq_obj, machine_disable_irq); -STATIC mp_obj_t machine_enable_irq(mp_obj_t state) { - enable_irq(mp_obj_get_int(state)); +STATIC mp_obj_t machine_enable_irq(mp_obj_t state_in) { + uint32_t state = mp_obj_get_int(state_in); + ets_loop_iter_disable = (state >> ETS_LOOP_ITER_BIT) & 1; + enable_irq(state & ~(1 << ETS_LOOP_ITER_BIT)); return mp_const_none; } MP_DEFINE_CONST_FUN_OBJ_1(machine_enable_irq_obj, machine_enable_irq); |