diff options
-rw-r--r-- | Cargo.toml | 1 | ||||
-rw-r--r-- | src/lib.rs | 1 | ||||
-rw-r--r-- | src/mutex.rs | 25 |
3 files changed, 27 insertions, 0 deletions
@@ -18,6 +18,7 @@ links = "cortex-m" # prevent multiple versions of this crate to be linked toget [dependencies] bare-metal = { version = "0.2.0", features = ["const-fn"] } volatile-register = "0.2.0" +mutex-trait = "0.2.0" [features] cm7-r0p1 = [] @@ -62,5 +62,6 @@ pub mod interrupt; pub mod itm; pub mod peripheral; pub mod register; +pub mod mutex; pub use crate::peripheral::Peripherals; diff --git a/src/mutex.rs b/src/mutex.rs new file mode 100644 index 0000000..7346e35 --- /dev/null +++ b/src/mutex.rs @@ -0,0 +1,25 @@ +//! Implementation of a critical section based mutex that also implements the `mutex-trait`. + +use core::cell::RefCell; + +/// A critical section based mutex +pub struct CriticalSectionMutex<T> { + data: RefCell<T>, +} + +impl<T> CriticalSectionMutex<T> { + /// Create a new mutex + pub const fn new(data: T) -> Self { + CriticalSectionMutex { + data: RefCell::new(data), + } + } +} + +impl<T> mutex_trait::Mutex for &'_ CriticalSectionMutex<T> { + type Data = T; + + fn lock<R>(&mut self, f: impl FnOnce(&mut Self::Data) -> R) -> R { + crate::interrupt::free(|_| f(&mut *self.data.borrow_mut())) + } +} |