aboutsummaryrefslogtreecommitdiff
path: root/macros/src/codegen
diff options
context:
space:
mode:
authorGravatar Per Lindgren <per.lindgren@ltu.se> 2020-10-23 10:35:56 +0200
committerGravatar Per Lindgren <per.lindgren@ltu.se> 2020-10-23 23:58:09 +0200
commit1c244a995d54332649c1643aa0a3178f169406e4 (patch)
treeef7676e7439ccf9407fcde998a654d9700f20524 /macros/src/codegen
parent86699039e99229049ee3c739eaf860acc70a1bf7 (diff)
downloadrtic-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.rs4
-rw-r--r--macros/src/codegen/hardware_tasks.rs2
-rw-r--r--macros/src/codegen/module.rs20
-rw-r--r--macros/src/codegen/pre_init.rs24
-rw-r--r--macros/src/codegen/software_tasks.rs2
-rw-r--r--macros/src/codegen/timer_queue.rs4
-rw-r--r--macros/src/codegen/util.rs2
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> {