aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jonas Schievink <jonasschievink@gmail.com> 2017-09-22 18:19:18 +0200
committerGravatar Jonas Schievink <jonasschievink@gmail.com> 2017-09-22 18:19:18 +0200
commit1556948458a386d13ff756e64dc60f8a6198e9d8 (patch)
treee06c41e37dcc732ef2525cdc676e519564b173bd
parent70e243694dba333c62116e692edecfaf93186413 (diff)
downloadrtic-1556948458a386d13ff756e64dc60f8a6198e9d8.tar.gz
rtic-1556948458a386d13ff756e64dc60f8a6198e9d8.tar.zst
rtic-1556948458a386d13ff756e64dc60f8a6198e9d8.zip
Fix shared resource handling and extend example.
The extended example tests that this actually works this time.
-rw-r--r--examples/late-resources.rs16
-rw-r--r--macros/src/trans.rs13
2 files changed, 24 insertions, 5 deletions
diff --git a/examples/late-resources.rs b/examples/late-resources.rs
index 933a252b..b5dba146 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 890e083d..45841e73 100644
--- a/macros/src/trans.rs
+++ b/macros/src/trans.rs
@@ -351,6 +351,11 @@ fn resources(app: &App, ownerships: &Ownerships, root: &mut Vec<Tokens>) {
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<Tokens>) {
) -> &'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<Tokens>) {
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<Tokens>) {
{
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<Tokens>) {
{
unsafe {
#krate::claim(
- #krate::Static::ref_mut(&mut #_name),
+ #krate::Static::ref_mut(&mut #res_rvalue),
#ceiling,
#device::NVIC_PRIO_BITS,
t,