aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ports/esp32/machine_timer.c23
-rw-r--r--ports/esp32/main.c2
-rw-r--r--ports/esp32/modmachine.h1
-rw-r--r--ports/esp32/mpconfigport.h3
4 files changed, 29 insertions, 0 deletions
diff --git a/ports/esp32/machine_timer.c b/ports/esp32/machine_timer.c
index 7dca9e014..081a46b9c 100644
--- a/ports/esp32/machine_timer.c
+++ b/ports/esp32/machine_timer.c
@@ -56,10 +56,14 @@ typedef struct _machine_timer_obj_t {
mp_obj_t callback;
intr_handle_t handle;
+
+ struct _machine_timer_obj_t *next;
} machine_timer_obj_t;
const mp_obj_type_t machine_timer_type;
+STATIC void machine_timer_disable(machine_timer_obj_t *self);
+
STATIC esp_err_t check_esp_err(esp_err_t code) {
if (code) {
mp_raise_OSError(code);
@@ -68,6 +72,12 @@ STATIC esp_err_t check_esp_err(esp_err_t code) {
return code;
}
+void machine_timer_deinit_all(void) {
+ while (MP_STATE_PORT(machine_timer_obj_head) != NULL) {
+ machine_timer_disable(MP_STATE_PORT(machine_timer_obj_head));
+ }
+}
+
STATIC void machine_timer_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
machine_timer_obj_t *self = self_in;
@@ -88,6 +98,7 @@ STATIC mp_obj_t machine_timer_make_new(const mp_obj_type_t *type, size_t n_args,
self->group = (mp_obj_get_int(args[0]) >> 1) & 1;
self->index = mp_obj_get_int(args[0]) & 1;
+ self->next = NULL;
return self;
}
@@ -98,6 +109,14 @@ STATIC void machine_timer_disable(machine_timer_obj_t *self) {
esp_intr_free(self->handle);
self->handle = NULL;
}
+
+ // Remove the timer from the linked-list of active timers
+ for (machine_timer_obj_t **t = &MP_STATE_PORT(machine_timer_obj_head); *t; t = &(*t)->next) {
+ if (*t == self) {
+ *t = (*t)->next;
+ break;
+ }
+ }
}
STATIC void machine_timer_isr(void *self_in) {
@@ -131,6 +150,10 @@ STATIC void machine_timer_enable(machine_timer_obj_t *self) {
check_esp_err(timer_enable_intr(self->group, self->index));
check_esp_err(timer_isr_register(self->group, self->index, machine_timer_isr, (void*)self, TIMER_FLAGS, &self->handle));
check_esp_err(timer_start(self->group, self->index));
+
+ // Add the timer to the linked-list of active timers
+ self->next = MP_STATE_PORT(machine_timer_obj_head);
+ MP_STATE_PORT(machine_timer_obj_head) = self;
}
STATIC mp_obj_t machine_timer_init_helper(machine_timer_obj_t *self, mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
diff --git a/ports/esp32/main.c b/ports/esp32/main.c
index 9ca88699d..01d22d3e7 100644
--- a/ports/esp32/main.c
+++ b/ports/esp32/main.c
@@ -109,6 +109,8 @@ soft_reset:
}
}
+ machine_timer_deinit_all();
+
#if MICROPY_PY_THREAD
mp_thread_deinit();
#endif
diff --git a/ports/esp32/modmachine.h b/ports/esp32/modmachine.h
index c8513a471..b65b427b4 100644
--- a/ports/esp32/modmachine.h
+++ b/ports/esp32/modmachine.h
@@ -22,5 +22,6 @@ extern const mp_obj_type_t machine_rtc_type;
void machine_pins_init(void);
void machine_pins_deinit(void);
+void machine_timer_deinit_all(void);
#endif // MICROPY_INCLUDED_ESP32_MODMACHINE_H
diff --git a/ports/esp32/mpconfigport.h b/ports/esp32/mpconfigport.h
index 0f8deb11c..a70f6d318 100644
--- a/ports/esp32/mpconfigport.h
+++ b/ports/esp32/mpconfigport.h
@@ -210,9 +210,12 @@ extern const struct _mp_obj_module_t mp_module_onewire;
#define MP_STATE_PORT MP_STATE_VM
+struct _machine_timer_obj_t;
+
#define MICROPY_PORT_ROOT_POINTERS \
const char *readline_hist[8]; \
mp_obj_t machine_pin_irq_handler[40]; \
+ struct _machine_timer_obj_t *machine_timer_obj_head; \
// type definitions for the specific machine