mirror of
https://github.com/rtic-rs/rtic.git
synced 2024-11-23 12:12:50 +01:00
First example builds again
This commit is contained in:
parent
858320cbfc
commit
3b97531a5c
5 changed files with 20 additions and 32 deletions
|
@ -13,7 +13,6 @@ use panic_semihosting as _;
|
|||
#[rtic::app(device = lm3s6965, dispatchers = [SSI0, UART0], peripherals = true)]
|
||||
mod app {
|
||||
use cortex_m_semihosting::{debug, hprintln};
|
||||
use systick_monotonic::*;
|
||||
|
||||
#[shared]
|
||||
struct Shared {}
|
||||
|
@ -21,21 +20,13 @@ mod app {
|
|||
#[local]
|
||||
struct Local {}
|
||||
|
||||
#[monotonic(binds = SysTick, default = true)]
|
||||
type MyMono = Systick<100>;
|
||||
|
||||
#[init]
|
||||
fn init(cx: init::Context) -> (Shared, Local, init::Monotonics) {
|
||||
fn init(cx: init::Context) -> (Shared, Local) {
|
||||
hprintln!("init").unwrap();
|
||||
|
||||
normal_task::spawn().ok();
|
||||
async_task::spawn().ok();
|
||||
async_task::spawn().unwrap();
|
||||
|
||||
(
|
||||
Shared {},
|
||||
Local {},
|
||||
init::Monotonics(Systick::new(cx.core.SYST, 12_000_000)),
|
||||
)
|
||||
(Shared {}, Local {})
|
||||
}
|
||||
|
||||
#[idle]
|
||||
|
@ -47,11 +38,6 @@ mod app {
|
|||
}
|
||||
}
|
||||
|
||||
#[task]
|
||||
fn normal_task(_cx: normal_task::Context) {
|
||||
hprintln!("hello from normal").ok();
|
||||
}
|
||||
|
||||
#[task]
|
||||
async fn async_task(_cx: async_task::Context) {
|
||||
hprintln!("hello from async").ok();
|
||||
|
|
|
@ -45,23 +45,20 @@ pub fn codegen(app: &App, analysis: &Analysis) -> Vec<TokenStream2> {
|
|||
let executor_run_ident = util::executor_run_ident(name);
|
||||
|
||||
let rq = util::rq_async_ident(name);
|
||||
let (rq_ty, rq_expr) = {
|
||||
(
|
||||
quote!(rtic::export::ASYNCRQ<(), 2>), // TODO: This needs updating to a counter instead of a queue
|
||||
quote!(rtic::export::Queue::new()),
|
||||
)
|
||||
};
|
||||
|
||||
items.push(quote!(
|
||||
#[doc(hidden)]
|
||||
#[allow(non_camel_case_types)]
|
||||
#[allow(non_upper_case_globals)]
|
||||
static #rq: rtic::RacyCell<#rq_ty> = rtic::RacyCell::new(#rq_expr);
|
||||
static #rq: core::sync::atomic::AtomicBool = core::sync::atomic::AtomicBool::new(false);
|
||||
));
|
||||
|
||||
stmts.push(quote!(
|
||||
if !(&*#exec_name.get()).is_running() {
|
||||
if let Some(()) = rtic::export::interrupt::free(|_| (&mut *#rq.get_mut()).dequeue()) {
|
||||
// TODO Fix this to be compare and swap
|
||||
if #rq.load(core::sync::atomic::Ordering::Relaxed) {
|
||||
#rq.store(false, core::sync::atomic::Ordering::Relaxed);
|
||||
|
||||
|
||||
// The async executor needs a static priority
|
||||
#prio_name.get_mut().write(rtic::export::Priority::new(PRIORITY));
|
||||
|
@ -77,7 +74,7 @@ pub fn codegen(app: &App, analysis: &Analysis) -> Vec<TokenStream2> {
|
|||
if (&mut *#exec_name.get_mut()).poll(|| {
|
||||
#executor_run_ident.store(true, core::sync::atomic::Ordering::Release);
|
||||
rtic::pend(#device::#enum_::#interrupt);
|
||||
}) && !rtic::export::interrupt::free(|_| (&*#rq.get_mut()).is_empty()) {
|
||||
}) && #rq.load(core::sync::atomic::Ordering::Relaxed) {
|
||||
// If the ready queue is not empty and the executor finished, restart this
|
||||
// dispatch to check if the executor should be restarted.
|
||||
rtic::pend(#device::#enum_::#interrupt);
|
||||
|
|
|
@ -183,13 +183,14 @@ pub fn codegen(
|
|||
#[doc(hidden)]
|
||||
pub fn #internal_spawn_ident() -> Result<(), ()> {
|
||||
unsafe {
|
||||
let r = rtic::export::interrupt::free(|_| (&mut *#rq.get_mut()).enqueue(()));
|
||||
|
||||
if r.is_ok() {
|
||||
// TODO: Fix this to be compare and swap
|
||||
if #rq.load(core::sync::atomic::Ordering::Acquire) {
|
||||
Err(())
|
||||
} else {
|
||||
#rq.store(true, core::sync::atomic::Ordering::Release);
|
||||
rtic::pend(#device::#enum_::#interrupt);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
r
|
||||
}
|
||||
}));
|
||||
|
||||
|
|
|
@ -154,7 +154,7 @@ pub fn local_resources_ident(ctxt: Context, app: &App) -> Ident {
|
|||
|
||||
/// Generates an identifier for a ready queue, async task version
|
||||
pub fn rq_async_ident(async_task_name: &Ident) -> Ident {
|
||||
mark_internal_name(&format!("ASYNC_TACK_{}_RQ", async_task_name))
|
||||
mark_internal_name(&format!("ASYNC_TASK_{}_RQ", async_task_name))
|
||||
}
|
||||
|
||||
/// Suffixed identifier
|
||||
|
|
4
rust-toolchain.toml
Normal file
4
rust-toolchain.toml
Normal file
|
@ -0,0 +1,4 @@
|
|||
[toolchain]
|
||||
channel = "nightly"
|
||||
components = [ "rust-src", "rustfmt", "llvm-tools-preview" ]
|
||||
targets = [ "thumbv7em-none-eabihf" ]
|
Loading…
Reference in a new issue