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>
This commit is contained in:
bors[bot] 2023-03-29 18:56:07 +00:00 committed by GitHub
commit 31055fa64a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 32 additions and 0 deletions

View file

@ -11,6 +11,7 @@ use syn::Ident;
pub struct Analysis { pub struct Analysis {
parent: analyze::Analysis, parent: analyze::Analysis,
pub interrupts: BTreeMap<Priority, (Ident, Dispatcher)>, pub interrupts: BTreeMap<Priority, (Ident, Dispatcher)>,
pub max_async_prio: Option<u8>,
} }
impl ops::Deref for Analysis { 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"))) .map(|p| (p, available_interrupt.pop().expect("UNREACHABLE")))
.collect(); .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 { Analysis {
parent: analysis, parent: analysis,
interrupts, interrupts,
max_async_prio,
} }
} }

View file

@ -45,6 +45,7 @@ pub fn app(app: &App, analysis: &Analysis) -> TokenStream2 {
let device = &app.args.device; let device = &app.args.device;
let rt_err = util::rt_err_ident(); let rt_err = util::rt_err_ident();
let async_limit = bindings::async_prio_limit(app, analysis);
quote!( quote!(
/// The RTIC application module /// 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 /// Always include the device crate which contains the vector table
use #device as #rt_err; use #device as #rt_err;
#(#async_limit)*
#(#user_imports)* #(#user_imports)*
#(#user_code)* #(#user_code)*

View file

@ -322,3 +322,19 @@ pub fn interrupt_entry(_app: &App, _analysis: &CodegenAnalysis) -> Vec<TokenStre
pub fn interrupt_exit(_app: &App, _analysis: &CodegenAnalysis) -> Vec<TokenStream2> { pub fn interrupt_exit(_app: &App, _analysis: &CodegenAnalysis) -> Vec<TokenStream2> {
vec![] 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;
)]
}

View file

@ -42,3 +42,7 @@ pub fn interrupt_entry(_app: &App, _analysis: &CodegenAnalysis) -> Vec<TokenStre
pub fn interrupt_exit(_app: &App, _analysis: &CodegenAnalysis) -> Vec<TokenStream2> { pub fn interrupt_exit(_app: &App, _analysis: &CodegenAnalysis) -> Vec<TokenStream2> {
vec![] vec![]
} }
pub fn async_prio_limit(app: &App, _analysis: &CodegenAnalysis) -> Vec<TokenStream2> {
vec![]
}