aboutsummaryrefslogtreecommitdiff
path: root/macros/src
diff options
context:
space:
mode:
Diffstat (limited to 'macros/src')
-rw-r--r--macros/src/check.rs19
-rw-r--r--macros/src/codegen/hardware_tasks.rs4
-rw-r--r--macros/src/codegen/pre_init.rs14
-rw-r--r--macros/src/codegen/util.rs12
-rw-r--r--macros/src/lib.rs21
-rw-r--r--macros/src/tests/multi.rs12
-rw-r--r--macros/src/tests/single.rs7
7 files changed, 44 insertions, 45 deletions
diff --git a/macros/src/check.rs b/macros/src/check.rs
index 619ec8fb..85fda75b 100644
--- a/macros/src/check.rs
+++ b/macros/src/check.rs
@@ -3,7 +3,7 @@ use std::collections::HashSet;
use proc_macro2::Span;
use rtfm_syntax::{
analyze::Analysis,
- ast::{App, CustomArg, HardwareTaskKind},
+ ast::{App, CustomArg},
};
use syn::{parse, Path};
@@ -44,18 +44,9 @@ pub fn app<'a>(app: &'a App, analysis: &Analysis) -> parse::Result<Extra<'a>> {
// check that all exceptions are valid; only exceptions with configurable priorities are
// accepted
- for (name, task) in app
- .hardware_tasks
- .iter()
- .filter(|(_, task)| task.kind == HardwareTaskKind::Exception)
- {
- let name_s = task.args.binds(name).to_string();
+ for (name, task) in &app.hardware_tasks {
+ let name_s = task.args.binds.to_string();
match &*name_s {
- // NOTE that some of these don't exist on ARMv6-M but we don't check that here -- the
- // code we generate will check that the exception actually exists on ARMv6-M
- "MemoryManagement" | "BusFault" | "UsageFault" | "SecureFault" | "SVCall"
- | "DebugMonitor" | "PendSV" => {} // OK
-
"SysTick" => {
if analysis.timer_queues.get(&task.args.core).is_some() {
return Err(parse::Error::new(
@@ -67,12 +58,14 @@ pub fn app<'a>(app: &'a App, analysis: &Analysis) -> parse::Result<Extra<'a>> {
}
}
- _ => {
+ "NonMaskableInt" | "HardFault" => {
return Err(parse::Error::new(
name.span(),
"only exceptions with configurable priority can be used as hardware tasks",
));
}
+
+ _ => {}
}
}
diff --git a/macros/src/codegen/hardware_tasks.rs b/macros/src/codegen/hardware_tasks.rs
index e7f053d3..a7af510a 100644
--- a/macros/src/codegen/hardware_tasks.rs
+++ b/macros/src/codegen/hardware_tasks.rs
@@ -50,9 +50,9 @@ pub fn codegen(
};
let symbol = if cfg!(feature = "homogeneous") {
- util::suffixed(&task.args.binds(name).to_string(), core)
+ util::suffixed(&task.args.binds.to_string(), core)
} else {
- task.args.binds(name).clone()
+ task.args.binds.clone()
};
let priority = task.args.priority;
diff --git a/macros/src/codegen/pre_init.rs b/macros/src/codegen/pre_init.rs
index 19fc6461..948dae54 100644
--- a/macros/src/codegen/pre_init.rs
+++ b/macros/src/codegen/pre_init.rs
@@ -1,6 +1,6 @@
use proc_macro2::TokenStream as TokenStream2;
use quote::quote;
-use rtfm_syntax::ast::{App, HardwareTaskKind};
+use rtfm_syntax::ast::App;
use crate::{analyze::Analysis, check::Extra, codegen::util};
@@ -52,9 +52,9 @@ pub fn codegen(
.get(&core)
.iter()
.flat_map(|interrupts| *interrupts)
- .chain(app.hardware_tasks.iter().flat_map(|(name, task)| {
- if task.kind == HardwareTaskKind::Interrupt {
- Some((&task.args.priority, task.args.binds(name)))
+ .chain(app.hardware_tasks.values().flat_map(|task| {
+ if !util::is_exception(&task.args.binds) {
+ Some((&task.args.priority, &task.args.binds))
} else {
// we do exceptions in another pass
None
@@ -102,9 +102,9 @@ pub fn codegen(
}
// set exception priorities
- for (name, priority) in app.hardware_tasks.iter().filter_map(|(name, task)| {
- if task.kind == HardwareTaskKind::Exception {
- Some((task.args.binds(name), task.args.priority))
+ for (name, priority) in app.hardware_tasks.values().filter_map(|task| {
+ if util::is_exception(&task.args.binds) {
+ Some((&task.args.binds, task.args.priority))
} else {
None
}
diff --git a/macros/src/codegen/util.rs b/macros/src/codegen/util.rs
index 8c43b350..cd01264d 100644
--- a/macros/src/codegen/util.rs
+++ b/macros/src/codegen/util.rs
@@ -113,6 +113,18 @@ pub fn interrupt_ident(core: Core, cores: u8) -> Ident {
}
}
+/// Whether `name` is an exception with configurable priority
+pub fn is_exception(name: &Ident) -> bool {
+ let s = name.to_string();
+
+ match &*s {
+ "MemoryManagement" | "BusFault" | "UsageFault" | "SecureFault" | "SVCall"
+ | "DebugMonitor" | "PendSV" | "SysTick" => true,
+
+ _ => false,
+ }
+}
+
/// Generates a pre-reexport identifier for the "late resources" struct
pub fn late_resources_ident(init: &Ident) -> Ident {
Ident::new(
diff --git a/macros/src/lib.rs b/macros/src/lib.rs
index 6502d9ca..ed55095d 100644
--- a/macros/src/lib.rs
+++ b/macros/src/lib.rs
@@ -16,19 +16,14 @@ mod tests;
#[proc_macro_attribute]
pub fn app(args: TokenStream, input: TokenStream) -> TokenStream {
- let (app, analysis) = match rtfm_syntax::parse(
- args,
- input,
- Settings {
- parse_cores: cfg!(feature = "heterogeneous") || cfg!(feature = "homogeneous"),
- parse_exception: true,
- parse_extern_interrupt: true,
- parse_interrupt: true,
- parse_schedule: true,
- optimize_priorities: true,
- ..Settings::default()
- },
- ) {
+ let mut settings = Settings::default();
+ settings.optimize_priorities = true;
+ settings.parse_binds = true;
+ settings.parse_cores = cfg!(feature = "heterogeneous") || cfg!(feature = "homogeneous");
+ settings.parse_extern_interrupt = true;
+ settings.parse_schedule = true;
+
+ let (app, analysis) = match rtfm_syntax::parse(args, input, settings) {
Err(e) => return e.to_compile_error().into(),
Ok(x) => x,
};
diff --git a/macros/src/tests/multi.rs b/macros/src/tests/multi.rs
index 37fef53f..b55c451f 100644
--- a/macros/src/tests/multi.rs
+++ b/macros/src/tests/multi.rs
@@ -3,6 +3,10 @@ use rtfm_syntax::Settings;
#[test]
fn analyze() {
+ let mut settings = Settings::default();
+ settings.parse_cores = true;
+ settings.parse_extern_interrupt = true;
+
let (app, analysis) = rtfm_syntax::parse2(
quote!(device = pac, cores = 2),
quote!(
@@ -35,13 +39,9 @@ fn analyze() {
}
};
),
- Settings {
- parse_cores: true,
- parse_extern_interrupt: true,
- ..Settings::default()
- },
+ settings,
)
- .unwrap();
+ .unwrap();
let analysis = crate::analyze::app(analysis, &app);
diff --git a/macros/src/tests/single.rs b/macros/src/tests/single.rs
index fb2d430f..5d7a8a9d 100644
--- a/macros/src/tests/single.rs
+++ b/macros/src/tests/single.rs
@@ -3,6 +3,8 @@ use rtfm_syntax::Settings;
#[test]
fn analyze() {
+ let mut settings = Settings::default();
+ settings.parse_extern_interrupt = true;
let (app, analysis) = rtfm_syntax::parse2(
quote!(device = pac),
quote!(
@@ -20,10 +22,7 @@ fn analyze() {
}
};
),
- Settings {
- parse_extern_interrupt: true,
- ..Settings::default()
- },
+ settings,
)
.unwrap();