diff --git a/examples/lockall_destruct.rs b/examples/lockall_destruct.rs new file mode 100644 index 0000000000..9add1cefd8 --- /dev/null +++ b/examples/lockall_destruct.rs @@ -0,0 +1,60 @@ +//! examples/lockall.rs + +#![deny(unsafe_code)] +#![deny(warnings)] +#![no_main] +#![no_std] + +use panic_semihosting as _; + +#[rtic::app(device = lm3s6965, dispatchers = [GPIOA, GPIOB, GPIOC])] +mod app { + use cortex_m_semihosting::{debug, hprintln}; + + #[shared] + struct Shared { + a: u32, + b: i64, + } + + #[local] + struct Local {} + + #[init] + fn init(_: init::Context) -> (Shared, Local, init::Monotonics) { + foo::spawn().unwrap(); + + (Shared { a: 1, b: 2 }, Local {}, init::Monotonics()) + } + + // when omitted priority is assumed to be `1` + #[task(shared = [a, b])] + fn foo(mut c: foo::Context) { + c.shared.lock(|Shared { a, b }| { + hprintln!("foo: a = {}, b = {}", a, b).ok(); + *a += 1; + bar::spawn().unwrap(); + baz::spawn().unwrap(); + hprintln!("still in foo::lock").ok(); + }); + hprintln!("still in foo").ok(); + debug::exit(debug::EXIT_SUCCESS); // Exit QEMU simulator + } + + #[task(priority = 2, shared = [a])] + fn bar(mut c: bar::Context) { + // the higher priority task does still need a critical section + let a = c.shared.lock(|s| { + *s.a += 1; + // *s.b += 1; `b` not accessible + *s.a + }); + + hprintln!("bar: a = {}", a).unwrap(); + } + + #[task(priority = 3)] + fn baz(_: baz::Context) { + hprintln!("baz").unwrap(); + } +} diff --git a/macros/src/codegen/module.rs b/macros/src/codegen/module.rs index c59a814c6e..dd7f37cb79 100644 --- a/macros/src/codegen/module.rs +++ b/macros/src/codegen/module.rs @@ -89,6 +89,7 @@ pub fn codegen( if ctxt.has_shared_resources(app) { let ident = util::shared_resources_ident(ctxt, app); + let ident_mut = util::shared_resources_ident_mut(ctxt, app); let lt = if shared_resources_tick { lt = Some(quote!('a)); Some(quote!('a)) @@ -99,6 +100,10 @@ pub fn codegen( module_items.push(quote!( #[doc(inline)] pub use super::#ident as SharedResources; + + #[doc(inline)] + pub use super::#ident_mut as Shared; + )); fields.push(quote!(