aboutsummaryrefslogtreecommitdiff
path: root/macros/src
diff options
context:
space:
mode:
Diffstat (limited to 'macros/src')
-rw-r--r--macros/src/codegen/hardware_tasks.rs1
-rw-r--r--macros/src/codegen/idle.rs1
-rw-r--r--macros/src/codegen/shared_resources_struct.rs4
-rw-r--r--macros/src/codegen/software_tasks.rs1
-rw-r--r--macros/src/codegen/util.rs35
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))