diff options
| author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2022-03-04 15:20:26 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-03-04 15:20:26 +0000 |
| commit | a765f3fffac95f270ce416dc15acd063b215f027 (patch) | |
| tree | 29fb04ead5d62bf1409729d06611dcf8a08b849f /macros/src/codegen/shared_resources.rs | |
| parent | 790b074e18e13370aaab698587d6f0fa262aad1d (diff) | |
| parent | f86dab5ff3e9c35e9e68b798b5c4faa08d390085 (diff) | |
Merge #589
589: Fine grained concurrency on thumbv6m (no BASEPRI). r=korken89 a=perlindgren
This is an experimental implementation of SRP based scheduling on the M0/M0+ (thumbv6m) architecture.
The aim is a (sub)-zero abstraction to the resource protection (locking mechanism).
Please try, but not merge yet, since its an early POC.
Co-authored-by: Per Lindgren <per.lindgren@ltu.se>
Diffstat (limited to 'macros/src/codegen/shared_resources.rs')
| -rw-r--r-- | macros/src/codegen/shared_resources.rs | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/macros/src/codegen/shared_resources.rs b/macros/src/codegen/shared_resources.rs index 9e45cff..a016e45 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) } |
