aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Emil Fresk <emil.fresk@gmail.com> 2020-04-21 21:14:43 +0200
committerGravatar Emil Fresk <emil.fresk@gmail.com> 2020-04-21 21:14:43 +0200
commite0034b6e9d7d15bcd5a5b9990e31d26c887846d5 (patch)
tree037201985bc4f726b5cc3b6076f7c69661b36a16
parent22d47dd75e9fb5004e0192666123d28f0a418310 (diff)
downloadcortex-m-e0034b6e9d7d15bcd5a5b9990e31d26c887846d5.tar.gz
cortex-m-e0034b6e9d7d15bcd5a5b9990e31d26c887846d5.tar.zst
cortex-m-e0034b6e9d7d15bcd5a5b9990e31d26c887846d5.zip
Added arch specific mutex implementation
-rw-r--r--Cargo.toml1
-rw-r--r--src/lib.rs1
-rw-r--r--src/mutex.rs25
3 files changed, 27 insertions, 0 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 5137dce..b1c6114 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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 = []
diff --git a/src/lib.rs b/src/lib.rs
index f8b5606..5287041 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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()))
+ }
+}