diff options
| author | Henrik Tjäder <henrik@tjaders.com> | 2023-02-04 16:47:17 +0100 |
|---|---|---|
| committer | Henrik Tjäder <henrik@tjaders.com> | 2023-03-01 00:35:13 +0100 |
| commit | 9e445b3583c15c7701f3167eaa8dfe4afd541691 (patch) | |
| tree | 167565d51598f42c0454d60b34e1170589ae1056 /rtic-macros/src/analyze.rs | |
| parent | 4124fbdd61ff823c6217a2a16ebb4d813146116c (diff) | |
Move rtic macros to repo root, tune xtask
Diffstat (limited to 'rtic-macros/src/analyze.rs')
| -rw-r--r-- | rtic-macros/src/analyze.rs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/rtic-macros/src/analyze.rs b/rtic-macros/src/analyze.rs new file mode 100644 index 0000000..65774f6 --- /dev/null +++ b/rtic-macros/src/analyze.rs @@ -0,0 +1,49 @@ +use core::ops; +use std::collections::{BTreeMap, BTreeSet}; + +use crate::syntax::{ + analyze::{self, Priority}, + ast::{App, Dispatcher}, +}; +use syn::Ident; + +/// Extend the upstream `Analysis` struct with our field +pub struct Analysis { + parent: analyze::Analysis, + pub interrupts: BTreeMap<Priority, (Ident, Dispatcher)>, +} + +impl ops::Deref for Analysis { + type Target = analyze::Analysis; + + fn deref(&self) -> &Self::Target { + &self.parent + } +} + +// Assign an interrupt to each priority level +pub fn app(analysis: analyze::Analysis, app: &App) -> Analysis { + let mut available_interrupt = app.args.dispatchers.clone(); + + // the set of priorities (each priority only once) + let priorities = app + .software_tasks + .values() + .map(|task| task.args.priority) + .collect::<BTreeSet<_>>(); + + // map from priorities to interrupts (holding name and attributes) + + let interrupts: BTreeMap<Priority, _> = priorities + .iter() + .filter(|prio| **prio > 0) // 0 prio tasks are run in main + .copied() + .rev() + .map(|p| (p, available_interrupt.pop().expect("UNREACHABLE"))) + .collect(); + + Analysis { + parent: analysis, + interrupts, + } +} |
