late example now works with RacyCell

This commit is contained in:
Per Lindgren 2021-03-13 22:56:42 +01:00
parent d4d5713e5a
commit 7c731fdbaf
3 changed files with 22 additions and 15 deletions

View file

@ -20,7 +20,7 @@ mod app {
// Late resources
#[resources]
struct Resources {
// p: Producer<'static, u32, U4>,
p: Producer<'static, u32, U4>,
c: Consumer<'static, u32, U4>,
#[task_local]
#[init(Queue(i::Queue::new()))]
@ -32,8 +32,7 @@ mod app {
let (p, c) = cx.resources.q.split();
// Initialization of late resources
// (init::LateResources { p, c }, init::Monotonics())
(init::LateResources { c }, init::Monotonics())
(init::LateResources { p, c }, init::Monotonics())
}
#[idle(resources = [c])]
@ -49,8 +48,8 @@ mod app {
}
}
// #[task(binds = UART0, resources = [p])]
// fn uart0(mut c: uart0::Context) {
// c.resources.p.lock(|p| p.enqueue(42).unwrap());
// }
#[task(binds = UART0, resources = [p])]
fn uart0(mut c: uart0::Context) {
c.resources.p.lock(|p| p.enqueue(42).unwrap());
}
}

View file

@ -24,7 +24,7 @@ pub fn codegen(app: &App, analysis: &Analysis) -> Vec<TokenStream2> {
// - `get_mut_unchecked` to obtain `MaybeUninit<T>`
// - `as_mut_ptr` to obtain a raw pointer to `MaybeUninit<T>`
// - `write` the defined value for the late resource T
#mangled_name.get_mut_unchecked().as_mut_ptr().write(late.#name);
#mangled_name.get_mut_unchecked().as_mut_ptr().write(late.#name);
));
}
}

View file

@ -93,17 +93,23 @@ pub fn codegen(
}
));
let ptr = if expr.is_none() {
let (ptr, doc) = if expr.is_none() {
// late resource
quote!(
#(#cfgs)*
&mut #mangled_name.get_mut_unchecked().assume_init()
(
quote!(
#(#cfgs)*
#mangled_name.get_mut_unchecked().as_mut_ptr()
),
"late",
)
} else {
// early resource
quote!(
#(#cfgs)*
unsafe { #mangled_name.get_mut_unchecked() }
(
quote!(
#(#cfgs)*
#mangled_name.get_mut_unchecked()
),
"early",
)
};
@ -114,6 +120,8 @@ pub fn codegen(
None => 0,
};
// let doc = format!(" RTIC internal ({} resource): {}:{}", doc, file!(), line!());
mod_app.push(util::impl_mutex(
extra,
cfgs,