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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
#[doc = r"Enumeration of all the interrupts"] #[derive(Copy, Clone, Debug)] pub enum Interrupt { #[doc = "2 - timer0"] TIMER0, #[doc = "3 - usb"] USB, } unsafe impl bare_metal::Nr for Interrupt { #[inline] fn nr(&self) -> u8 { match *self { Interrupt::TIMER0 => 2, Interrupt::USB => 3, } } } #[derive(Debug, Copy, Clone)] pub struct TryFromInterruptError(()); impl Interrupt { #[inline] pub fn try_from(value: u8) -> Result<Self, TryFromInterruptError> { match value { 2 => Ok(Interrupt::TIMER0), 3 => Ok(Interrupt::USB), _ => Err(TryFromInterruptError(())), } } } #[cfg(feature = "rt")] #[macro_export] #[doc = r" Assigns a handler to an interrupt"] #[doc = r""] #[doc = r" This macro takes two arguments: the name of an interrupt and the path to the"] #[doc = r" function that will be used as the handler of that interrupt. That function"] #[doc = r" must have signature `fn()`."] #[doc = r""] #[doc = r" Optionally, a third argument may be used to declare interrupt local data."] #[doc = r" The handler will have exclusive access to these *local* variables on each"] #[doc = r" invocation. If the third argument is used then the signature of the handler"] #[doc = r" function must be `fn(&mut $NAME::Locals)` where `$NAME` is the first argument"] #[doc = r" passed to the macro."] #[doc = r""] #[doc = r" # Example"] #[doc = r""] #[doc = r" ``` ignore"] #[doc = r" interrupt!(TIM2, periodic);"] #[doc = r""] #[doc = r" fn periodic() {"] #[doc = r#" print!(".");"#] #[doc = r" }"] #[doc = r""] #[doc = r" interrupt!(TIM3, tick, locals: {"] #[doc = r" tick: bool = false;"] #[doc = r" });"] #[doc = r""] #[doc = r" fn tick(locals: &mut TIM3::Locals) {"] #[doc = r" locals.tick = !locals.tick;"] #[doc = r""] #[doc = r" if locals.tick {"] #[doc = r#" println!("Tick");"#] #[doc = r" } else {"] #[doc = r#" println!("Tock");"#] #[doc = r" }"] #[doc = r" }"] #[doc = r" ```"] macro_rules ! interrupt { ( $ NAME : ident , $ path : path , locals : { $ ( $ lvar : ident : $ lty : ty = $ lval : expr ; ) * } ) => { # [ allow ( non_snake_case ) ] mod $ NAME { pub struct Locals { $ ( pub $ lvar : $ lty , ) * } } # [ allow ( non_snake_case ) ] # [ no_mangle ] pub extern "C" fn $ NAME ( ) { let _ = $ crate :: interrupt :: Interrupt :: $ NAME ; static mut LOCALS : self :: $ NAME :: Locals = self :: $ NAME :: Locals { $ ( $ lvar : $ lval , ) * } ; let f : fn ( & mut self :: $ NAME :: Locals ) = $ path ; f ( unsafe { & mut LOCALS } ) ; } } ; ( $ NAME : ident , $ path : path ) => { # [ allow ( non_snake_case ) ] # [ no_mangle ] pub extern "C" fn $ NAME ( ) { let _ = $ crate :: interrupt :: Interrupt :: $ NAME ; let f : fn ( ) = $ path ; f ( ) ; } } }