aboutsummaryrefslogtreecommitdiff
path: root/macros/src
diff options
context:
space:
mode:
authorGravatar Emil Fresk <emil.fresk@gmail.com> 2023-01-09 21:02:53 +0100
committerGravatar Henrik Tjäder <henrik@tjaders.com> 2023-03-01 00:33:29 +0100
commitcd790a94286cdc307d399b7f7a43e305e90de5bf (patch)
tree5a83dd0739c90fb848744c22bcbe689eed1f1fcf /macros/src
parent1eabb94f0424d7ff85786ad05615da69a379f01d (diff)
downloadrtic-cd790a94286cdc307d399b7f7a43e305e90de5bf.tar.gz
rtic-cd790a94286cdc307d399b7f7a43e305e90de5bf.tar.zst
rtic-cd790a94286cdc307d399b7f7a43e305e90de5bf.zip
More work on new spawn/executor
Diffstat (limited to 'macros/src')
-rw-r--r--macros/src/codegen/async_dispatchers.rs50
-rw-r--r--macros/src/codegen/module.rs29
-rw-r--r--macros/src/codegen/software_tasks.rs14
-rw-r--r--macros/src/codegen/util.rs10
4 files changed, 23 insertions, 80 deletions
diff --git a/macros/src/codegen/async_dispatchers.rs b/macros/src/codegen/async_dispatchers.rs
index 341f76ff..012bd61a 100644
--- a/macros/src/codegen/async_dispatchers.rs
+++ b/macros/src/codegen/async_dispatchers.rs
@@ -16,11 +16,10 @@ pub fn codegen(app: &App, analysis: &Analysis) -> TokenStream2 {
items.push(quote!(
#[allow(non_camel_case_types)]
- type #type_name = impl core::future::Future + 'static;
+ type #type_name = impl core::future::Future;
#[allow(non_upper_case_globals)]
- static #exec_name:
- rtic::RacyCell<rtic::export::executor::AsyncTaskExecutor<#type_name>> =
- rtic::RacyCell::new(rtic::export::executor::AsyncTaskExecutor::new());
+ static #exec_name: rtic::export::executor::AsyncTaskExecutor<#type_name> =
+ rtic::export::executor::AsyncTaskExecutor::new();
));
}
@@ -47,38 +46,13 @@ pub fn codegen(app: &App, analysis: &Analysis) -> TokenStream2 {
let exec_name = util::internal_task_ident(name, "EXEC");
// let task = &app.software_tasks[name];
// let cfgs = &task.cfgs;
- let executor_run_ident = util::executor_run_ident(name);
-
- let rq = util::rq_async_ident(name);
-
- items.push(quote!(
- #[doc(hidden)]
- #[allow(non_camel_case_types)]
- #[allow(non_upper_case_globals)]
- static #rq: core::sync::atomic::AtomicBool = core::sync::atomic::AtomicBool::new(false);
- ));
stmts.push(quote!(
- if !(&*#exec_name.get()).is_running() {
- // TODO Fix this to be compare and swap
- if #rq.load(core::sync::atomic::Ordering::Relaxed) {
- #rq.store(false, core::sync::atomic::Ordering::Relaxed);
-
- (&mut *#exec_name.get_mut()).spawn(#name(#name::Context::new()));
- #executor_run_ident.store(true, core::sync::atomic::Ordering::Relaxed);
- }
- }
-
- if #executor_run_ident.load(core::sync::atomic::Ordering::Relaxed) {
- #executor_run_ident.store(false, core::sync::atomic::Ordering::Relaxed);
- if (&mut *#exec_name.get_mut()).poll(|| {
- #executor_run_ident.store(true, core::sync::atomic::Ordering::Release);
+ if #exec_name.check_and_clear_pending() {
+ #exec_name.poll(|| {
+ #exec_name.set_pending();
#pend_interrupt
- }) && #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.
- #pend_interrupt
- }
+ });
}
));
}
@@ -96,12 +70,7 @@ pub fn codegen(app: &App, analysis: &Analysis) -> TokenStream2 {
const PRIORITY: u8 = #level;
rtic::export::run(PRIORITY, || {
- // Have the acquire/release semantics outside the checks to no overdo it
- core::sync::atomic::fence(core::sync::atomic::Ordering::Acquire);
-
#(#stmts)*
-
- core::sync::atomic::fence(core::sync::atomic::Ordering::Release);
});
}
));
@@ -110,12 +79,7 @@ pub fn codegen(app: &App, analysis: &Analysis) -> TokenStream2 {
#[allow(non_snake_case)]
unsafe fn #dispatcher_name() -> ! {
loop {
- // Have the acquire/release semantics outside the checks to no overdo it
- core::sync::atomic::fence(core::sync::atomic::Ordering::Acquire);
-
#(#stmts)*
-
- core::sync::atomic::fence(core::sync::atomic::Ordering::Release);
}
}
));
diff --git a/macros/src/codegen/module.rs b/macros/src/codegen/module.rs
index 70fbb5e6..19cf2417 100644
--- a/macros/src/codegen/module.rs
+++ b/macros/src/codegen/module.rs
@@ -98,6 +98,7 @@ pub fn codegen(ctxt: Context, app: &App, analysis: &Analysis) -> TokenStream2 {
};
let internal_context_name = util::internal_task_ident(name, "Context");
+ let exec_name = util::internal_task_ident(name, "EXEC");
items.push(quote!(
#(#cfgs)*
@@ -147,25 +148,25 @@ pub fn codegen(ctxt: Context, app: &App, analysis: &Analysis) -> TokenStream2 {
let internal_spawn_ident = util::internal_task_ident(name, "spawn");
// Spawn caller
- let rq = util::rq_async_ident(name);
items.push(quote!(
-
- #(#cfgs)*
- /// Spawns the task directly
- #[allow(non_snake_case)]
- #[doc(hidden)]
- pub fn #internal_spawn_ident() -> Result<(), ()> {
- unsafe {
- // 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);
+ #(#cfgs)*
+ /// Spawns the task directly
+ #[allow(non_snake_case)]
+ #[doc(hidden)]
+ pub fn #internal_spawn_ident() -> Result<(), ()> {
+ if #exec_name.try_reserve() {
+ unsafe {
+ // TODO: Add args here
+ #exec_name.spawn_unchecked(#name(#name::Context::new()));
+ }
#pend_interrupt
+
Ok(())
+ } else {
+ Err(())
}
}
- }));
+ ));
module_items.push(quote!(
#(#cfgs)*
diff --git a/macros/src/codegen/software_tasks.rs b/macros/src/codegen/software_tasks.rs
index 4cb1fa95..b9232832 100644
--- a/macros/src/codegen/software_tasks.rs
+++ b/macros/src/codegen/software_tasks.rs
@@ -1,7 +1,7 @@
use crate::syntax::{ast::App, Context};
use crate::{
analyze::Analysis,
- codegen::{local_resources_struct, module, shared_resources_struct, util},
+ codegen::{local_resources_struct, module, shared_resources_struct},
};
use proc_macro2::TokenStream as TokenStream2;
use quote::quote;
@@ -13,18 +13,6 @@ pub fn codegen(app: &App, analysis: &Analysis) -> TokenStream2 {
// Any task
for (name, task) in app.software_tasks.iter() {
- let executor_ident = util::executor_run_ident(name);
- mod_app.push(quote!(
- #[allow(non_camel_case_types)]
- #[allow(non_upper_case_globals)]
- #[doc(hidden)]
- static #executor_ident: core::sync::atomic::AtomicBool =
- core::sync::atomic::AtomicBool::new(false);
- ));
-
- // `${task}Resources`
-
- // `${task}Locals`
if !task.args.local_resources.is_empty() {
let (item, constructor) =
local_resources_struct::codegen(Context::SoftwareTask(name), app);
diff --git a/macros/src/codegen/util.rs b/macros/src/codegen/util.rs
index a0caf0ae..0558d9d1 100644
--- a/macros/src/codegen/util.rs
+++ b/macros/src/codegen/util.rs
@@ -49,11 +49,6 @@ pub fn impl_mutex(
)
}
-/// Generates an identifier for the `EXECUTOR_RUN` atomics (`async` API)
-pub fn executor_run_ident(task: &Ident) -> Ident {
- mark_internal_name(&format!("{task}_EXECUTOR_RUN"))
-}
-
pub fn interrupt_ident() -> Ident {
let span = Span::call_site();
Ident::new("interrupt", span)
@@ -151,11 +146,6 @@ pub fn local_resources_ident(ctxt: Context, app: &App) -> Ident {
mark_internal_name(&s)
}
-/// 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_TASK_{async_task_name}_RQ"))
-}
-
/// Suffixed identifier
pub fn suffixed(name: &str) -> Ident {
let span = Span::call_site();