X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fcpu%2Fcortex-m3%2Fdrv%2Firq.c;fp=bertos%2Fcpu%2Fcortex-m3%2Fdrv%2Firq.c;h=0da77c8545178df4e6a7c03e52252a3c7576be40;hb=4cedc580e66cca972b055b9002ccadada6d5da75;hp=0000000000000000000000000000000000000000;hpb=42915fdb2ea25ed68b8bb835b78c2bca9b32f1f5;p=bertos.git diff --git a/bertos/cpu/cortex-m3/drv/irq.c b/bertos/cpu/cortex-m3/drv/irq.c new file mode 100644 index 00000000..0da77c85 --- /dev/null +++ b/bertos/cpu/cortex-m3/drv/irq.c @@ -0,0 +1,86 @@ +/** + * \file + * + * + * \brief Cortex-M3 IRQ management. + * + * \author Andrea Righi + */ + +#include +#include +#include "io/lm3s.h" +#include "irq.h" + +static void (*irq_table[NUM_INTERRUPTS])(void) + __attribute__((section("vtable"))); + +static void unhandled_isr(void) +{ + /* Unhandled IRQ */ + ASSERT(0); +} + +void sysirq_setHandler(sysirq_t irq, sysirq_handler_t handler) +{ + cpu_flags_t flags; + + ASSERT(irq < NUM_INTERRUPTS); + + IRQ_SAVE_DISABLE(flags); + irq_table[irq] = handler; + IRQ_RESTORE(flags); +} + +void sysirq_freeHandler(sysirq_t irq) +{ + cpu_flags_t flags; + + ASSERT(irq < NUM_INTERRUPTS); + + IRQ_SAVE_DISABLE(flags); + irq_table[irq] = unhandled_isr; + IRQ_RESTORE(flags); +} + +void sysirq_init(void) +{ + cpu_flags_t flags; + int i; + + IRQ_SAVE_DISABLE(flags); + for (i = 0; i < NUM_INTERRUPTS; i++) + irq_table[i] = unhandled_isr; + + /* Update NVIC to point to the new vector table */ + HWREG(NVIC_VTABLE) = (size_t)irq_table; + IRQ_RESTORE(flags); +}