aboutsummaryrefslogtreecommitdiff
path: root/rtic-monotonics/src/lib.rs
diff options
context:
space:
mode:
authorEmil Fresk <emil.fresk@gmail.com>2023-04-02 20:32:10 +0200
committerEmil Fresk <emil.fresk@gmail.com>2023-04-04 21:40:19 +0200
commitaeec8bd41bdf3d57098902407ec320f59365641a (patch)
tree024dbdb94cb5537312c5c34f121257265c165bea /rtic-monotonics/src/lib.rs
parenta2f153249f926876e7169016f3dc8e861a9ef065 (diff)
Add setting of priority to interrupts
Diffstat (limited to 'rtic-monotonics/src/lib.rs')
-rw-r--r--rtic-monotonics/src/lib.rs36
1 files changed, 36 insertions, 0 deletions
diff --git a/rtic-monotonics/src/lib.rs b/rtic-monotonics/src/lib.rs
index fab0b2d..04ce4e2 100644
--- a/rtic-monotonics/src/lib.rs
+++ b/rtic-monotonics/src/lib.rs
@@ -26,6 +26,42 @@ pub mod rp2040;
))]
pub mod nrf;
+#[allow(dead_code)]
+pub(crate) const fn cortex_logical2hw(logical: u8, nvic_prio_bits: u8) -> u8 {
+ ((1 << nvic_prio_bits) - logical) << (8 - nvic_prio_bits)
+}
+
+#[cfg(any(
+ feature = "rp2040",
+ feature = "nrf52810",
+ feature = "nrf52811",
+ feature = "nrf52832",
+ feature = "nrf52833",
+ feature = "nrf52840",
+ feature = "nrf5340-app",
+ feature = "nrf5340-net",
+ feature = "nrf9160",
+))]
+pub(crate) unsafe fn set_monotonic_prio(
+ prio_bits: u8,
+ interrupt: impl cortex_m::interrupt::InterruptNumber,
+) {
+ extern "C" {
+ static RTIC_ASYNC_MAX_LOGICAL_PRIO: u8;
+ }
+
+ let max_prio = RTIC_ASYNC_MAX_LOGICAL_PRIO.max(1).min(1 << prio_bits);
+
+ let hw_prio = crate::cortex_logical2hw(max_prio, prio_bits);
+
+ // We take ownership of the entire IRQ and all settings to it, we only change settings
+ // for the IRQ we control.
+ // This will also compile-error in case the NVIC changes in size.
+ let mut nvic: cortex_m::peripheral::NVIC = core::mem::transmute(());
+
+ nvic.set_priority(interrupt, hw_prio);
+}
+
/// This marker is implemented on an interrupt token to enforce that the right tokens
/// are given to the correct monotonic implementation.
///