aboutsummaryrefslogtreecommitdiff
path: root/macros/src
diff options
context:
space:
mode:
authorGravatar Jorge Aparicio <jorge@japaric.io> 2018-12-15 20:34:33 +0100
committerGravatar Jorge Aparicio <jorge@japaric.io> 2018-12-15 20:35:00 +0100
commitd14e25d72d7b182d305c0f9ee80294c697c42dee (patch)
tree8a7e08f8cd479fb9f93c7f1386b799d51385a5c3 /macros/src
parentf7ac71ab22a4ac97beb2cba8a2f34e21ff66e4d9 (diff)
downloadrtic-d14e25d72d7b182d305c0f9ee80294c697c42dee.tar.gz
rtic-d14e25d72d7b182d305c0f9ee80294c697c42dee.tar.zst
rtic-d14e25d72d7b182d305c0f9ee80294c697c42dee.zip
move some interrupt configuration to pre_init
Diffstat (limited to 'macros/src')
-rw-r--r--macros/src/codegen.rs48
1 files changed, 26 insertions, 22 deletions
diff --git a/macros/src/codegen.rs b/macros/src/codegen.rs
index c2696693..8e1970f5 100644
--- a/macros/src/codegen.rs
+++ b/macros/src/codegen.rs
@@ -142,7 +142,7 @@ pub fn app(app: &App, analysis: &Analysis) -> TokenStream {
let timer_queue = timer_queue(&ctxt, app, analysis);
- let pre_init = pre_init(&ctxt, analysis);
+ let pre_init = pre_init(&ctxt, &app, analysis);
let assertions = assertions(app, analysis);
@@ -385,16 +385,6 @@ fn post_init(ctxt: &Context, app: &App, analysis: &Analysis) -> proc_macro2::Tok
// the device into compile errors
let device = &app.args.device;
let nvic_prio_bits = quote!(#device::NVIC_PRIO_BITS);
- for (name, interrupt) in &app.interrupts {
- 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!(p.NVIC.set_priority(
- #device::Interrupt::#name,
- ((1 << #nvic_prio_bits) - #priority) << (8 - #nvic_prio_bits),
- )));
- }
-
for (name, exception) in &app.exceptions {
let priority = exception.args.priority;
exprs.push(quote!(assert!(#priority <= (1 << #nvic_prio_bits))));
@@ -413,16 +403,6 @@ fn post_init(ctxt: &Context, app: &App, analysis: &Analysis) -> proc_macro2::Tok
)));
}
- 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!(p.NVIC.set_priority(
- #device::Interrupt::#name,
- ((1 << #nvic_prio_bits) - #priority) << (8 - #nvic_prio_bits),
- )));
- }
-
if app.idle.is_none() {
// Set SLEEPONEXIT bit to enter sleep mode when returning from ISR
exprs.push(quote!(p.SCB.scr.modify(|r| r | 1 << 1)));
@@ -1592,7 +1572,7 @@ fn timer_queue(ctxt: &Context, app: &App, analysis: &Analysis) -> proc_macro2::T
quote!(#(#items)*)
}
-fn pre_init(ctxt: &Context, analysis: &Analysis) -> proc_macro2::TokenStream {
+fn pre_init(ctxt: &Context, app: &App, analysis: &Analysis) -> proc_macro2::TokenStream {
let mut exprs = vec![];
// FIXME(MaybeUninit) Because we are using a fake MaybeUninit we need to set the Option tag to
@@ -1642,6 +1622,30 @@ fn pre_init(ctxt: &Context, analysis: &Analysis) -> proc_macro2::TokenStream {
))
}
+ // 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 (name, interrupt) in &app.interrupts {
+ 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!(p.NVIC.set_priority(
+ #device::Interrupt::#name,
+ ((1 << #nvic_prio_bits) - #priority) << (8 - #nvic_prio_bits),
+ );));
+ }
+
+ 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!(p.NVIC.set_priority(
+ #device::Interrupt::#name,
+ ((1 << #nvic_prio_bits) - #priority) << (8 - #nvic_prio_bits),
+ );));
+ }
+
// Set the cycle count to 0 and disable it while `init` executes
if cfg!(feature = "timer-queue") {
exprs.push(quote!(p.DWT.ctrl.modify(|r| r & !1);));