diff options
| author | Jorge Aparicio <jorge@japaric.io> | 2019-04-16 23:04:24 +0200 |
|---|---|---|
| committer | Jorge Aparicio <jorge@japaric.io> | 2019-04-16 23:04:24 +0200 |
| commit | aa7eec02996aca9304187f36d674d5fe898aece6 (patch) | |
| tree | a6b0769f5b7b92c3d79f1b8b5b788bba0fe46fc3 /macros | |
| parent | 8da925647ea1ce47e876526d0bd3d918e782d578 (diff) | |
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')
| -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 1d201c0..8b054ab 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 7f87f63..228d958 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", )); } |
