First example builds again

This commit is contained in:
Emil Fresk 2023-01-04 21:33:41 +01:00 committed by Henrik Tjäder
parent 50a05e9d1c
commit c56bb3011f
5 changed files with 20 additions and 32 deletions

View file

@ -13,7 +13,6 @@ use panic_semihosting as _;
#[rtic::app(device = lm3s6965, dispatchers = [SSI0, UART0], peripherals = true)] #[rtic::app(device = lm3s6965, dispatchers = [SSI0, UART0], peripherals = true)]
mod app { mod app {
use cortex_m_semihosting::{debug, hprintln}; use cortex_m_semihosting::{debug, hprintln};
use systick_monotonic::*;
#[shared] #[shared]
struct Shared {} struct Shared {}
@ -21,21 +20,13 @@ mod app {
#[local] #[local]
struct Local {} struct Local {}
#[monotonic(binds = SysTick, default = true)]
type MyMono = Systick<100>;
#[init] #[init]
fn init(cx: init::Context) -> (Shared, Local, init::Monotonics) { fn init(cx: init::Context) -> (Shared, Local) {
hprintln!("init").unwrap(); hprintln!("init").unwrap();
normal_task::spawn().ok(); async_task::spawn().unwrap();
async_task::spawn().ok();
( (Shared {}, Local {})
Shared {},
Local {},
init::Monotonics(Systick::new(cx.core.SYST, 12_000_000)),
)
} }
#[idle] #[idle]
@ -47,11 +38,6 @@ mod app {
} }
} }
#[task]
fn normal_task(_cx: normal_task::Context) {
hprintln!("hello from normal").ok();
}
#[task] #[task]
async fn async_task(_cx: async_task::Context) { async fn async_task(_cx: async_task::Context) {
hprintln!("hello from async").ok(); hprintln!("hello from async").ok();

View file

@ -45,23 +45,20 @@ pub fn codegen(app: &App, analysis: &Analysis) -> Vec<TokenStream2> {
let executor_run_ident = util::executor_run_ident(name); let executor_run_ident = util::executor_run_ident(name);
let rq = util::rq_async_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!( items.push(quote!(
#[doc(hidden)] #[doc(hidden)]
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
#[allow(non_upper_case_globals)] #[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!( stmts.push(quote!(
if !(&*#exec_name.get()).is_running() { 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 // The async executor needs a static priority
#prio_name.get_mut().write(rtic::export::Priority::new(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(|| { if (&mut *#exec_name.get_mut()).poll(|| {
#executor_run_ident.store(true, core::sync::atomic::Ordering::Release); #executor_run_ident.store(true, core::sync::atomic::Ordering::Release);
rtic::pend(#device::#enum_::#interrupt); 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 // If the ready queue is not empty and the executor finished, restart this
// dispatch to check if the executor should be restarted. // dispatch to check if the executor should be restarted.
rtic::pend(#device::#enum_::#interrupt); rtic::pend(#device::#enum_::#interrupt);

View file

@ -183,13 +183,14 @@ pub fn codegen(
#[doc(hidden)] #[doc(hidden)]
pub fn #internal_spawn_ident() -> Result<(), ()> { pub fn #internal_spawn_ident() -> Result<(), ()> {
unsafe { unsafe {
let r = rtic::export::interrupt::free(|_| (&mut *#rq.get_mut()).enqueue(())); // TODO: Fix this to be compare and swap
if #rq.load(core::sync::atomic::Ordering::Acquire) {
if r.is_ok() { Err(())
} else {
#rq.store(true, core::sync::atomic::Ordering::Release);
rtic::pend(#device::#enum_::#interrupt); rtic::pend(#device::#enum_::#interrupt);
Ok(())
} }
r
} }
})); }));

View file

@ -154,7 +154,7 @@ pub fn local_resources_ident(ctxt: Context, app: &App) -> Ident {
/// Generates an identifier for a ready queue, async task version /// Generates an identifier for a ready queue, async task version
pub fn rq_async_ident(async_task_name: &Ident) -> Ident { 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 /// Suffixed identifier

4
rust-toolchain.toml Normal file
View file

@ -0,0 +1,4 @@
[toolchain]
channel = "nightly"
components = [ "rust-src", "rustfmt", "llvm-tools-preview" ]
targets = [ "thumbv7em-none-eabihf" ]