diff options
author | 2023-03-29 18:56:07 +0000 | |
---|---|---|
committer | 2023-03-29 18:56:07 +0000 | |
commit | 31055fa64a6e178caa45f8a8e862ded6a68d3e55 (patch) | |
tree | 72c051f4d908ae6c4baf9b1a48678e64abfb39c2 | |
parent | 2a17a056d0a69f988393e12bf50a42658e291682 (diff) | |
parent | 323b847bf692a0054647536a6495f20373f6d9c7 (diff) | |
download | rtic-31055fa64a6e178caa45f8a8e862ded6a68d3e55.tar.gz rtic-31055fa64a6e178caa45f8a8e862ded6a68d3e55.tar.zst rtic-31055fa64a6e178caa45f8a8e862ded6a68d3e55.zip |
Merge #719
719: Adding a limit that async HALs can read and have as max prio r=AfoHT a=korken89
Co-authored-by: Emil Fresk <emil.fresk@gmail.com>
-rw-r--r-- | rtic-macros/src/analyze.rs | 9 | ||||
-rw-r--r-- | rtic-macros/src/codegen.rs | 3 | ||||
-rw-r--r-- | rtic-macros/src/codegen/bindings/cortex.rs | 16 | ||||
-rw-r--r-- | rtic-macros/src/codegen/bindings/template.rs | 4 |
4 files changed, 32 insertions, 0 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![] +} |