diff --git a/examples/late-resources.rs b/examples/late-resources.rs index 933a252b24..b5dba1467e 100644 --- a/examples/late-resources.rs +++ b/examples/late-resources.rs @@ -26,13 +26,24 @@ app! { // the initializer. Doing that will require `init` to return the values of all "late" // resources. static IP_ADDRESS: u32; + + // PORT is used by 2 tasks, making it a shared resource. This just tests another internal + // code path and is not important for the example. + static PORT: u16; }, tasks: { SYS_TICK: { + priority: 1, path: sys_tick, - resources: [IP_ADDRESS, ON], + resources: [IP_ADDRESS, PORT, ON], }, + + EXTI0: { + priority: 2, + path: exti0, + resources: [PORT], + } } } @@ -47,6 +58,7 @@ fn init(_p: init::Peripherals, _r: init::Resources) -> init::LateResourceValues init::LateResourceValues { // This struct will contain fields for all resources with omitted initializers. IP_ADDRESS: ip_address, + PORT: 0, } } @@ -57,6 +69,8 @@ fn sys_tick(_t: &mut Threshold, r: SYS_TICK::Resources) { r.IP_ADDRESS; } +fn exti0(_t: &mut Threshold, _r: EXTI0::Resources) {} + fn idle() -> ! { loop { rtfm::wfi(); diff --git a/macros/src/trans.rs b/macros/src/trans.rs index 890e083d07..45841e7300 100644 --- a/macros/src/trans.rs +++ b/macros/src/trans.rs @@ -351,6 +351,11 @@ fn resources(app: &App, ownerships: &Ownerships, root: &mut Vec) { Ownership::Shared { ceiling } => { if let Some(resource) = app.resources.get(name) { let ty = &resource.ty; + let res_rvalue = if resource.expr.is_some() { + quote!(#_name) + } else { + quote!(#_name.some) + }; impl_items.push(quote! { type Data = #ty; @@ -361,7 +366,7 @@ fn resources(app: &App, ownerships: &Ownerships, root: &mut Vec) { ) -> &'cs #krate::Static<#ty> { assert!(t.value() >= #ceiling); - unsafe { #krate::Static::ref_(&#_name) } + unsafe { #krate::Static::ref_(&#res_rvalue) } } fn borrow_mut<'cs>( @@ -371,7 +376,7 @@ fn resources(app: &App, ownerships: &Ownerships, root: &mut Vec) { assert!(t.value() >= #ceiling); unsafe { - #krate::Static::ref_mut(&mut #_name) + #krate::Static::ref_mut(&mut #res_rvalue) } } @@ -387,7 +392,7 @@ fn resources(app: &App, ownerships: &Ownerships, root: &mut Vec) { { unsafe { #krate::claim( - #krate::Static::ref_(&#_name), + #krate::Static::ref_(&#res_rvalue), #ceiling, #device::NVIC_PRIO_BITS, t, @@ -408,7 +413,7 @@ fn resources(app: &App, ownerships: &Ownerships, root: &mut Vec) { { unsafe { #krate::claim( - #krate::Static::ref_mut(&mut #_name), + #krate::Static::ref_mut(&mut #res_rvalue), #ceiling, #device::NVIC_PRIO_BITS, t,