summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--shared/runtime/mpirq.c25
-rw-r--r--shared/runtime/mpirq.h1
2 files changed, 18 insertions, 8 deletions
diff --git a/shared/runtime/mpirq.c b/shared/runtime/mpirq.c
index 6111b9b10..0b3489c51 100644
--- a/shared/runtime/mpirq.c
+++ b/shared/runtime/mpirq.c
@@ -65,9 +65,10 @@ void mp_irq_init(mp_irq_obj_t *self, const mp_irq_methods_t *methods, mp_obj_t p
self->ishard = false;
}
-void mp_irq_handler(mp_irq_obj_t *self) {
- if (self->handler != mp_const_none) {
- if (self->ishard) {
+int mp_irq_dispatch(mp_obj_t handler, mp_obj_t parent, bool ishard) {
+ int result = 0;
+ if (handler != mp_const_none) {
+ if (ishard) {
// When executing code within a handler we must lock the scheduler to
// prevent any scheduled callbacks from running, and lock the GC to
// prevent any memory allocations.
@@ -75,22 +76,30 @@ void mp_irq_handler(mp_irq_obj_t *self) {
gc_lock();
nlr_buf_t nlr;
if (nlr_push(&nlr) == 0) {
- mp_call_function_1(self->handler, self->parent);
+ mp_call_function_1(handler, parent);
nlr_pop();
} else {
- // Uncaught exception; disable the callback so that it doesn't run again
- self->methods->trigger(self->parent, 0);
- self->handler = mp_const_none;
mp_printf(MICROPY_ERROR_PRINTER, "Uncaught exception in IRQ callback handler\n");
mp_obj_print_exception(MICROPY_ERROR_PRINTER, MP_OBJ_FROM_PTR(nlr.ret_val));
+ result = -1;
}
gc_unlock();
mp_sched_unlock();
} else {
// Schedule call to user function
- mp_sched_schedule(self->handler, self->parent);
+ mp_sched_schedule(handler, parent);
}
}
+ return result;
+}
+
+
+void mp_irq_handler(mp_irq_obj_t *self) {
+ if (mp_irq_dispatch(self->handler, self->parent, self->ishard) < 0) {
+ // Uncaught exception; disable the callback so that it doesn't run again
+ self->methods->trigger(self->parent, 0);
+ self->handler = mp_const_none;
+ }
}
/******************************************************************************/
diff --git a/shared/runtime/mpirq.h b/shared/runtime/mpirq.h
index dd423c010..c65741e0e 100644
--- a/shared/runtime/mpirq.h
+++ b/shared/runtime/mpirq.h
@@ -77,6 +77,7 @@ extern const mp_obj_type_t mp_irq_type;
mp_irq_obj_t *mp_irq_new(const mp_irq_methods_t *methods, mp_obj_t parent);
void mp_irq_init(mp_irq_obj_t *self, const mp_irq_methods_t *methods, mp_obj_t parent);
+int mp_irq_dispatch(mp_obj_t handler, mp_obj_t parent, bool ishard);
void mp_irq_handler(mp_irq_obj_t *self);
#endif // MICROPY_INCLUDED_LIB_UTILS_MPIRQ_H