diff options
Diffstat (limited to 'macros/src/codegen')
-rw-r--r-- | macros/src/codegen/dispatchers.rs | 10 | ||||
-rw-r--r-- | macros/src/codegen/hardware_tasks.rs | 6 | ||||
-rw-r--r-- | macros/src/codegen/post_init.rs | 18 | ||||
-rw-r--r-- | macros/src/codegen/pre_init.rs | 17 | ||||
-rw-r--r-- | macros/src/codegen/resources.rs | 8 | ||||
-rw-r--r-- | macros/src/codegen/software_tasks.rs | 8 | ||||
-rw-r--r-- | macros/src/codegen/spawn_body.rs | 5 | ||||
-rw-r--r-- | macros/src/codegen/timer_queue.rs | 8 | ||||
-rw-r--r-- | macros/src/codegen/util.rs | 23 |
9 files changed, 86 insertions, 17 deletions
diff --git a/macros/src/codegen/dispatchers.rs b/macros/src/codegen/dispatchers.rs index 65d25c78..988e3c84 100644 --- a/macros/src/codegen/dispatchers.rs +++ b/macros/src/codegen/dispatchers.rs @@ -55,8 +55,14 @@ pub fn codegen(app: &App, analysis: &Analysis, extra: &Extra) -> Vec<TokenStream })), ) } else { + let shared = if cfg!(feature = "heterogeneous") { + Some(quote!(#[rtfm::export::shared])) + } else { + None + }; + ( - Some(quote!(#[rtfm::export::shared])), + shared, quote!(rtfm::export::MCRQ<#t, #n>), quote!(rtfm::export::Queue(rtfm::export::iQueue::u8())), ) @@ -156,7 +162,7 @@ pub fn codegen(app: &App, analysis: &Analysis, extra: &Extra) -> Vec<TokenStream receiver, level ); let cfg_receiver = util::cfg_core(receiver, app.args.cores); - let interrupt = &interrupts[&level]; + let interrupt = util::suffixed(&interrupts[&level].to_string(), receiver); items.push(quote!( #[allow(non_snake_case)] #[doc = #doc] diff --git a/macros/src/codegen/hardware_tasks.rs b/macros/src/codegen/hardware_tasks.rs index e65bad56..e7f053d3 100644 --- a/macros/src/codegen/hardware_tasks.rs +++ b/macros/src/codegen/hardware_tasks.rs @@ -49,7 +49,11 @@ pub fn codegen( quote!(#name::Locals::new(),) }; - let symbol = task.args.binds(name); + let symbol = if cfg!(feature = "homogeneous") { + util::suffixed(&task.args.binds(name).to_string(), core) + } else { + task.args.binds(name).clone() + }; let priority = task.args.priority; const_app.push(quote!( diff --git a/macros/src/codegen/post_init.rs b/macros/src/codegen/post_init.rs index f492d31d..3f1e4451 100644 --- a/macros/src/codegen/post_init.rs +++ b/macros/src/codegen/post_init.rs @@ -27,9 +27,16 @@ pub fn codegen( // initialized if analysis.initialization_barriers.contains_key(&core) { let ib = util::init_barrier(core); + let shared = if cfg!(feature = "heterogeneous") { + Some(quote!( + #[rtfm::export::shared] + )) + } else { + None + }; const_app.push(quote!( - #[rtfm::export::shared] + #shared static #ib: rtfm::export::Barrier = rtfm::export::Barrier::new(); )); @@ -84,9 +91,16 @@ pub fn codegen( if core == FIRST { for &i in analysis.timer_queues.keys() { let rv = util::rendezvous_ident(i); + let shared = if cfg!(feature = "heterogeneous") { + Some(quote!( + #[rtfm::export::shared] + )) + } else { + None + }; const_app.push(quote!( - #[rtfm::export::shared] + #shared static #rv: rtfm::export::Barrier = rtfm::export::Barrier::new(); )); diff --git a/macros/src/codegen/pre_init.rs b/macros/src/codegen/pre_init.rs index 3ba17dcf..19fc6461 100644 --- a/macros/src/codegen/pre_init.rs +++ b/macros/src/codegen/pre_init.rs @@ -39,7 +39,8 @@ pub fn codegen( } stmts.push(quote!( - let mut core = rtfm::export::Peripherals::steal(); + // NOTE(transmute) to avoid debug_assertion in multi-core mode + let mut core: rtfm::export::Peripherals = core::mem::transmute(()); )); let device = extra.device; @@ -64,25 +65,33 @@ pub fn codegen( stmts.push(quote!(let _ = [(); ((1 << #nvic_prio_bits) - #priority as usize)];)); // NOTE this also checks that the interrupt exists in the `Interrupt` enumeration + let interrupt = util::interrupt_ident(core, app.args.cores); stmts.push(quote!( core.NVIC.set_priority( - #device::Interrupt::#name, + #device::#interrupt::#name, rtfm::export::logical2hw(#priority, #nvic_prio_bits), ); )); // NOTE unmask the interrupt *after* setting its priority: changing the priority of a pended // interrupt is implementation defined - stmts.push(quote!(core.NVIC.enable(#device::Interrupt::#name);)); + stmts.push(quote!(core.NVIC.enable(#device::#interrupt::#name);)); } // cross-spawn barriers: now that priorities have been set and the interrupts have been unmasked // we are ready to receive messages from *other* cores if analysis.spawn_barriers.contains_key(&core) { let sb = util::spawn_barrier(core); + let shared = if cfg!(feature = "heterogeneous") { + Some(quote!( + #[rtfm::export::shared] + )) + } else { + None + }; const_app.push(quote!( - #[rtfm::export::shared] + #shared static #sb: rtfm::export::Barrier = rtfm::export::Barrier::new(); )); diff --git a/macros/src/codegen/resources.rs b/macros/src/codegen/resources.rs index 2dd10eac..2425681b 100644 --- a/macros/src/codegen/resources.rs +++ b/macros/src/codegen/resources.rs @@ -33,7 +33,13 @@ pub fn codegen( } => util::cfg_core(*core, app.args.cores), // shared `static`s and cross-initialized resources need to be in `.shared` memory - _ => Some(quote!(#[rtfm::export::shared])), + _ => { + if cfg!(feature = "heterogeneous") { + Some(quote!(#[rtfm::export::shared])) + } else { + None + } + } }; let (ty, expr) = if let Some(expr) = expr { diff --git a/macros/src/codegen/software_tasks.rs b/macros/src/codegen/software_tasks.rs index 8b2c0cd5..383a5d82 100644 --- a/macros/src/codegen/software_tasks.rs +++ b/macros/src/codegen/software_tasks.rs @@ -52,8 +52,14 @@ pub fn codegen( })), ) } else { + let shared = if cfg!(feature = "heterogeneous") { + Some(quote!(#[rtfm::export::shared])) + } else { + None + }; + ( - Some(quote!(#[rtfm::export::shared])), + shared, quote!(rtfm::export::MCFQ<#cap_ty>), quote!(rtfm::export::Queue(rtfm::export::iQueue::u8())), ) diff --git a/macros/src/codegen/spawn_body.rs b/macros/src/codegen/spawn_body.rs index 83cb5c0a..98bce074 100644 --- a/macros/src/codegen/spawn_body.rs +++ b/macros/src/codegen/spawn_body.rs @@ -45,14 +45,15 @@ pub fn codegen( }; let device = extra.device; + let enum_ = util::interrupt_ident(receiver, app.args.cores); let interrupt = &analysis.interrupts[&receiver][&priority]; let pend = if sender != receiver { quote!( - #device::xpend(#receiver, #device::Interrupt::#interrupt); + #device::xpend(#receiver, #device::#enum_::#interrupt); ) } else { quote!( - rtfm::pend(#device::Interrupt::#interrupt); + rtfm::pend(#device::#enum_::#interrupt); ) }; diff --git a/macros/src/codegen/timer_queue.rs b/macros/src/codegen/timer_queue.rs index cb845774..d306ed5b 100644 --- a/macros/src/codegen/timer_queue.rs +++ b/macros/src/codegen/timer_queue.rs @@ -89,15 +89,16 @@ pub fn codegen(app: &App, analysis: &Analysis, extra: &Extra) -> Vec<TokenStream let receiver = task.args.core; let rq = util::rq_ident(receiver, priority, sender); let rqt = util::spawn_t_ident(receiver, priority, sender); + let enum_ = util::interrupt_ident(receiver, app.args.cores); let interrupt = &analysis.interrupts[&receiver][&priority]; let pend = if sender != receiver { quote!( - #device::xpend(#receiver, #device::Interrupt::#interrupt); + #device::xpend(#receiver, #device::#enum_::#interrupt); ) } else { quote!( - rtfm::pend(#device::Interrupt::#interrupt); + rtfm::pend(#device::#enum_::#interrupt); ) }; @@ -115,10 +116,11 @@ pub fn codegen(app: &App, analysis: &Analysis, extra: &Extra) -> Vec<TokenStream .collect::<Vec<_>>(); let priority = timer_queue.priority; + let sys_tick = util::suffixed("SysTick", sender); items.push(quote!( #cfg_sender #[no_mangle] - unsafe fn SysTick() { + unsafe fn #sys_tick() { use rtfm::Mutex as _; /// The priority of this handler diff --git a/macros/src/codegen/util.rs b/macros/src/codegen/util.rs index 203fcee8..8c43b350 100644 --- a/macros/src/codegen/util.rs +++ b/macros/src/codegen/util.rs @@ -27,9 +27,11 @@ pub fn capacity_typenum(capacity: u8, round_up_to_power_of_two: bool) -> TokenSt pub fn cfg_core(core: Core, cores: u8) -> Option<TokenStream2> { if cores == 1 { None - } else { + } else if cfg!(feature = "heterogeneous") { let core = core.to_string(); Some(quote!(#[cfg(core = #core)])) + } else { + None } } @@ -102,6 +104,15 @@ pub fn instants_ident(task: &Ident, sender: Core) -> Ident { Ident::new(&format!("{}_S{}_INSTANTS", task, sender), Span::call_site()) } +pub fn interrupt_ident(core: Core, cores: u8) -> Ident { + let span = Span::call_site(); + if cores == 1 { + Ident::new("Interrupt", span) + } else { + Ident::new(&format!("Interrupt_{}", core), span) + } +} + /// Generates a pre-reexport identifier for the "late resources" struct pub fn late_resources_ident(init: &Ident) -> Ident { Ident::new( @@ -245,6 +256,16 @@ pub fn spawn_t_ident(receiver: Core, priority: u8, sender: Core) -> Ident { ) } +pub fn suffixed(name: &str, core: u8) -> Ident { + let span = Span::call_site(); + + if cfg!(feature = "homogeneous") { + Ident::new(&format!("{}_{}", name, core), span) + } else { + Ident::new(name, span) + } +} + /// Generates an identifier for a timer queue /// /// At most there's one timer queue per core |