aboutsummaryrefslogtreecommitdiff
path: root/rtic-macros/src/analyze.rs
diff options
context:
space:
mode:
authorHenrik Tjäder <henrik@tjaders.com>2023-02-04 16:47:17 +0100
committerHenrik Tjäder <henrik@tjaders.com>2023-03-01 00:35:13 +0100
commit9e445b3583c15c7701f3167eaa8dfe4afd541691 (patch)
tree167565d51598f42c0454d60b34e1170589ae1056 /rtic-macros/src/analyze.rs
parent4124fbdd61ff823c6217a2a16ebb4d813146116c (diff)
Move rtic macros to repo root, tune xtask
Diffstat (limited to 'rtic-macros/src/analyze.rs')
-rw-r--r--rtic-macros/src/analyze.rs49
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,
+ }
+}