aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Per Lindgren <per.lindgren@ltu.se> 2020-06-13 21:07:55 +0200
committerGravatar Per Lindgren <per.lindgren@ltu.se> 2020-06-13 21:07:55 +0200
commit527bfb6eecf626b34996511689b80654ba0e26ed (patch)
treec1b80c76bc961a98ac46754791a5bfe24fe81c91
parentcfd5f4785e9c2ae88e666d1fb94a3488904a87f5 (diff)
downloadrtic-ordering.tar.gz
rtic-ordering.tar.zst
rtic-ordering.zip
added compiler_fence(Ordering::SeqCst) around critical sectionsordering
-rw-r--r--src/export.rs18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/export.rs b/src/export.rs
index e23b8f3a..4794f698 100644
--- a/src/export.rs
+++ b/src/export.rs
@@ -1,6 +1,6 @@
use core::{
cell::Cell,
- sync::atomic::{AtomicBool, Ordering},
+ sync::atomic::{compiler_fence, AtomicBool, Ordering},
};
pub use crate::tq::{NotReady, TimerQueue};
@@ -129,13 +129,20 @@ pub unsafe fn lock<T, R>(
if current < ceiling {
if ceiling == (1 << nvic_prio_bits) {
priority.set(u8::max_value());
- let r = interrupt::free(|_| f(&mut *ptr));
+ let r = interrupt::free(|_| {
+ compiler_fence(Ordering::SeqCst);
+ let r = f(&mut *ptr);
+ compiler_fence(Ordering::SeqCst);
+ r
+ });
priority.set(current);
r
} else {
priority.set(ceiling);
basepri::write(logical2hw(ceiling, nvic_prio_bits));
+ compiler_fence(Ordering::SeqCst);
let r = f(&mut *ptr);
+ compiler_fence(Ordering::SeqCst);
basepri::write(logical2hw(current, nvic_prio_bits));
priority.set(current);
r
@@ -158,7 +165,12 @@ pub unsafe fn lock<T, R>(
if current < ceiling {
priority.set(u8::max_value());
- let r = interrupt::free(|_| f(&mut *ptr));
+ let r = interrupt::free(|_| {
+ compiler_fence(Ordering::SeqCst);
+ let r = f(&mut *ptr);
+ compiler_fence(Ordering::SeqCst);
+ r
+ });
priority.set(current);
r
} else {