pub use bare_metal::{CriticalSection, Mutex, Nr};
pub unsafe trait InterruptNumber: Copy {
fn number(self) -> u16;
}
unsafe impl<T: Nr + Copy> InterruptNumber for T {
#[inline]
fn number(self) -> u16 {
self.nr() as u16
}
}
#[inline]
pub fn disable() {
call_asm!(__cpsid());
}
#[inline]
pub unsafe fn enable() {
call_asm!(__cpsie());
}
#[inline]
pub fn free<F, R>(f: F) -> R
where
F: FnOnce(&CriticalSection) -> R,
{
let primask = crate::register::primask::read();
disable();
let r = f(unsafe { &CriticalSection::new() });
if primask.is_active() {
unsafe { enable() }
}
r
}