aboutsummaryrefslogtreecommitdiff
path: root/macros/src
diff options
context:
space:
mode:
authorGravatar Per Lindgren <per.lindgren@ltu.se> 2022-01-21 21:49:45 +0100
committerGravatar Emil Fresk <emil.fresk@gmail.com> 2022-03-02 13:23:47 +0100
commitf86dab5ff3e9c35e9e68b798b5c4faa08d390085 (patch)
tree29fb04ead5d62bf1409729d06611dcf8a08b849f /macros/src
parent790b074e18e13370aaab698587d6f0fa262aad1d (diff)
downloadrtic-f86dab5ff3e9c35e9e68b798b5c4faa08d390085.tar.gz
rtic-f86dab5ff3e9c35e9e68b798b5c4faa08d390085.tar.zst
rtic-f86dab5ff3e9c35e9e68b798b5c4faa08d390085.zip
Added support for SRP based scheduling for armv6m
Diffstat (limited to 'macros/src')
-rw-r--r--macros/src/codegen.rs2
-rw-r--r--macros/src/codegen/assertions.rs32
-rw-r--r--macros/src/codegen/shared_resources.rs33
-rw-r--r--macros/src/codegen/util.rs1
4 files changed, 65 insertions, 3 deletions
diff --git a/macros/src/codegen.rs b/macros/src/codegen.rs
index f5cae34a..01be1d57 100644
--- a/macros/src/codegen.rs
+++ b/macros/src/codegen.rs
@@ -28,7 +28,7 @@ pub fn app(app: &App, analysis: &Analysis, extra: &Extra) -> TokenStream2 {
let mut user = vec![];
// Generate the `main` function
- let assertion_stmts = assertions::codegen(app, analysis);
+ let assertion_stmts = assertions::codegen(app, analysis, extra);
let pre_init_stmts = pre_init::codegen(app, analysis, extra);
diff --git a/macros/src/codegen/assertions.rs b/macros/src/codegen/assertions.rs
index a8a4491b..36ab0364 100644
--- a/macros/src/codegen/assertions.rs
+++ b/macros/src/codegen/assertions.rs
@@ -1,11 +1,11 @@
use proc_macro2::TokenStream as TokenStream2;
use quote::quote;
-use crate::analyze::Analysis;
+use crate::{analyze::Analysis, check::Extra, codegen::util};
use rtic_syntax::ast::App;
/// Generates compile-time assertions that check that types implement the `Send` / `Sync` traits
-pub fn codegen(app: &App, analysis: &Analysis) -> Vec<TokenStream2> {
+pub fn codegen(app: &App, analysis: &Analysis, extra: &Extra) -> Vec<TokenStream2> {
let mut stmts = vec![];
for ty in &analysis.send_types {
@@ -21,5 +21,33 @@ pub fn codegen(app: &App, analysis: &Analysis) -> Vec<TokenStream2> {
stmts.push(quote!(rtic::export::assert_monotonic::<#ty>();));
}
+ let device = &extra.device;
+ let arm_v6_checks: Vec<_> = app
+ .hardware_tasks
+ .iter()
+ .filter_map(|(_, task)| {
+ if !util::is_exception(&task.args.binds) {
+ let interrupt_name = &task.args.binds;
+ Some(quote!(assert!((#device::Interrupt::#interrupt_name as u32) < 32);))
+ } else {
+ None
+ }
+ })
+ .collect();
+
+ let const_check = quote! {
+ const _CONST_CHECK: () = {
+ if rtic::export::is_armv6() {
+ #(#arm_v6_checks)*
+ } else {
+ // TODO: Add armv7 checks here
+ }
+ };
+
+ let _ = _CONST_CHECK;
+ };
+
+ stmts.push(const_check);
+
stmts
}
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)
}
diff --git a/macros/src/codegen/util.rs b/macros/src/codegen/util.rs
index 6a07732c..4a29754b 100644
--- a/macros/src/codegen/util.rs
+++ b/macros/src/codegen/util.rs
@@ -52,6 +52,7 @@ pub fn impl_mutex(
#priority,
CEILING,
#device::NVIC_PRIO_BITS,
+ &MASKS,
f,
)
}