stmhal: in EXTI interrupt handler wrap uPy calls in gc_lock and nlr_buf.

pull/452/head
Damien George 2014-04-08 15:21:26 +01:00
rodzic 72cfc6ef0a
commit 2137bc7124
1 zmienionych plików z 17 dodań i 3 usunięć

Wyświetl plik

@ -4,12 +4,13 @@
#include <stm32f4xx_hal.h>
#include "nlr.h"
#include "misc.h"
#include "mpconfig.h"
#include "qstr.h"
#include "gc.h"
#include "obj.h"
#include "runtime.h"
#include "nlr.h"
#include "pin.h"
#include "exti.h"
@ -297,14 +298,27 @@ void exti_init(void) {
}
}
// Interrupt handler
void Handle_EXTI_Irq(uint32_t line) {
if (__HAL_GPIO_EXTI_GET_FLAG(1 << line)) {
__HAL_GPIO_EXTI_CLEAR_FLAG(1 << line);
if (line < EXTI_NUM_VECTORS) {
exti_vector_t *v = &exti_vector[line];
if (v->callback_obj != mp_const_none) {
// TODO need to wrap this in an nlr_buf; really need a general function for this
mp_call_function_1(v->callback_obj, MP_OBJ_NEW_SMALL_INT(line));
// When executing code within a handler we must lock the GC to prevent
// any memory allocations. We must also catch any exceptions.
gc_lock();
nlr_buf_t nlr;
if (nlr_push(&nlr) == 0) {
mp_call_function_1(v->callback_obj, MP_OBJ_NEW_SMALL_INT(line));
nlr_pop();
} else {
// Uncaught exception; disable the callback so it doesn't run again.
v->callback_obj = mp_const_none;
printf("Uncaught exception in EXTI interrupt handler on line %lu\n", line);
mp_obj_print_exception((mp_obj_t)nlr.ret_val);
}
gc_unlock();
}
}
}