From 595404c5ffc37ce95ffb2b6999ab85e6818bfa50 Mon Sep 17 00:00:00 2001 From: Jorge Aparicio Date: Sun, 9 Apr 2017 22:42:17 -0500 Subject: compile time verified ceilings --- src/checked.rs | 78 ---------------------------------------------------------- 1 file changed, 78 deletions(-) delete mode 100644 src/checked.rs (limited to 'src/checked.rs') diff --git a/src/checked.rs b/src/checked.rs deleted file mode 100644 index ec4114d..0000000 --- a/src/checked.rs +++ /dev/null @@ -1,78 +0,0 @@ -//! Safe, run-time checked resources - -use core::marker::PhantomData; -use core::cell::UnsafeCell; - -use cortex_m::interrupt; -use cortex_m::register::{basepri, basepri_max}; -use vcell::VolatileCell; - -use Ceiling; - -unsafe fn acquire(locked: &VolatileCell, ceiling: u8) -> u8 { - assert!(!locked.get(), "resource already locked"); - let old_basepri = basepri::read(); - basepri_max::write(ceiling); - locked.set(true); - old_basepri -} - -unsafe fn release(locked: &VolatileCell, old_basepri: u8) { - locked.set(false); - basepri::write(old_basepri); -} - -/// A totally safe `Resource` that panics on misuse -pub struct Resource { - _marker: PhantomData, - data: UnsafeCell, - locked: VolatileCell, -} - -impl Resource -where - C: Ceiling, -{ - /// Creates a new `Resource` with ceiling `C` - pub const fn new(data: T) -> Resource { - Resource { - _marker: PhantomData, - data: UnsafeCell::new(data), - locked: VolatileCell::new(false), - } - } - - /// Locks the resource, blocking tasks with priority equal or smaller than - /// the ceiling `C` - pub fn lock(&'static self, f: F) -> R - where - F: FnOnce(&T) -> R, - { - unsafe { - let old_basepri = acquire(&self.locked, C::hw_ceiling()); - ::compiler_barrier(); - let ret = f(&*self.data.get()); - ::compiler_barrier(); - release(&self.locked, old_basepri); - ret - } - } - - /// Mutably locks the resource, blocking tasks with priority equal or - /// smaller than the ceiling `C` - pub fn lock_mut(&'static self, f: F) -> R - where - F: FnOnce(&mut T) -> R, - { - unsafe { - let old_basepri = acquire(&self.locked, C::hw_ceiling()); - ::compiler_barrier(); - let ret = f(&mut *self.data.get()); - ::compiler_barrier(); - release(&self.locked, old_basepri); - ret - } - } -} - -unsafe impl Sync for Resource {} -- cgit v1.2.3