aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Henrik Tjäder <henrik@tjaders.com> 2023-01-22 13:11:29 +0100
committerGravatar Henrik Tjäder <henrik@tjaders.com> 2023-01-22 13:38:43 +0100
commit800904a1054639a090ef92e9b1e7c884ea9863e0 (patch)
tree78116f26ecca6292174b97c8781f9278f14e306f
parent259be7bbf9cfa0ac24c276190515e988d98770b7 (diff)
downloadrtic-800904a1054639a090ef92e9b1e7c884ea9863e0.tar.gz
rtic-800904a1054639a090ef92e9b1e7c884ea9863e0.tar.zst
rtic-800904a1054639a090ef92e9b1e7c884ea9863e0.zip
Handle more cfgs, support cfg on HW/SW tasks
-rw-r--r--CHANGELOG.md1
-rw-r--r--examples/cfg-whole-task.rs13
-rw-r--r--macros/src/codegen/assertions.rs2
-rw-r--r--macros/src/codegen/hardware_tasks.rs2
-rw-r--r--macros/src/codegen/module.rs7
-rw-r--r--macros/src/codegen/pre_init.rs2
-rw-r--r--macros/src/codegen/shared_resources_struct.rs15
-rw-r--r--macros/src/codegen/software_tasks.rs3
8 files changed, 39 insertions, 6 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 455c8987..c43a73d2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,7 @@ For each category, *Added*, *Changed*, *Fixed* add new entries at the top!
### Added
+- CFG: Support #[cfg] on HW task, cleanup for SW tasks
- CFG: Slightly improved support for #[cfg] on Monotonics
- CI: Check examples also for thumbv8.{base,main}
- Allow custom `link_section` attributes for late resources
diff --git a/examples/cfg-whole-task.rs b/examples/cfg-whole-task.rs
index b5b97831..17f31f4e 100644
--- a/examples/cfg-whole-task.rs
+++ b/examples/cfg-whole-task.rs
@@ -82,6 +82,19 @@ mod app {
// ..
}
+ // The whole task should disappear,
+ // currently still present in the Tasks enum
+ #[cfg(never)]
+ #[task(binds = UART1, shared = [count])]
+ fn foo3(mut _cx: foo3::Context) {
+ #[cfg(debug_assertions)]
+ {
+ _cx.shared.count.lock(|count| *count += 10);
+
+ log::spawn(_cx.shared.count.lock(|count| *count)).unwrap();
+ }
+ }
+
#[cfg(debug_assertions)]
#[task(capacity = 2)]
fn log(_: log::Context, n: u32) {
diff --git a/macros/src/codegen/assertions.rs b/macros/src/codegen/assertions.rs
index 66e54095..3e0ad61c 100644
--- a/macros/src/codegen/assertions.rs
+++ b/macros/src/codegen/assertions.rs
@@ -29,7 +29,9 @@ pub fn codegen(app: &App, analysis: &Analysis, extra: &Extra) -> Vec<TokenStream
.filter_map(|(_, task)| {
if !util::is_exception(&task.args.binds) {
let interrupt_name = &task.args.binds;
+ let cfgs = &task.cfgs;
Some(quote!(
+ #(#cfgs)*
if (#device::Interrupt::#interrupt_name as usize) >= (#chunks_name * 32) {
::core::panic!("An interrupt out of range is used while in armv6 or armv8m.base");
}
diff --git a/macros/src/codegen/hardware_tasks.rs b/macros/src/codegen/hardware_tasks.rs
index 780cc7e3..b3f05d2a 100644
--- a/macros/src/codegen/hardware_tasks.rs
+++ b/macros/src/codegen/hardware_tasks.rs
@@ -93,11 +93,13 @@ pub fn codegen(
let user_hardware_task_doc = &format!(" User HW task: {name}");
if !task.is_extern {
let attrs = &task.attrs;
+ let cfgs = &task.cfgs;
let context = &task.context;
let stmts = &task.stmts;
user_tasks.push(quote!(
#[doc = #user_hardware_task_doc]
#(#attrs)*
+ #(#cfgs)*
#[allow(non_snake_case)]
fn #name(#context: #name::Context) {
use rtic::Mutex as _;
diff --git a/macros/src/codegen/module.rs b/macros/src/codegen/module.rs
index 71bcfa8e..8dcdbcf3 100644
--- a/macros/src/codegen/module.rs
+++ b/macros/src/codegen/module.rs
@@ -16,8 +16,6 @@ pub fn codegen(
let mut module_items = vec![];
let mut fields = vec![];
let mut values = vec![];
- // Used to copy task cfgs to the whole module
- let mut task_cfgs = vec![];
let name = ctxt.ident(app);
@@ -208,8 +206,6 @@ pub fn codegen(
let priority = spawnee.args.priority;
let t = util::spawn_t_ident(priority);
let cfgs = &spawnee.cfgs;
- // Store a copy of the task cfgs
- task_cfgs = cfgs.clone();
let (args, tupled, untupled, ty) = util::regroup_inputs(&spawnee.inputs);
let args = &args;
let tupled = &tupled;
@@ -461,9 +457,8 @@ pub fn codegen(
} else {
quote!(
#(#items)*
-
#[allow(non_snake_case)]
- #(#task_cfgs)*
+ #(#cfgs)*
#[doc = #doc]
pub mod #name {
#(#module_items)*
diff --git a/macros/src/codegen/pre_init.rs b/macros/src/codegen/pre_init.rs
index 3d541a47..2362cb74 100644
--- a/macros/src/codegen/pre_init.rs
+++ b/macros/src/codegen/pre_init.rs
@@ -16,9 +16,11 @@ pub fn codegen(app: &App, analysis: &Analysis, extra: &Extra) -> Vec<TokenStream
// Populate the FreeQueue
for (name, task) in &app.software_tasks {
let cap = task.args.capacity;
+ let cfgs = &task.cfgs;
let fq_ident = util::fq_ident(name);
stmts.push(quote!(
+ #(#cfgs)*
(0..#cap).for_each(|i| (&mut *#fq_ident.get_mut()).enqueue_unchecked(i));
));
}
diff --git a/macros/src/codegen/shared_resources_struct.rs b/macros/src/codegen/shared_resources_struct.rs
index 7b6cd20d..df362719 100644
--- a/macros/src/codegen/shared_resources_struct.rs
+++ b/macros/src/codegen/shared_resources_struct.rs
@@ -15,6 +15,19 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2,
Context::SoftwareTask(name) => &app.software_tasks[name].args.shared_resources,
};
+ let v = Vec::new();
+ let task_cfgs = match ctxt {
+ Context::HardwareTask(t) => {
+ &app.hardware_tasks[t].cfgs
+ // ...
+ }
+ Context::SoftwareTask(t) => {
+ &app.software_tasks[t].cfgs
+ // ...
+ }
+ _ => &v,
+ };
+
let mut fields = vec![];
let mut values = vec![];
let mut has_cfgs = false;
@@ -118,6 +131,7 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2,
#[allow(non_snake_case)]
#[allow(non_camel_case_types)]
#[doc = #doc]
+ #(#task_cfgs)*
pub struct #ident<#lt> {
#(#fields,)*
}
@@ -129,6 +143,7 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2,
Some(quote!(priority: &#lt rtic::export::Priority))
};
let constructor = quote!(
+ #(#task_cfgs)*
impl<#lt> #ident<#lt> {
#[doc(hidden)]
#[inline(always)]
diff --git a/macros/src/codegen/software_tasks.rs b/macros/src/codegen/software_tasks.rs
index 6bd2a71f..226121dd 100644
--- a/macros/src/codegen/software_tasks.rs
+++ b/macros/src/codegen/software_tasks.rs
@@ -29,6 +29,7 @@ pub fn codegen(
for (name, task) in &app.software_tasks {
let inputs = &task.inputs;
+ let cfgs = &task.cfgs;
let (_, _, _, input_ty) = util::regroup_inputs(inputs);
let cap = task.args.capacity;
@@ -49,6 +50,7 @@ pub fn codegen(
mod_app.push(quote!(
// /// Queue version of a free-list that keeps track of empty slots in
// /// the following buffers
+ #(#cfgs)*
#[allow(non_camel_case_types)]
#[allow(non_upper_case_globals)]
#[doc(hidden)]
@@ -89,6 +91,7 @@ pub fn codegen(
#[allow(non_camel_case_types)]
#[allow(non_upper_case_globals)]
#[doc(hidden)]
+ #(#cfgs)*
static #inputs_ident: rtic::RacyCell<[core::mem::MaybeUninit<#input_ty>; #cap_lit]> =
rtic::RacyCell::new([#(#elems,)*]);
));