aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/peripheral/nvic.rs31
1 files changed, 26 insertions, 5 deletions
diff --git a/src/peripheral/nvic.rs b/src/peripheral/nvic.rs
index 57ce009..d123b7d 100644
--- a/src/peripheral/nvic.rs
+++ b/src/peripheral/nvic.rs
@@ -104,23 +104,44 @@ impl NVIC {
}
/// Disables `interrupt`
- pub fn disable<I>(&mut self, interrupt: I)
+ pub fn mask<I>(interrupt: I)
where
I: Nr,
{
let nr = interrupt.nr();
-
- unsafe { self.icer[usize::from(nr / 32)].write(1 << (nr % 32)) }
+ // NOTE(unsafe) this is a write to a stateless register
+ unsafe { (*Self::ptr()).icer[usize::from(nr / 32)].write(1 << (nr % 32)) }
}
/// Enables `interrupt`
- pub fn enable<I>(&mut self, interrupt: I)
+ ///
+ /// This function is `unsafe` because it can break mask-based critical sections
+ pub unsafe fn unmask<I>(interrupt: I)
where
I: Nr,
{
let nr = interrupt.nr();
+ // NOTE(ptr) this is a write to a stateless register
+ (*Self::ptr()).iser[usize::from(nr / 32)].write(1 << (nr % 32))
+ }
+
+ /// Disables `interrupt`
+ #[deprecated(since = "0.6.1", note = "Use `NVIC::mask`")]
+ pub fn disable<I>(&mut self, interrupt: I)
+ where
+ I: Nr,
+ {
+ Self::mask(interrupt)
+ }
- unsafe { self.iser[usize::from(nr / 32)].write(1 << (nr % 32)) }
+ /// **WARNING** This method is a soundness hole in the API; it should actually be an `unsafe`
+ /// function. Use `NVIC::unmask` which has the right unsafety.
+ #[deprecated(since = "0.6.1", note = "Use `NVIC::unmask`")]
+ pub fn enable<I>(&mut self, interrupt: I)
+ where
+ I: Nr,
+ {
+ unsafe { Self::unmask(interrupt) }
}
/// Returns the NVIC priority of `interrupt`