aboutsummaryrefslogtreecommitdiff
path: root/macros/src/codegen/hardware_tasks.rs
diff options
context:
space:
mode:
authorGravatar Jorge Aparicio <jorge@japaric.io> 2019-10-28 21:11:13 -0500
committerGravatar Jorge Aparicio <jorge@japaric.io> 2019-10-28 21:11:13 -0500
commita3783a6d3d90ab549766b13651ec8ff8013762c5 (patch)
tree29fc5a2ed50c73ebfeca65fd52ad241d9995677d /macros/src/codegen/hardware_tasks.rs
parentf9b30a1ff87acd5f3c29a32369f0537e8e3d2bf1 (diff)
downloadrtic-a3783a6d3d90ab549766b13651ec8ff8013762c5.tar.gz
rtic-a3783a6d3d90ab549766b13651ec8ff8013762c5.tar.zst
rtic-a3783a6d3d90ab549766b13651ec8ff8013762c5.zip
WIP generators tasksgenerator-tasks
Diffstat (limited to 'macros/src/codegen/hardware_tasks.rs')
-rw-r--r--macros/src/codegen/hardware_tasks.rs40
1 files changed, 40 insertions, 0 deletions
diff --git a/macros/src/codegen/hardware_tasks.rs b/macros/src/codegen/hardware_tasks.rs
index a9c2a2bd..81f0b62f 100644
--- a/macros/src/codegen/hardware_tasks.rs
+++ b/macros/src/codegen/hardware_tasks.rs
@@ -29,6 +29,46 @@ pub fn codegen(
let mut user_tasks = vec![];
for (name, task) in &app.hardware_tasks {
+ // TODO split this big conditional to reuse code below
+ if task.is_generator {
+ let symbol = task.args.binds.clone();
+ let gen_i = util::generator_ident(&name.to_string());
+ const_app.push(quote!(
+ #[allow(non_snake_case)]
+ #[no_mangle]
+ unsafe fn #symbol() {
+ use core::ops::Generator;
+
+ core::pin::Pin::new_unchecked(&mut *#gen_i.as_mut_ptr()).resume();
+ }
+ ));
+
+ let priority = task.args.priority;
+ // `${task}Resources`
+ if !task.args.resources.is_empty() {
+ let (item, constructor) = resources_struct::codegen(
+ Context::HardwareTask(name),
+ priority,
+ &mut false,
+ app,
+ analysis,
+ );
+
+ root.push(item);
+
+ const_app.push(constructor);
+ }
+
+ root.push(module::codegen(
+ Context::HardwareTask(name),
+ false,
+ app,
+ extra,
+ ));
+
+ continue;
+ }
+
let core = task.args.core;
let cfg_core = util::cfg_core(core, app.args.cores);