summaryrefslogtreecommitdiff
path: root/src/stm/ao_arch.h
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2016-11-20 02:59:40 -0800
committerKeith Packard <keithp@keithp.com>2017-02-20 12:32:50 -0800
commit839eadbc8e5694842eb498c6e47cfbf08ba8fbf4 (patch)
tree68d81c5df977993c91c823951dc826403fa75a8d /src/stm/ao_arch.h
parent088ddbb177efc8be2fc467524dc1668553080d3b (diff)
altos/stm: Allow use basepri instead of primask for masking interrupts
This allows for high priority interrupts (priority 0) to run, even when other interrupts are blocked. Code executing in such interrupt handlers must not attempt to control task execution as that will race with the scheduler. Select this by defining AO_NONMASK_INTERRUPT in ao_pins.h. non-maskable interrupt priority is AO_STM_NVIC_NONMASK_PRIORITY Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/stm/ao_arch.h')
-rw-r--r--src/stm/ao_arch.h13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/stm/ao_arch.h b/src/stm/ao_arch.h
index 3d09af3c..5f033b66 100644
--- a/src/stm/ao_arch.h
+++ b/src/stm/ao_arch.h
@@ -85,10 +85,6 @@ extern const uint32_t ao_radio_cal;
#define ao_arch_task_members\
uint32_t *sp; /* saved stack pointer */
-#define ao_arch_block_interrupts() asm("cpsid i")
-#define ao_arch_release_interrupts() asm("cpsie i")
-
-
/*
* For now, we're running at a weird frequency
*/
@@ -124,6 +120,15 @@ extern const uint32_t ao_radio_cal;
/* The stm32l implements only 4 bits of the priority fields */
+#if AO_NONMASK_INTERRUPT
+#define AO_STM_NVIC_NONMASK_PRIORITY 0x00
+
+/* Set the basepri register to this value to mask all
+ * non-maskable priorities
+ */
+#define AO_STM_NVIC_BASEPRI_MASK 0x10
+#endif
+
#define AO_STM_NVIC_HIGH_PRIORITY 0x40
#define AO_STM_NVIC_MED_PRIORITY 0x80
#define AO_STM_NVIC_LOW_PRIORITY 0xC0