diff options
author | 2019-04-16 23:04:24 +0200 | |
---|---|---|
committer | 2019-04-16 23:04:24 +0200 | |
commit | aa7eec02996aca9304187f36d674d5fe898aece6 (patch) | |
tree | a6b0769f5b7b92c3d79f1b8b5b788bba0fe46fc3 /macros/src | |
parent | 8da925647ea1ce47e876526d0bd3d918e782d578 (diff) | |
download | rtic-aa7eec02996aca9304187f36d674d5fe898aece6.tar.gz rtic-aa7eec02996aca9304187f36d674d5fe898aece6.tar.zst rtic-aa7eec02996aca9304187f36d674d5fe898aece6.zip |
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.
Diffstat (limited to 'macros/src')
-rw-r--r-- | macros/src/codegen.rs | 6 | ||||
-rw-r--r-- | macros/src/syntax.rs | 4 |
2 files changed, 4 insertions, 6 deletions
diff --git a/macros/src/codegen.rs b/macros/src/codegen.rs index 1d201c08..8b054ab5 100644 --- a/macros/src/codegen.rs +++ b/macros/src/codegen.rs @@ -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), diff --git a/macros/src/syntax.rs b/macros/src/syntax.rs index 7f87f633..228d9588 100644 --- a/macros/src/syntax.rs +++ b/macros/src/syntax.rs @@ -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", )); } |