summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2021-04-27 16:30:58 +1000
committerDamien George <damien@micropython.org>2021-04-29 16:54:35 +1000
commit89b64478c73d2228419e77a4450c004157ec725a (patch)
treeab96181b33c920814e318fc4d3646b1ea3ee77cc
parent326dd7f0dbbadc4a536636d486600ce93dade8c5 (diff)
stm32/softtimer: Add support for having a C-based callback.
Signed-off-by: Damien George <damien@micropython.org>
-rw-r--r--ports/stm32/machine_timer.c7
-rw-r--r--ports/stm32/softtimer.c6
-rw-r--r--ports/stm32/softtimer.h10
3 files changed, 17 insertions, 6 deletions
diff --git a/ports/stm32/machine_timer.c b/ports/stm32/machine_timer.c
index c37ac8767..3f83d5ba6 100644
--- a/ports/stm32/machine_timer.c
+++ b/ports/stm32/machine_timer.c
@@ -76,10 +76,10 @@ STATIC mp_obj_t machine_timer_init_helper(machine_timer_obj_t *self, size_t n_ar
self->expiry_ms = mp_hal_ticks_ms() + self->delta_ms;
if (args[ARG_callback].u_obj != MP_OBJ_NULL) {
- self->callback = args[ARG_callback].u_obj;
+ self->py_callback = args[ARG_callback].u_obj;
}
- if (self->callback != mp_const_none) {
+ if (self->py_callback != mp_const_none) {
soft_timer_insert(self);
}
@@ -89,8 +89,9 @@ STATIC mp_obj_t machine_timer_init_helper(machine_timer_obj_t *self, size_t n_ar
STATIC mp_obj_t machine_timer_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
machine_timer_obj_t *self = m_new_obj(machine_timer_obj_t);
self->pairheap.base.type = &machine_timer_type;
+ self->flags = SOFT_TIMER_FLAG_PY_CALLBACK;
self->delta_ms = 1000;
- self->callback = mp_const_none;
+ self->py_callback = mp_const_none;
// Get timer id (only soft timer (-1) supported at the moment)
mp_int_t id = -1;
diff --git a/ports/stm32/softtimer.c b/ports/stm32/softtimer.c
index d0a186c7d..7e439d4e7 100644
--- a/ports/stm32/softtimer.c
+++ b/ports/stm32/softtimer.c
@@ -64,7 +64,11 @@ void soft_timer_handler(void) {
while (heap != NULL && TICKS_DIFF(heap->expiry_ms, ticks_ms) <= 0) {
soft_timer_entry_t *entry = heap;
heap = (soft_timer_entry_t *)mp_pairheap_pop(soft_timer_lt, &heap->pairheap);
- mp_sched_schedule(entry->callback, MP_OBJ_FROM_PTR(entry));
+ if (entry->flags & SOFT_TIMER_FLAG_PY_CALLBACK) {
+ mp_sched_schedule(entry->py_callback, MP_OBJ_FROM_PTR(entry));
+ } else {
+ entry->c_callback(entry);
+ }
if (entry->mode == SOFT_TIMER_MODE_PERIODIC) {
entry->expiry_ms += entry->delta_ms;
heap = (soft_timer_entry_t *)mp_pairheap_push(soft_timer_lt, &heap->pairheap, &entry->pairheap);
diff --git a/ports/stm32/softtimer.h b/ports/stm32/softtimer.h
index a80d9087b..6e06bbcc6 100644
--- a/ports/stm32/softtimer.h
+++ b/ports/stm32/softtimer.h
@@ -28,15 +28,21 @@
#include "py/pairheap.h"
+#define SOFT_TIMER_FLAG_PY_CALLBACK (1)
+
#define SOFT_TIMER_MODE_ONE_SHOT (1)
#define SOFT_TIMER_MODE_PERIODIC (2)
typedef struct _soft_timer_entry_t {
mp_pairheap_t pairheap;
- uint32_t mode;
+ uint16_t flags;
+ uint16_t mode;
uint32_t expiry_ms;
uint32_t delta_ms; // for periodic mode
- mp_obj_t callback;
+ union {
+ void (*c_callback)(struct _soft_timer_entry_t *);
+ mp_obj_t py_callback;
+ };
} soft_timer_entry_t;
extern volatile uint32_t soft_timer_next;