1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
//! Interrupts use crate::asm::*; pub use bare_metal::{CriticalSection, Mutex, Nr}; /// Disables all interrupts #[inline] pub unsafe fn disable() { maskirq(0xffff_ffff); } /// Enables all the interrupts /// /// # Safety /// /// - Do not call this function inside an `interrupt::free` critical section #[inline] pub unsafe fn enable() { maskirq(0); } /// Execute closure `f` in an interrupt-free context. /// /// This as also known as a "critical section". pub fn free<F, R>(f: F) -> R where F: FnOnce(&CriticalSection) -> R, { // disable interrupts let old_mask = unsafe { maskirq(0xffff_ffff) }; let r = f(unsafe { &CriticalSection::new() }); unsafe { maskirq(old_mask); } r }