diff options
author | 2020-10-23 10:35:56 +0200 | |
---|---|---|
committer | 2020-10-23 23:58:09 +0200 | |
commit | 1c244a995d54332649c1643aa0a3178f169406e4 (patch) | |
tree | ef7676e7439ccf9407fcde998a654d9700f20524 /macros/src/codegen | |
parent | 86699039e99229049ee3c739eaf860acc70a1bf7 (diff) | |
download | rtic-1c244a995d54332649c1643aa0a3178f169406e4.tar.gz rtic-1c244a995d54332649c1643aa0a3178f169406e4.tar.zst rtic-1c244a995d54332649c1643aa0a3178f169406e4.zip |
move dispatchers to app argument
Diffstat (limited to 'macros/src/codegen')
-rw-r--r-- | macros/src/codegen/dispatchers.rs | 4 | ||||
-rw-r--r-- | macros/src/codegen/hardware_tasks.rs | 2 | ||||
-rw-r--r-- | macros/src/codegen/module.rs | 20 | ||||
-rw-r--r-- | macros/src/codegen/pre_init.rs | 24 | ||||
-rw-r--r-- | macros/src/codegen/software_tasks.rs | 2 | ||||
-rw-r--r-- | macros/src/codegen/timer_queue.rs | 4 | ||||
-rw-r--r-- | macros/src/codegen/util.rs | 2 |
7 files changed, 31 insertions, 27 deletions
diff --git a/macros/src/codegen/dispatchers.rs b/macros/src/codegen/dispatchers.rs index a76f622e..a6c695f1 100644 --- a/macros/src/codegen/dispatchers.rs +++ b/macros/src/codegen/dispatchers.rs @@ -119,11 +119,13 @@ pub fn codegen(app: &App, analysis: &Analysis, extra: &Extra) -> Vec<TokenStream )); let doc = format!("Interrupt handler to dispatch tasks at priority {}", level); - let interrupt = util::suffixed(&interrupts[&level].to_string()); + let interrupt = util::suffixed(&interrupts[&level].0.to_string()); + let attribute = &interrupts[&level].1.attrs; items.push(quote!( #[allow(non_snake_case)] #[doc = #doc] #[no_mangle] + #(#attribute)* unsafe fn #interrupt() { /// The priority of this interrupt handler const PRIORITY: u8 = #level; diff --git a/macros/src/codegen/hardware_tasks.rs b/macros/src/codegen/hardware_tasks.rs index e6fa5ed1..d29ff0ee 100644 --- a/macros/src/codegen/hardware_tasks.rs +++ b/macros/src/codegen/hardware_tasks.rs @@ -29,7 +29,7 @@ pub fn codegen( let mut user_tasks = vec![]; for (name, task) in &app.hardware_tasks { - let (let_instant, instant) = if let Some(m) = extra.monotonic { + let (let_instant, instant) = if let Some(ref m) = extra.monotonic { ( Some(quote!(let instant = <#m as rtic::Monotonic>::now();)), Some(quote!(, instant)), diff --git a/macros/src/codegen/module.rs b/macros/src/codegen/module.rs index a5b61394..838a989f 100644 --- a/macros/src/codegen/module.rs +++ b/macros/src/codegen/module.rs @@ -23,7 +23,7 @@ pub fn codegen( let mut lt = None; match ctxt { Context::Init => { - if let Some(m) = extra.monotonic { + if let Some(m) = &extra.monotonic { fields.push(quote!( /// System start time = `Instant(0 /* cycles */)` pub start: <#m as rtic::Monotonic>::Instant @@ -43,7 +43,7 @@ pub fn codegen( } if extra.peripherals { - let device = extra.device; + let device = &extra.device; fields.push(quote!( /// Device peripherals @@ -67,7 +67,7 @@ pub fn codegen( Context::Idle => {} Context::HardwareTask(..) => { - if let Some(m) = extra.monotonic { + if let Some(m) = &extra.monotonic { fields.push(quote!( /// Time at which this handler started executing pub start: <#m as rtic::Monotonic>::Instant @@ -80,7 +80,7 @@ pub fn codegen( } Context::SoftwareTask(..) => { - if let Some(m) = extra.monotonic { + if let Some(m) = &extra.monotonic { fields.push(quote!( /// The time at which this task was scheduled to run pub scheduled: <#m as rtic::Monotonic>::Instant @@ -162,7 +162,7 @@ pub fn codegen( }; let instant = if needs_instant { - let m = extra.monotonic(); + let m = extra.monotonic.clone().expect("RTIC-ICE: UNREACHABLE"); Some(quote!(, instant: <#m as rtic::Monotonic>::Instant)) } else { @@ -205,9 +205,13 @@ pub fn codegen( let app_name = &app.name; let app_path = quote! {crate::#app_name}; - let device = extra.device; + let device = &extra.device; let enum_ = util::interrupt_ident(); - let interrupt = &analysis.interrupts.get(&priority); + let interrupt = &analysis + .interrupts + .get(&priority) + .expect("RTIC-ICE: interrupt identifer not found") + .0; // Spawn caller items.push(quote!( @@ -240,7 +244,7 @@ pub fn codegen( })); // Schedule caller - if let Some(m) = extra.monotonic { + if let Some(m) = &extra.monotonic { let instants = util::instants_ident(name); let tq = util::tq_ident(); diff --git a/macros/src/codegen/pre_init.rs b/macros/src/codegen/pre_init.rs index 17c9c2f4..969de84a 100644 --- a/macros/src/codegen/pre_init.rs +++ b/macros/src/codegen/pre_init.rs @@ -26,22 +26,20 @@ pub fn codegen(app: &App, analysis: &Analysis, extra: &Extra) -> Vec<TokenStream let mut core: rtic::export::Peripherals = rtic::export::Peripherals::steal().into(); )); - let device = extra.device; + let device = &extra.device; let nvic_prio_bits = quote!(#device::NVIC_PRIO_BITS); + let interrupt_ids = analysis.interrupts.iter().map(|(p, (id, _))| (p, id)); + // Unmask interrupts and set their priorities - for (&priority, name) in analysis - .interrupts - .iter() - .chain(app.hardware_tasks.values().flat_map(|task| { - if !util::is_exception(&task.args.binds) { - Some((&task.args.priority, &task.args.binds)) - } else { - // We do exceptions in another pass - None - } - })) - { + for (&priority, name) in interrupt_ids.chain(app.hardware_tasks.values().flat_map(|task| { + if !util::is_exception(&task.args.binds) { + Some((&task.args.priority, &task.args.binds)) + } else { + // We do exceptions in another pass + None + } + })) { // Compile time assert that this priority is supported by the device stmts.push(quote!(let _ = [(); ((1 << #nvic_prio_bits) - #priority as usize)];)); diff --git a/macros/src/codegen/software_tasks.rs b/macros/src/codegen/software_tasks.rs index 18cecdf2..dae6b858 100644 --- a/macros/src/codegen/software_tasks.rs +++ b/macros/src/codegen/software_tasks.rs @@ -57,7 +57,7 @@ pub fn codegen( .map(|_| quote!(core::mem::MaybeUninit::uninit())) .collect::<Vec<_>>(); - if let Some(m) = extra.monotonic { + if let Some(m) = &extra.monotonic { let instants = util::instants_ident(name); let uninit = mk_uninit(); diff --git a/macros/src/codegen/timer_queue.rs b/macros/src/codegen/timer_queue.rs index 0dd98f01..fa2c7b36 100644 --- a/macros/src/codegen/timer_queue.rs +++ b/macros/src/codegen/timer_queue.rs @@ -8,7 +8,7 @@ use crate::{analyze::Analysis, check::Extra, codegen::util}; pub fn codegen(app: &App, analysis: &Analysis, extra: &Extra) -> Vec<TokenStream2> { let mut items = vec![]; - if let Some(m) = extra.monotonic { + if let Some(m) = &extra.monotonic { let t = util::schedule_t_ident(); // Enumeration of `schedule`-able tasks @@ -71,7 +71,7 @@ pub fn codegen(app: &App, analysis: &Analysis, extra: &Extra) -> Vec<TokenStream let rq = util::rq_ident(priority); let rqt = util::spawn_t_ident(priority); let enum_ = util::interrupt_ident(); - let interrupt = &analysis.interrupts.get(&priority); + let interrupt = &analysis.interrupts.get(&priority).expect("RTIC-ICE: interrupt not found").0; let pend = { quote!( diff --git a/macros/src/codegen/util.rs b/macros/src/codegen/util.rs index 0625e49d..fb8f1a84 100644 --- a/macros/src/codegen/util.rs +++ b/macros/src/codegen/util.rs @@ -46,7 +46,7 @@ pub fn impl_mutex( (quote!(#name), quote!(self.priority)) }; - let device = extra.device; + let device = &extra.device; quote!( #(#cfgs)* impl<'a> rtic::Mutex for #path<'a> { |