remove claim, add Priority.as_ceiling

This commit is contained in:
Jorge Aparicio 2017-04-19 17:21:13 -05:00
parent 0827c40a26
commit 4e6818eb2c
3 changed files with 14 additions and 28 deletions

View file

@ -56,6 +56,7 @@ fn main() {
// Priorities // Priorities
for i in 1..(1 << bits) + 1 { for i in 1..(1 << bits) + 1 {
let c = Ident::new(format!("C{}", i));
let p = Ident::new(format!("P{}", i)); let p = Ident::new(format!("P{}", i));
let u = Ident::new(format!("U{}", i)); let u = Ident::new(format!("U{}", i));
@ -64,6 +65,15 @@ fn main() {
/// Priority /// Priority
pub type #p = P<::typenum::#u>; pub type #p = P<::typenum::#u>;
impl #p {
/// Turns this priority into a ceiling
pub fn as_ceiling(&self) -> &#c {
unsafe {
::core::mem::transmute(self)
}
}
}
unsafe impl Priority for #p {} unsafe impl Priority for #p {}
unsafe impl Level for ::typenum::#u { unsafe impl Level for ::typenum::#u {

View file

@ -18,7 +18,7 @@ use cortex_m::interrupt::Nr;
#[cfg(not(thumbv6m))] #[cfg(not(thumbv6m))]
use cortex_m::register::{basepri, basepri_max}; use cortex_m::register::{basepri, basepri_max};
use static_ref::Ref; use static_ref::Ref;
use typenum::{Cmp, Equal, Unsigned}; use typenum::{Cmp, Unsigned};
#[cfg(not(thumbv6m))] #[cfg(not(thumbv6m))]
use typenum::{Greater, Less}; use typenum::{Greater, Less};
@ -74,19 +74,6 @@ impl<T, CEILING> Resource<T, C<CEILING>> {
unsafe { Ref::new(&*self.data.get()) } unsafe { Ref::new(&*self.data.get()) }
} }
/// Claims the resource at the task with highest priority
///
/// This operation is zero cost and doesn't impose any additional blocking
pub fn claim<'task, PRIORITY>(
&'static self,
_priority: &'task P<PRIORITY>,
) -> Ref<'task, T>
where
CEILING: Cmp<PRIORITY, Output = Equal>,
{
unsafe { Ref::new(&*self.data.get()) }
}
/// Locks the resource for the duration of the critical section `f` /// Locks the resource for the duration of the critical section `f`
/// ///
/// For the duration of the critical section, tasks whose priority level is /// For the duration of the critical section, tasks whose priority level is
@ -161,17 +148,6 @@ impl<Periph, CEILING> Peripheral<Periph, C<CEILING>> {
unsafe { Ref::new(&*self.peripheral.get()) } unsafe { Ref::new(&*self.peripheral.get()) }
} }
/// See [Resource.claim](./struct.Resource.html#method.claim)
pub fn claim<'task, PRIORITY>(
&'static self,
_priority: &'task P<PRIORITY>,
) -> Ref<'task, Periph>
where
CEILING: Cmp<PRIORITY, Output = Equal>,
{
unsafe { Ref::new(&*self.peripheral.get()) }
}
/// See [Resource.lock](./struct.Resource.html#method.lock) /// See [Resource.lock](./struct.Resource.html#method.lock)
#[cfg(not(thumbv6m))] #[cfg(not(thumbv6m))]
pub fn lock<R, PRIORITY, F>(&'static self, _priority: &P<PRIORITY>, f: F) -> R pub fn lock<R, PRIORITY, F>(&'static self, _priority: &P<PRIORITY>, f: F) -> R

View file

@ -11,13 +11,13 @@ fn j1(prio: P3) {
} }
// DON'T lock a resource with ceiling equal to the task priority. // DON'T lock a resource with ceiling equal to the task priority.
// Instead use `claim` // Instead use `borrow`
fn j2(prio: P2) { fn j2(prio: P2) {
R1.lock(&prio, |_, _| {}); R1.lock(&prio, |_, _| {});
//~^ error //~^ error
// OK // OK
let r1 = R1.claim(&prio); let r1 = R1.borrow(&prio, prio.as_ceiling());
} }
// You CAN lock a resource with ceiling C from a task with priority P if C > P // You CAN lock a resource with ceiling C from a task with priority P if C > P
@ -37,5 +37,5 @@ fn j4(prio: P1) {
// Only tasks with priority P16 can claim a resource with ceiling C16 // Only tasks with priority P16 can claim a resource with ceiling C16
fn j5(prio: P16) { fn j5(prio: P16) {
// OK // OK
let r2 = R2.claim(&prio); let r2 = R2.borrow(&prio, prio.as_ceiling());
} }