aboutsummaryrefslogtreecommitdiff
path: root/macros/src/codegen/shared_resources.rs
diff options
context:
space:
mode:
Diffstat (limited to 'macros/src/codegen/shared_resources.rs')
-rw-r--r--macros/src/codegen/shared_resources.rs33
1 files changed, 33 insertions, 0 deletions
diff --git a/macros/src/codegen/shared_resources.rs b/macros/src/codegen/shared_resources.rs
index 9e45cff9..a016e453 100644
--- a/macros/src/codegen/shared_resources.rs
+++ b/macros/src/codegen/shared_resources.rs
@@ -105,5 +105,38 @@ pub fn codegen(
})
};
+ // Computing mapping of used interrupts to masks
+ let interrupt_ids = analysis.interrupts.iter().map(|(p, (id, _))| (p, id));
+
+ use std::collections::HashMap;
+ let mut masks: HashMap<u8, _> = std::collections::HashMap::new();
+ let device = &extra.device;
+
+ for p in 0..3 {
+ masks.insert(p, quote!(0));
+ }
+
+ for (&priority, name) in interrupt_ids.chain(app.hardware_tasks.values().flat_map(|task| {
+ if !util::is_exception(&task.args.binds) {
+ Some((&task.args.priority, &task.args.binds))
+ } else {
+ // TODO: exceptions not implemented
+ None
+ }
+ })) {
+ let name = quote!(#device::Interrupt::#name as u32);
+ if let Some(v) = masks.get_mut(&(priority - 1)) {
+ *v = quote!(#v | 1 << #name);
+ };
+ }
+
+ let mut mask_arr: Vec<(_, _)> = masks.iter().collect();
+ mask_arr.sort_by_key(|(k, _v)| *k);
+ let mask_arr: Vec<_> = mask_arr.iter().map(|(_, v)| v).collect();
+
+ mod_app.push(quote!(
+ const MASKS: [u32; 3] = [#(#mask_arr),*];
+ ));
+
(mod_app, mod_resources)
}