diff options
Diffstat (limited to 'macros/src')
-rw-r--r-- | macros/src/codegen/hardware_tasks.rs | 1 | ||||
-rw-r--r-- | macros/src/codegen/idle.rs | 1 | ||||
-rw-r--r-- | macros/src/codegen/shared_resources_struct.rs | 4 | ||||
-rw-r--r-- | macros/src/codegen/software_tasks.rs | 1 | ||||
-rw-r--r-- | macros/src/codegen/util.rs | 35 |
5 files changed, 40 insertions, 2 deletions
diff --git a/macros/src/codegen/hardware_tasks.rs b/macros/src/codegen/hardware_tasks.rs index 8532176e..da0d6441 100644 --- a/macros/src/codegen/hardware_tasks.rs +++ b/macros/src/codegen/hardware_tasks.rs @@ -99,6 +99,7 @@ pub fn codegen( #[allow(non_snake_case)] fn #name(#context: #name::Context) { use rtic::Mutex as _; + use rtic::MutexStruct as _; use rtic::mutex_prelude::*; #(#stmts)* diff --git a/macros/src/codegen/idle.rs b/macros/src/codegen/idle.rs index 09a95598..718ed261 100644 --- a/macros/src/codegen/idle.rs +++ b/macros/src/codegen/idle.rs @@ -73,6 +73,7 @@ pub fn codegen( #[allow(non_snake_case)] fn #name(#context: #name::Context) -> ! { use rtic::Mutex as _; + use rtic::MutexStruct as _; use rtic::mutex_prelude::*; #(#stmts)* diff --git a/macros/src/codegen/shared_resources_struct.rs b/macros/src/codegen/shared_resources_struct.rs index 21a1f991..6ca9710b 100644 --- a/macros/src/codegen/shared_resources_struct.rs +++ b/macros/src/codegen/shared_resources_struct.rs @@ -168,14 +168,14 @@ pub fn codegen( let (lock_all, get_prio) = if let Some(name) = field_get_prio { ( - util::impl_mutex( + util::impl_mutex_struct( extra, &vec![], // TODO: what cfg should go here? quote!(#ident), quote!(#ident_mut<#lt>), max_ceiling, quote!(self.priority()), - quote!(|| { &mut #ident_mut::new() }), + quote!(|| { #ident_mut::new() }), ), quote!( // Used by the lock-all API diff --git a/macros/src/codegen/software_tasks.rs b/macros/src/codegen/software_tasks.rs index c8ea3059..56779c7b 100644 --- a/macros/src/codegen/software_tasks.rs +++ b/macros/src/codegen/software_tasks.rs @@ -132,6 +132,7 @@ pub fn codegen( #[allow(non_snake_case)] fn #name(#context: #name::Context #(,#inputs)*) { use rtic::Mutex as _; + use rtic::MutexStruct as _; use rtic::mutex_prelude::*; #(#stmts)* diff --git a/macros/src/codegen/util.rs b/macros/src/codegen/util.rs index 9f84359c..671f839a 100644 --- a/macros/src/codegen/util.rs +++ b/macros/src/codegen/util.rs @@ -54,6 +54,41 @@ pub fn impl_mutex( ) } +/// Generates a `MutexStruct` implementation +pub fn impl_mutex_struct( + extra: &Extra, + cfgs: &[Attribute], + path: TokenStream2, + ty: TokenStream2, + ceiling: u8, + priority: TokenStream2, + ptr: TokenStream2, +) -> TokenStream2 { + let device = &extra.device; + quote!( + #(#cfgs)* + impl<'a> rtic::MutexStruct for #path<'a> { + type T = #ty; + + #[inline(always)] + fn lock<RTIC_INTERNAL_R>(&mut self, f: impl FnOnce(#ty) -> RTIC_INTERNAL_R) -> RTIC_INTERNAL_R { + /// Priority ceiling + const CEILING: u8 = #ceiling; + + unsafe { + rtic::export::lock_struct( + #ptr, + #priority, + CEILING, + #device::NVIC_PRIO_BITS, + f, + ) + } + } + } + ) +} + /// Generates an identifier for the `INPUTS` buffer (`spawn` & `schedule` API) pub fn inputs_ident(task: &Ident) -> Ident { mark_internal_name(&format!("{}_INPUTS", task)) |