use proc_macro2::TokenStream as TokenStream2; use quote::quote; use rtfm_syntax::ast::App; use crate::{analyze::Analysis, check::Extra}; mod assertions; mod dispatchers; mod hardware_tasks; mod idle; mod init; mod locals; mod module; mod post_init; mod pre_init; mod resources; mod resources_struct; mod schedule; mod schedule_body; mod software_tasks; mod spawn; mod spawn_body; mod timer_queue; mod util; // TODO document the syntax here or in `rtfm-syntax` pub fn app(app: &App, analysis: &Analysis, extra: &Extra) -> TokenStream2 { let mut const_app = vec![]; let mut mains = vec![]; let mut root = vec![]; let mut user = vec![]; // generate a `main` function for each core for core in 0..app.args.cores { let assertion_stmts = assertions::codegen(core, analysis, extra); let (const_app_pre_init, pre_init_stmts) = pre_init::codegen(core, &app, analysis, extra); let (const_app_init, root_init, user_init, call_init) = init::codegen(core, app, analysis, extra); let (const_app_post_init, post_init_stmts) = post_init::codegen(core, &app, analysis, extra); let (const_app_idle, root_idle, user_idle, call_idle) = idle::codegen(core, app, analysis, extra); user.push(quote!( #user_init #user_idle )); root.push(quote!( #(#root_init)* #(#root_idle)* )); const_app.push(quote!( #(#const_app_pre_init)* #const_app_init #(#const_app_post_init)* #const_app_idle )); let cfg_core = util::cfg_core(core, app.args.cores); let main = util::suffixed("main", core); let section = util::link_section("text", core); mains.push(quote!( #[no_mangle] #section #cfg_core unsafe extern "C" fn #main() -> ! { let _TODO: () = (); #(#assertion_stmts)* #(#pre_init_stmts)* #call_init #(#post_init_stmts)* #call_idle } )); } let (const_app_resources, mod_resources) = resources::codegen(app, analysis, extra); let (const_app_hardware_tasks, root_hardware_tasks, user_hardware_tasks) = hardware_tasks::codegen(app, analysis, extra); let (const_app_software_tasks, root_software_tasks, user_software_tasks) = software_tasks::codegen(app, analysis, extra); let const_app_dispatchers = dispatchers::codegen(app, analysis, extra); let const_app_spawn = spawn::codegen(app, analysis, extra); let const_app_timer_queue = timer_queue::codegen(app, analysis, extra); let const_app_schedule = schedule::codegen(app, extra); let cores = app.args.cores.to_string(); let cfg_core = quote!(#[cfg(core = #cores)]); let msg = format!( "specified {} core{} but tried to compile for more than {0} core{1}", app.args.cores, if app.args.cores > 1 { "s" } else { "" } ); let check_excess_cores = quote!( #cfg_core compile_error!(#msg); ); let name = &app.name; let device = extra.device; quote!( #(#user)* #(#user_hardware_tasks)* #(#user_software_tasks)* #(#root)* #mod_resources #(#root_hardware_tasks)* #(#root_software_tasks)* /// Implementation details // the user can't access the items within this `const` item const #name: () = { /// Always include the device crate which contains the vector table use #device as _; #check_excess_cores #(#const_app)* #(#const_app_resources)* #(#const_app_hardware_tasks)* #(#const_app_software_tasks)* #(#const_app_dispatchers)* #(#const_app_spawn)* #(#const_app_timer_queue)* #(#const_app_schedule)* #(#mains)* }; ) } xamples/framework-react'>examples/framework-react Unnamed repository; edit this file 'description' to name the repository.
aboutsummaryrefslogtreecommitdiff
path: root/examples/basics/src (unfollow)
AgeCommit message (Expand)AuthorFilesLines
2024-02-27Improve the message of `MiddlewareCantBeLoaded` for clarity (#10239)Gravatar Ming-jun Lu 2-1/+6
2024-02-26[ci] formatGravatar Martin Trapp 1-1/+3
2024-02-26Warn when view transitions run on a prefer-reduced-motion device (#10222)Gravatar Martin Trapp 2-0/+8
2024-02-26[ci] release (#10218)astro@4.4.5@astrojs/vercel@7.3.4@astrojs/svelte@5.1.0@astrojs/db@0.4.1Gravatar Houston (Bot) 46-114/+100
2024-02-26fix: better assetsInlineLimit runtime type checking (#10154)Gravatar James Ross 2-9/+13
2024-02-26fix: correct remote url (#10223)Gravatar Ben Holmes 2-2/+8
2024-02-26fix(toolbar): Make it so every built-in app can be closed by outside clicks (...Gravatar Erika 8-51/+63
2024-02-26Fix an issue where Vercel adapter may create functions for prerendered routes...Gravatar Ming-jun Lu 4-2/+26
2024-02-26[ci] formatGravatar Matthew Phillips 1-1/+1
2024-02-26Fix hydration scripts missing from dynamic slot usage (#10219)Gravatar Matthew Phillips 6-1/+69
2024-02-26[ci] formatGravatar Matthew Phillips 1-5/+5
2024-02-26Prevent errors in rendering from crashing server (#10221)Gravatar Matthew Phillips 7-14/+78
2024-02-26fix: svelte 5 mount/hydrate api change. (#10224)Gravatar 前端子鱼 3-5/+12
2024-02-24[ci] formatGravatar Arsh 1-9/+30
2024-02-24prevent warning: `Astro.request.headers` is not available in "static" output ...Gravatar Arsh 2-27/+30
2024-02-23Improved error logging from config (#10207)Gravatar Ben Holmes 4-36/+67
2024-02-23[ci] formatGravatar Arsh 3-3/+3
2024-02-23fix(dev): remove params for prerendered pages (#10199)Gravatar Arsh 9-13/+78
2024-02-23[ci] release (#10213)astro@4.4.4@astrojs/vercel@7.3.3@astrojs/node@8.2.1@astrojs/db@0.4.0Gravatar Houston (Bot) 41-177/+95
2024-02-23Fixes edge middleware calling nested routes (#10215)Gravatar Matthew Phillips 2-1/+6
2024-02-23Adds an error message for non-string transition:name values (#10205)Gravatar Martin Trapp 2-0/+8
2024-02-23[ci] formatGravatar Furkan Erdem 1-1/+1
2024-02-23Fix(node): Custom headers are not present in responses from standalone Node s...Gravatar Furkan Erdem 8-0/+163