aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rtic/src/export/cortex_source_mask.rs50
1 files changed, 28 insertions, 22 deletions
diff --git a/rtic/src/export/cortex_source_mask.rs b/rtic/src/export/cortex_source_mask.rs
index 9dec5c7..4fb62a4 100644
--- a/rtic/src/export/cortex_source_mask.rs
+++ b/rtic/src/export/cortex_source_mask.rs
@@ -127,25 +127,27 @@ pub unsafe fn lock<T, R, const M: usize>(
masks: &[Mask<M>; 3],
f: impl FnOnce(&mut T) -> R,
) -> R {
- if ceiling >= 4 {
- // safe to manipulate outside critical section
- // execute closure under protection of raised system ceiling
-
- // safe to manipulate outside critical section
- critical_section::with(|_| f(&mut *ptr))
- } else {
- // safe to manipulate outside critical section
- let mask = compute_mask(0, ceiling, masks);
- let old_mask = read_mask(mask);
- clear_enable_mask(mask);
-
- // execute closure under protection of raised system ceiling
- let r = f(&mut *ptr);
-
- set_enable_mask(mask, old_mask);
-
- // safe to manipulate outside critical section
- r
+ unsafe {
+ if ceiling >= 4 {
+ // safe to manipulate outside critical section
+ // execute closure under protection of raised system ceiling
+
+ // safe to manipulate outside critical section
+ critical_section::with(|_| f(&mut *ptr))
+ } else {
+ // safe to manipulate outside critical section
+ let mask = compute_mask(0, ceiling, masks);
+ let old_mask = read_mask(mask);
+ clear_enable_mask(mask);
+
+ // execute closure under protection of raised system ceiling
+ let r = f(&mut *ptr);
+
+ set_enable_mask(mask, old_mask);
+
+ // safe to manipulate outside critical section
+ r
+ }
}
}
@@ -187,7 +189,7 @@ unsafe fn read_mask<const M: usize>(mask: Mask<M>) -> Mask<M> {
for i in 0..M {
// This check should involve compile time constants and be optimized out.
if mask.0[i] != 0 {
- out.0[i] = (*NVIC::PTR).iser[i].read();
+ out.0[i] = unsafe { (*NVIC::PTR).iser[i].read() };
}
}
@@ -200,7 +202,9 @@ unsafe fn set_enable_mask<const M: usize>(mask: Mask<M>, old_mask: Mask<M>) {
for i in 0..M {
// This check should involve compile time constants and be optimized out.
if mask.0[i] != 0 {
- (*NVIC::PTR).iser[i].write(old_mask.0[i]);
+ unsafe {
+ (*NVIC::PTR).iser[i].write(old_mask.0[i]);
+ }
}
}
}
@@ -211,7 +215,9 @@ unsafe fn clear_enable_mask<const M: usize>(mask: Mask<M>) {
for i in 0..M {
// This check should involve compile time constants and be optimized out.
if mask.0[i] != 0 {
- (*NVIC::PTR).icer[i].write(mask.0[i]);
+ unsafe {
+ (*NVIC::PTR).icer[i].write(mask.0[i]);
+ }
}
}
}