aboutsummaryrefslogtreecommitdiff
path: root/rtic-macros/src/codegen.rs
diff options
context:
space:
mode:
authorGravatar bors[bot] <26634292+bors[bot]@users.noreply.github.com> 2023-03-04 21:10:24 +0000
committerGravatar GitHub <noreply@github.com> 2023-03-04 21:10:24 +0000
commit7c7d6558f6d9c50fbb4d2487c98c9a5be15f2f7b (patch)
tree80a47f0dc40059014e9448c4c2eb34c54dff45fe /rtic-macros/src/codegen.rs
parent1c5db277e4161470136dbd2a11e914ff1d383581 (diff)
parent98c5490d94950608d31cd5ad9dd260f2f853735c (diff)
downloadrtic-7c7d6558f6d9c50fbb4d2487c98c9a5be15f2f7b.tar.gz
rtic-7c7d6558f6d9c50fbb4d2487c98c9a5be15f2f7b.tar.zst
rtic-7c7d6558f6d9c50fbb4d2487c98c9a5be15f2f7b.zip
Merge #694
694: RTIC 2 r=AfoHT a=korken89 Co-authored-by: Emil Fresk <emil.fresk@gmail.com> Co-authored-by: Per Lindgren <per.lindgren@ltu.se>
Diffstat (limited to 'rtic-macros/src/codegen.rs')
-rw-r--r--rtic-macros/src/codegen.rs77
1 files changed, 77 insertions, 0 deletions
diff --git a/rtic-macros/src/codegen.rs b/rtic-macros/src/codegen.rs
new file mode 100644
index 00000000..48ee5e33
--- /dev/null
+++ b/rtic-macros/src/codegen.rs
@@ -0,0 +1,77 @@
+use proc_macro2::TokenStream as TokenStream2;
+use quote::quote;
+
+use crate::analyze::Analysis;
+use crate::syntax::ast::App;
+
+pub mod bindings;
+
+mod assertions;
+mod async_dispatchers;
+mod hardware_tasks;
+mod idle;
+mod init;
+mod local_resources;
+mod local_resources_struct;
+mod module;
+mod post_init;
+mod pre_init;
+mod shared_resources;
+mod shared_resources_struct;
+mod software_tasks;
+mod util;
+
+mod main;
+
+// TODO: organize codegen to actual parts of code
+// so `main::codegen` generates ALL the code for `fn main`,
+// `software_tasks::codegen` generates ALL the code for software tasks etc...
+
+#[allow(clippy::too_many_lines)]
+pub fn app(app: &App, analysis: &Analysis) -> TokenStream2 {
+ // Generate the `main` function
+ let main = main::codegen(app, analysis);
+ let init_codegen = init::codegen(app, analysis);
+ let idle_codegen = idle::codegen(app, analysis);
+ let shared_resources_codegen = shared_resources::codegen(app, analysis);
+ let local_resources_codegen = local_resources::codegen(app, analysis);
+ let hardware_tasks_codegen = hardware_tasks::codegen(app, analysis);
+ let software_tasks_codegen = software_tasks::codegen(app, analysis);
+ let async_dispatchers_codegen = async_dispatchers::codegen(app, analysis);
+
+ let user_imports = &app.user_imports;
+ let user_code = &app.user_code;
+ let name = &app.name;
+ let device = &app.args.device;
+
+ let rt_err = util::rt_err_ident();
+
+ quote!(
+ /// The RTIC application module
+ pub mod #name {
+ /// Always include the device crate which contains the vector table
+ use #device as #rt_err;
+
+ #(#user_imports)*
+
+ #(#user_code)*
+ /// User code end
+
+ #init_codegen
+
+ #idle_codegen
+
+ #hardware_tasks_codegen
+
+ #software_tasks_codegen
+
+ #shared_resources_codegen
+
+ #local_resources_codegen
+
+ #async_dispatchers_codegen
+
+ #main
+ }
+ )
+}