mirror of
https://github.com/rtic-rs/rtic.git
synced 2025-12-16 21:05:35 +01:00
check task priority at compile time
before we were checking the priority at runtime. The compile time error message when the priority is too high is kind of awful though.
This commit is contained in:
parent
8da925647e
commit
aa7eec0299
5 changed files with 55 additions and 6 deletions
|
|
@ -1989,15 +1989,13 @@ fn pre_init(ctxt: &Context, app: &App, analysis: &Analysis) -> proc_macro2::Toke
|
|||
))
|
||||
}
|
||||
|
||||
// TODO turn the assertions that check that the priority is not larger than what's supported by
|
||||
// the device into compile errors
|
||||
let device = &app.args.device;
|
||||
let nvic_prio_bits = quote!(#device::NVIC_PRIO_BITS);
|
||||
for (handler, interrupt) in &app.interrupts {
|
||||
let name = interrupt.args.binds(handler);
|
||||
let priority = interrupt.args.priority;
|
||||
exprs.push(quote!(p.NVIC.enable(#device::Interrupt::#name);));
|
||||
exprs.push(quote!(assert!(#priority <= (1 << #nvic_prio_bits));));
|
||||
exprs.push(quote!(let _ = [(); ((1 << #nvic_prio_bits) - #priority as usize)];));
|
||||
exprs.push(quote!(p.NVIC.set_priority(
|
||||
#device::Interrupt::#name,
|
||||
((1 << #nvic_prio_bits) - #priority) << (8 - #nvic_prio_bits),
|
||||
|
|
@ -2007,7 +2005,7 @@ fn pre_init(ctxt: &Context, app: &App, analysis: &Analysis) -> proc_macro2::Toke
|
|||
for (priority, dispatcher) in &analysis.dispatchers {
|
||||
let name = &dispatcher.interrupt;
|
||||
exprs.push(quote!(p.NVIC.enable(#device::Interrupt::#name);));
|
||||
exprs.push(quote!(assert!(#priority <= (1 << #nvic_prio_bits));));
|
||||
exprs.push(quote!(let _ = [(); ((1 << #nvic_prio_bits) - #priority as usize)];));
|
||||
exprs.push(quote!(p.NVIC.set_priority(
|
||||
#device::Interrupt::#name,
|
||||
((1 << #nvic_prio_bits) - #priority) << (8 - #nvic_prio_bits),
|
||||
|
|
|
|||
|
|
@ -1039,10 +1039,10 @@ fn parse_args(
|
|||
}
|
||||
|
||||
let value = lit.value();
|
||||
if value > u64::from(u8::MAX) {
|
||||
if value > u64::from(u8::MAX) || value == 0 {
|
||||
return Err(parse::Error::new(
|
||||
lit.span(),
|
||||
"this literal must be in the range 0...255",
|
||||
"this literal must be in the range 1...255",
|
||||
));
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue