mirror of
https://github.com/rtic-rs/rtic.git
synced 2024-11-25 21:19:35 +01:00
Adding a limit that async HALs can read and have as max prio
This commit is contained in:
parent
3a0e2ac924
commit
323b847bf6
4 changed files with 32 additions and 0 deletions
|
@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)*
|
||||||
|
|
|
@ -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;
|
||||||
|
)]
|
||||||
|
}
|
||||||
|
|
|
@ -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![]
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue