Skip to content

Commit d4284d3

Browse files
committed
Generate interrupt dispatch code.
Useful for architectures that prefer or mandate dispatching interrupts in software. Adds #[derive(Debug)] for printing readable interrupt names.
1 parent 5cc57ba commit d4284d3

File tree

1 file changed

+19
-3
lines changed

1 file changed

+19
-3
lines changed

src/generate.rs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,8 @@ pub fn interrupt(
187187
interrupts.into_iter().map(|(_, v)| v).collect::<Vec<_>>();
188188
interrupts.sort_by_key(|i| i.value);
189189

190-
let mut arms = vec![];
190+
let mut nr_arms = vec![];
191+
let mut from_arms = vec![];
191192
let mut elements = vec![];
192193
let mut names = vec![];
193194
let mut variants = vec![];
@@ -223,10 +224,14 @@ pub fn interrupt(
223224
#name_uc,
224225
});
225226

226-
arms.push(quote! {
227+
nr_arms.push(quote! {
227228
Interrupt::#name_uc => #value,
228229
});
229230

231+
from_arms.push(quote! {
232+
#value => Interrupt::#name_uc,
233+
});
234+
230235
elements.push(quote!(Some(#name_uc)));
231236
names.push(name_uc);
232237
}
@@ -335,6 +340,7 @@ pub fn interrupt(
335340

336341
mod_items.push(quote! {
337342
/// Enumeration of all the interrupts
343+
#[derive(Debug)]
338344
pub enum Interrupt {
339345
#(#variants)*
340346
}
@@ -343,7 +349,17 @@ pub fn interrupt(
343349
#[inline]
344350
fn nr(&self) -> u8 {
345351
match *self {
346-
#(#arms)*
352+
#(#nr_arms)*
353+
}
354+
}
355+
}
356+
357+
impl Interrupt {
358+
#[inline(always)]
359+
pub fn from(nr: u8) -> Interrupt {
360+
match nr {
361+
#(#from_arms)*
362+
_ => unreachable!(),
347363
}
348364
}
349365
}

0 commit comments

Comments
 (0)