Browse Source

esp8266: Enable micropython.schedule() with locking in pin callback.

pull/2878/head
Damien George 8 years ago
parent
commit
1b7d67266d
  1. 1
      esp8266/esp8266_common.ld
  2. 7
      esp8266/esp_mphal.c
  3. 2
      esp8266/machine_pin.c
  4. 1
      esp8266/mpconfigport.h

1
esp8266/esp8266_common.ld

@ -100,6 +100,7 @@ SECTIONS
*py/qstr.o*(.literal* .text*) *py/qstr.o*(.literal* .text*)
*py/repl.o*(.literal* .text*) *py/repl.o*(.literal* .text*)
*py/runtime.o*(.literal* .text*) *py/runtime.o*(.literal* .text*)
*py/scheduler.o*(.literal* .text*)
*py/scope.o*(.literal* .text*) *py/scope.o*(.literal* .text*)
*py/sequence.o*(.literal* .text*) *py/sequence.o*(.literal* .text*)
*py/showbc.o*(.literal* .text*) *py/showbc.o*(.literal* .text*)

7
esp8266/esp_mphal.c

@ -33,6 +33,7 @@
#include "ets_alt_task.h" #include "ets_alt_task.h"
#include "py/obj.h" #include "py/obj.h"
#include "py/mpstate.h" #include "py/mpstate.h"
#include "py/runtime.h"
#include "extmod/misc.h" #include "extmod/misc.h"
#include "lib/utils/pyexec.h" #include "lib/utils/pyexec.h"
@ -130,11 +131,7 @@ void mp_hal_delay_ms(uint32_t delay) {
void ets_event_poll(void) { void ets_event_poll(void) {
ets_loop_iter(); ets_loop_iter();
if (MP_STATE_VM(mp_pending_exception) != NULL) { mp_handle_pending();
mp_obj_t obj = MP_STATE_VM(mp_pending_exception);
MP_STATE_VM(mp_pending_exception) = MP_OBJ_NULL;
nlr_raise(obj);
}
} }
void __assert_func(const char *file, int line, const char *func, const char *expr) { void __assert_func(const char *file, int line, const char *func, const char *expr) {

2
esp8266/machine_pin.c

@ -100,6 +100,7 @@ void pin_init0(void) {
} }
void pin_intr_handler(uint32_t status) { void pin_intr_handler(uint32_t status) {
mp_sched_lock();
gc_lock(); gc_lock();
status &= 0xffff; status &= 0xffff;
for (int p = 0; status; ++p, status >>= 1) { for (int p = 0; status; ++p, status >>= 1) {
@ -111,6 +112,7 @@ void pin_intr_handler(uint32_t status) {
} }
} }
gc_unlock(); gc_unlock();
mp_sched_unlock();
} }
pyb_pin_obj_t *mp_obj_get_pin_obj(mp_obj_t pin_in) { pyb_pin_obj_t *mp_obj_get_pin_obj(mp_obj_t pin_in) {

1
esp8266/mpconfigport.h

@ -28,6 +28,7 @@
#define MICROPY_MODULE_WEAK_LINKS (1) #define MICROPY_MODULE_WEAK_LINKS (1)
#define MICROPY_CAN_OVERRIDE_BUILTINS (1) #define MICROPY_CAN_OVERRIDE_BUILTINS (1)
#define MICROPY_USE_INTERNAL_ERRNO (1) #define MICROPY_USE_INTERNAL_ERRNO (1)
#define MICROPY_ENABLE_SCHEDULER (1)
#define MICROPY_PY_ALL_SPECIAL_METHODS (1) #define MICROPY_PY_ALL_SPECIAL_METHODS (1)
#define MICROPY_PY_BUILTINS_COMPLEX (0) #define MICROPY_PY_BUILTINS_COMPLEX (0)
#define MICROPY_PY_BUILTINS_STR_UNICODE (1) #define MICROPY_PY_BUILTINS_STR_UNICODE (1)

Loading…
Cancel
Save