diff options
author | 2018-12-15 19:17:08 +0100 | |
---|---|---|
committer | 2018-12-15 19:17:08 +0100 | |
commit | f7ac71ab22a4ac97beb2cba8a2f34e21ff66e4d9 (patch) | |
tree | 824dc4c5a2b4ef0ad15a72e8f8ffd898ebf9bf83 /macros/src | |
parent | 77de15f4688ba30175a9d32470ba123e0d31689e (diff) | |
download | rtic-f7ac71ab22a4ac97beb2cba8a2f34e21ff66e4d9.tar.gz rtic-f7ac71ab22a4ac97beb2cba8a2f34e21ff66e4d9.tar.zst rtic-f7ac71ab22a4ac97beb2cba8a2f34e21ff66e4d9.zip |
codegen: merge dictionaries related to task dispatchers
Diffstat (limited to 'macros/src')
-rw-r--r-- | macros/src/codegen.rs | 37 |
1 files changed, 23 insertions, 14 deletions
diff --git a/macros/src/codegen.rs b/macros/src/codegen.rs index eadd1888..c2696693 100644 --- a/macros/src/codegen.rs +++ b/macros/src/codegen.rs @@ -24,16 +24,13 @@ struct Context { // Alias #[cfg(feature = "timer-queue")] baseline: Ident, - // Dispatcher -> Alias (`enum`) - enums: HashMap<u8, Ident>, + dispatchers: HashMap<u8, Dispatcher>, // Alias (`fn`) idle: Ident, // Alias (`fn`) init: Ident, // Alias priority: Ident, - // Dispatcher -> Alias (`static` / resource) - ready_queues: HashMap<u8, Ident>, // For non-singletons this maps the resource name to its `static mut` variable name statics: Aliases, /// Task -> Alias (`struct`) @@ -47,6 +44,11 @@ struct Context { timer_queue: Ident, } +struct Dispatcher { + enum_: Ident, + ready_queue: Ident, +} + struct Task { alias: Ident, free_queue: Ident, @@ -62,11 +64,10 @@ impl Default for Context { Context { #[cfg(feature = "timer-queue")] baseline: mk_ident(None), - enums: HashMap::new(), + dispatchers: HashMap::new(), idle: mk_ident(Some("idle")), init: mk_ident(Some("init")), priority: mk_ident(None), - ready_queues: HashMap::new(), statics: Aliases::new(), resources: HashMap::new(), schedule_enum: mk_ident(None), @@ -1289,8 +1290,13 @@ fn dispatchers( } )); - ctxt.ready_queues.insert(*level, ready_alias); - ctxt.enums.insert(*level, enum_alias); + ctxt.dispatchers.insert( + *level, + Dispatcher { + ready_queue: ready_alias, + enum_: enum_alias, + }, + ); } (quote!(#(#data)*), quote!(#(#dispatchers)*)) @@ -1309,8 +1315,9 @@ fn spawn(ctxt: &Context, app: &App, analysis: &Analysis) -> proc_macro2::TokenSt let task_ = &app.tasks[name]; let free = &task.free_queue; let level = task_.args.priority; - let ready = &ctxt.ready_queues[&level]; - let enum_ = &ctxt.enums[&level]; + let dispatcher = &ctxt.dispatchers[&level]; + let ready = &dispatcher.ready_queue; + let enum_ = &dispatcher.enum_; let dispatcher = &analysis.dispatchers[&level].interrupt; let inputs = &task.inputs; let args = &task_.inputs; @@ -1546,8 +1553,9 @@ fn timer_queue(ctxt: &Context, app: &App, analysis: &Analysis) -> proc_macro2::T .iter() .map(|task| { let level = app.tasks[task].args.priority; - let tenum = &ctxt.enums[&level]; - let ready = &ctxt.ready_queues[&level]; + let dispatcher_ = &ctxt.dispatchers[&level]; + let tenum = &dispatcher_.enum_; + let ready = &dispatcher_.ready_queue; let dispatcher = &analysis.dispatchers[&level].interrupt; quote!( @@ -1604,8 +1612,9 @@ fn pre_init(ctxt: &Context, analysis: &Analysis) -> proc_macro2::TokenStream { } // these are `MaybeUninit` `ReadyQueue`s - for queue in ctxt.ready_queues.values() { - exprs.push(quote!(#queue.set(rtfm::export::ReadyQueue::new());)) + for dispatcher in ctxt.dispatchers.values() { + let rq = &dispatcher.ready_queue; + exprs.push(quote!(#rq.set(rtfm::export::ReadyQueue::new());)) } // these are `MaybeUninit` `FreeQueue`s |