aboutsummaryrefslogtreecommitdiff
path: root/rtic-macros/src
diff options
context:
space:
mode:
authorGravatar Román Cárdenas <rcardenas.rod@gmail.com> 2023-03-29 21:07:36 +0200
committerGravatar GitHub <noreply@github.com> 2023-03-29 21:07:36 +0200
commitce508a1882b1cc8735c4fd901a0ad868da5fe77b (patch)
treee17930b11f05f3bfaba59f3e579dd4f49aae4b91 /rtic-macros/src
parent06ddfb7ab8d04fa519bf66a40ec7a98a5e04aa07 (diff)
parent31055fa64a6e178caa45f8a8e862ded6a68d3e55 (diff)
downloadrtic-ce508a1882b1cc8735c4fd901a0ad868da5fe77b.tar.gz
rtic-ce508a1882b1cc8735c4fd901a0ad868da5fe77b.tar.zst
rtic-ce508a1882b1cc8735c4fd901a0ad868da5fe77b.zip
Merge branch 'master' into master
Diffstat (limited to 'rtic-macros/src')
-rw-r--r--rtic-macros/src/analyze.rs9
-rw-r--r--rtic-macros/src/codegen.rs3
-rw-r--r--rtic-macros/src/codegen/bindings/cortex.rs16
-rw-r--r--rtic-macros/src/codegen/bindings/template.rs4
-rw-r--r--rtic-macros/src/syntax/parse.rs7
5 files changed, 38 insertions, 1 deletions
diff --git a/rtic-macros/src/analyze.rs b/rtic-macros/src/analyze.rs
index 65774f6c..2227308d 100644
--- a/rtic-macros/src/analyze.rs
+++ b/rtic-macros/src/analyze.rs
@@ -11,6 +11,7 @@ use syn::Ident;
pub struct Analysis {
parent: analyze::Analysis,
pub interrupts: BTreeMap<Priority, (Ident, Dispatcher)>,
+ pub max_async_prio: Option<u8>,
}
impl ops::Deref for Analysis {
@@ -42,8 +43,16 @@ pub fn app(analysis: analyze::Analysis, app: &App) -> Analysis {
.map(|p| (p, available_interrupt.pop().expect("UNREACHABLE")))
.collect();
+ let max_async_prio = app
+ .hardware_tasks
+ .iter()
+ .map(|(_, task)| task.args.priority)
+ .min()
+ .map(|v| v - 1); // One less than the smallest HW task
+
Analysis {
parent: analysis,
interrupts,
+ max_async_prio,
}
}
diff --git a/rtic-macros/src/codegen.rs b/rtic-macros/src/codegen.rs
index 48ee5e33..c04f2131 100644
--- a/rtic-macros/src/codegen.rs
+++ b/rtic-macros/src/codegen.rs
@@ -45,6 +45,7 @@ pub fn app(app: &App, analysis: &Analysis) -> TokenStream2 {
let device = &app.args.device;
let rt_err = util::rt_err_ident();
+ let async_limit = bindings::async_prio_limit(app, analysis);
quote!(
/// The RTIC application module
@@ -52,6 +53,8 @@ pub fn app(app: &App, analysis: &Analysis) -> TokenStream2 {
/// Always include the device crate which contains the vector table
use #device as #rt_err;
+ #(#async_limit)*
+
#(#user_imports)*
#(#user_code)*
diff --git a/rtic-macros/src/codegen/bindings/cortex.rs b/rtic-macros/src/codegen/bindings/cortex.rs
index 767befa9..eba2afca 100644
--- a/rtic-macros/src/codegen/bindings/cortex.rs
+++ b/rtic-macros/src/codegen/bindings/cortex.rs
@@ -322,3 +322,19 @@ pub fn interrupt_entry(_app: &App, _analysis: &CodegenAnalysis) -> Vec<TokenStre
pub fn interrupt_exit(_app: &App, _analysis: &CodegenAnalysis) -> Vec<TokenStream2> {
vec![]
}
+
+pub fn async_prio_limit(app: &App, analysis: &CodegenAnalysis) -> Vec<TokenStream2> {
+ let max = if let Some(max) = analysis.max_async_prio {
+ quote!(#max)
+ } else {
+ // No limit
+ let device = &app.args.device;
+ quote!(1 << #device::NVIC_PRIO_BITS)
+ };
+
+ vec![quote!(
+ /// Holds the maximum priority level for use by async HAL drivers.
+ #[no_mangle]
+ static RTIC_ASYNC_MAX_LOGICAL_PRIO: u8 = #max;
+ )]
+}
diff --git a/rtic-macros/src/codegen/bindings/template.rs b/rtic-macros/src/codegen/bindings/template.rs
index 18f88fe0..a33bae8e 100644
--- a/rtic-macros/src/codegen/bindings/template.rs
+++ b/rtic-macros/src/codegen/bindings/template.rs
@@ -42,3 +42,7 @@ pub fn interrupt_entry(_app: &App, _analysis: &CodegenAnalysis) -> Vec<TokenStre
pub fn interrupt_exit(_app: &App, _analysis: &CodegenAnalysis) -> Vec<TokenStream2> {
vec![]
}
+
+pub fn async_prio_limit(app: &App, _analysis: &CodegenAnalysis) -> Vec<TokenStream2> {
+ vec![]
+}
diff --git a/rtic-macros/src/syntax/parse.rs b/rtic-macros/src/syntax/parse.rs
index 72eeeaf6..823bd82e 100644
--- a/rtic-macros/src/syntax/parse.rs
+++ b/rtic-macros/src/syntax/parse.rs
@@ -289,11 +289,13 @@ fn task_args(tokens: TokenStream2) -> parse::Result<Either<HardwareTaskArgs, Sof
// Handle comma: ,
let _: Token![,] = content.parse()?;
}
- let priority = priority.unwrap_or(1);
let shared_resources = shared_resources.unwrap_or_default();
let local_resources = local_resources.unwrap_or_default();
Ok(if let Some(binds) = binds {
+ // Hardware tasks can't run at anything lower than 1
+ let priority = priority.unwrap_or(1);
+
if priority == 0 {
return Err(parse::Error::new(
prio_span.unwrap(),
@@ -308,6 +310,9 @@ fn task_args(tokens: TokenStream2) -> parse::Result<Either<HardwareTaskArgs, Sof
local_resources,
})
} else {
+ // Software tasks start at idle priority
+ let priority = priority.unwrap_or(0);
+
Either::Right(SoftwareTaskArgs {
priority,
shared_resources,