diff options
| author | Jorge Aparicio <japaricious@gmail.com> | 2017-04-07 18:57:13 -0500 |
|---|---|---|
| committer | Jorge Aparicio <japaricious@gmail.com> | 2017-04-07 18:57:13 -0500 |
| commit | 185f368d63e6b083d1717c3625b7756e77782add (patch) | |
| tree | df8c25a4d19a5b365f76c42f4b4c6eaa8e433aec /src | |
| parent | 22bb0d8eaef26dc9f276b89b85f20121a372197f (diff) | |
use volatile read/writes for checked::Resource.locked
Diffstat (limited to 'src')
| -rw-r--r-- | src/checked.rs | 15 | ||||
| -rw-r--r-- | src/lib.rs | 1 |
2 files changed, 9 insertions, 7 deletions
diff --git a/src/checked.rs b/src/checked.rs index eb0da3d..87318ec 100644 --- a/src/checked.rs +++ b/src/checked.rs @@ -5,26 +5,27 @@ use core::cell::UnsafeCell; use cortex_m::interrupt; use cortex_m::register::{basepri, basepri_max}; +use vcell::VolatileCell; use Ceiling; -unsafe fn acquire(locked: &UnsafeCell<bool>, ceiling: u8) -> u8 { +unsafe fn acquire(locked: &VolatileCell<bool>, ceiling: u8) -> u8 { interrupt::free( |_| { - assert!(!*locked.get(), "resource already locked"); + assert!(!locked.get(), "resource already locked"); let old_basepri = basepri::read(); basepri_max::write(ceiling); - *locked.get() = true; + locked.set(true); old_basepri }, ) } -unsafe fn release(locked: &UnsafeCell<bool>, old_basepri: u8) { +unsafe fn release(locked: &VolatileCell<bool>, old_basepri: u8) { // XXX Is it really memory safe to *not* use a global critical section here // interrupt::free( // |_| { - *locked.get() = false; + locked.set(false); basepri::write(old_basepri); // }, // ); @@ -34,7 +35,7 @@ unsafe fn release(locked: &UnsafeCell<bool>, old_basepri: u8) { pub struct Resource<T, C> { _marker: PhantomData<C>, data: UnsafeCell<T>, - locked: UnsafeCell<bool>, + locked: VolatileCell<bool>, } impl<T, C> Resource<T, C> @@ -46,7 +47,7 @@ where Resource { _marker: PhantomData, data: UnsafeCell::new(data), - locked: UnsafeCell::new(false), + locked: VolatileCell::new(false), } } @@ -9,6 +9,7 @@ #![no_std] extern crate cortex_m; +extern crate vcell; pub mod checked; |
