use proc_macro2::TokenStream as TokenStream2; use quote::quote; use rtic_syntax::ast::App; use crate::{analyze::Analysis, check::Extra, codegen::util}; /// Generates task dispatchers pub fn codegen(app: &App, analysis: &Analysis, extra: &Extra) -> Vec { let mut items = vec![]; let interrupts = &analysis.interrupts; for (&level, channel) in &analysis.channels { let mut stmts = vec![]; let variants = channel .tasks .iter() .map(|name| { let cfgs = &app.software_tasks[name].cfgs; quote!( #(#cfgs)* #name ) }) .collect::>(); let doc = format!( "Software tasks to be dispatched at priority level {}", level, ); let t = util::spawn_t_ident(level); items.push(quote!( #[allow(non_camel_case_types)] #[derive(Clone, Copy)] #[doc = #doc] pub enum #t { #(#variants,)* } )); let n = util::capacity_typenum(channel.capacity, true); let rq = util::rq_ident(level); let (rq_ty, rq_expr) = { ( quote!(rtic::export::SCRQ<#t, #n>), quote!(rtic::export::Queue(unsafe { rtic::export::iQueue::u8_sc() })), ) }; let doc = format!( "Queue of tasks ready to be dispatched at priority level {}", level ); items.push(quote!( #[doc = #doc] static mut #rq: #rq_ty = #rq_expr; )); let arms = channel .tasks .iter() .map(|name| { let task = &app.software_tasks[name]; let cfgs = &task.cfgs; let fq = util::fq_ident(name); let inputs = util::inputs_ident(name); let (_, tupled, pats, _) = util::regroup_inputs(&task.inputs); let (let_instant, instant) = if extra.monotonic.is_some() { let instants = util::instants_ident(name); ( quote!( let instant = #instants.get_unchecked(usize::from(index)).as_ptr().read(); ), quote!(, instant), ) } else { (quote!(), quote!()) }; let locals_new = if task.locals.is_empty() { quote!() } else { quote!(#name::Locals::new(),) }; let app_name = &app.name; let app_path = quote! {crate::#app_name}; quote!( #(#cfgs)* #t::#name => { let #tupled = #inputs.get_unchecked(usize::from(index)).as_ptr().read(); #let_instant #fq.split().0.enqueue_unchecked(index); let priority = &rtic::export::Priority::new(PRIORITY); #app_path::#name( #locals_new #name::Context::new(priority #instant) #(,#pats)* ) } ) }) .collect::>(); stmts.push(quote!( while let Some((task, index)) = #rq.split().1.dequeue() { match task { #(#arms)* } } )); let doc = format!("Interrupt handler to dispatch tasks at priority {}", level); let interrupt = util::suffixed(&interrupts[&level].to_string()); items.push(quote!( #[allow(non_snake_case)] #[doc = #doc] #[no_mangle] unsafe fn #interrupt() { /// The priority of this interrupt handler const PRIORITY: u8 = #level; rtic::export::run(PRIORITY, || { #(#stmts)* }); } )); } items } 'examples/hackernews'>examples/hackernews Unnamed repository; edit this file 'description' to name the repository.
aboutsummaryrefslogtreecommitdiff
AgeCommit message (Expand)AuthorFilesLines
2022-01-11[ci] collect statsGravatar FredKSchott 1-0/+1
2022-01-10Use smooth scrolling with reduced motion has no preference (#2355)Gravatar Jonathan Neal 1-3/+7
2022-01-10move changeset to run after build, no test required (#2341)Gravatar Fred K. Schott 1-2/+2
2022-01-10Note that Astro also supports `<Fragment>` syntax (#2354)Gravatar Zade Viggers 1-16/+18
2022-01-10smooth scroll behavior property added (#2256)Gravatar Divyamrit 1-1/+3
2022-01-10Add Astro Blog RSS feed (#2301)Gravatar Rafael Bardini 2-3/+20
2022-01-10Update Cloudflare Pages guide (#2345)Gravatar Jacob Rask 1-2/+2
2022-01-10[ci] update lockfile (#2351)Gravatar Fred K. Schott 1-116/+116
2022-01-10Update instructions for the monorepo (#2274)Gravatar Caleb Jasik 1-5/+12
2022-01-10Fix Astro Preview Pathing Issues (#2338)Gravatar Jonathan Neal 5-144/+150
2022-01-10[ci] collect statsGravatar FredKSchott 1-0/+1
2022-01-09[ci] collect statsGravatar FredKSchott 1-0/+1
2022-01-08[ci] update lockfile (#2344)Gravatar Fred K. Schott 1-33/+33
2022-01-08Fix sitemap.xml page urls (#2335)Gravatar Jonathan Neal 4-4/+8
2022-01-08[ci] collect statsGravatar FredKSchott 1-0/+1
2022-01-07Create .git-blame-ignore-revs (#2254)Gravatar Jonathan Neal 2-0/+8
2022-01-07Fix issue with plugins running twice in dev and build (#2323)Gravatar Jonathan Neal 2-2/+5
2022-01-07[ci] yarn formatGravatar matthewp 1-8/+8
2022-01-07[ci] release (#2339)astro@0.22.9Gravatar github-actions[bot] 28-39/+40
2022-01-07[ci] yarn formatGravatar matthewp 3-7/+8
2022-01-07Handle loading the Code package in the static build (#2337)Gravatar Matthew Phillips 8-4/+87
2022-01-07[ci] update lockfile (#2334)Gravatar Fred K. Schott 1-154/+154
2022-01-07[ci] yarn formatGravatar matthewp 1-8/+8
2022-01-07[ci] release (#2333)astro@0.22.8Gravatar github-actions[bot] 28-39/+40
2022-01-07[ci] collect statsGravatar FredKSchott 1-0/+1
2022-01-06[ci] yarn formatGravatar matthewp 4-54/+54
2022-01-06[ci] update lockfile (#2327)Gravatar Fred K. Schott 1-58/+64
2022-01-06Fix subpath support regressions (#2330)Gravatar Matthew Phillips 12-22/+566
2022-01-06[ci] yarn formatGravatar natemoo-re 1-2/+2
2022-01-06Added "IntelliSense for TypeScript" (#2326)astro@0.22.7Gravatar Morritz 1-0/+17
2022-01-06[ci] collect statsGravatar FredKSchott 1-0/+1
2022-01-06[ci] yarn formatGravatar FredKSchott 1-8/+8
2022-01-05[ci] release (#2320)Gravatar github-actions[bot] 31-54/+46
2022-01-05chore: update compiler (#2324)Gravatar Nate Moore 3-5/+10