aboutsummaryrefslogtreecommitdiff
path: root/macros/src/codegen/assertions.rs
diff options
context:
space:
mode:
Diffstat (limited to 'macros/src/codegen/assertions.rs')
-rw-r--r--macros/src/codegen/assertions.rs32
1 files changed, 30 insertions, 2 deletions
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
}