From b2ec1fa65118813b400cf806e3ff492ea41f49ca Mon Sep 17 00:00:00 2001 From: Emil Fresk Date: Fri, 10 Jun 2022 20:08:46 +0200 Subject: Example running, timeout and delay futures available --- macros/src/codegen/timer_queue.rs | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) (limited to 'macros/src/codegen/timer_queue.rs') diff --git a/macros/src/codegen/timer_queue.rs b/macros/src/codegen/timer_queue.rs index 32e288c5..513f78af 100644 --- a/macros/src/codegen/timer_queue.rs +++ b/macros/src/codegen/timer_queue.rs @@ -1,9 +1,8 @@ +use crate::{analyze::Analysis, check::Extra, codegen::util}; use proc_macro2::TokenStream as TokenStream2; use quote::quote; use rtic_syntax::ast::App; -use crate::{analyze::Analysis, check::Extra, codegen::util}; - /// Generates timer queues and timer queue handlers #[allow(clippy::too_many_lines)] pub fn codegen(app: &App, analysis: &Analysis, _extra: &Extra) -> Vec { @@ -67,8 +66,14 @@ pub fn codegen(app: &App, analysis: &Analysis, _extra: &Extra) -> Vec); + let n_task = util::capacity_literal(cap); + let n_worker: usize = app + .software_tasks + .iter() + .map(|(_name, task)| task.is_async as usize) + .sum(); + let n_worker = util::capacity_literal(n_worker); + let tq_ty = quote!(rtic::export::TimerQueue<#mono_type, #t, #n_task, #n_worker>); // For future use // let doc = format!(" RTIC internal: {}:{}", file!(), line!()); @@ -76,8 +81,12 @@ pub fn codegen(app: &App, analysis: &Analysis, _extra: &Extra) -> Vec = - rtic::RacyCell::new(rtic::export::TimerQueue(rtic::export::SortedLinkedList::new_u16())); + static #tq: rtic::RacyCell<#tq_ty> = rtic::RacyCell::new( + rtic::export::TimerQueue { + task_queue: rtic::export::SortedLinkedList::new_u16(), + waker_queue: rtic::export::SortedLinkedList::new_u16(), + } + ); )); let mono = util::monotonic_ident(&monotonic_name); @@ -118,7 +127,9 @@ pub fn codegen(app: &App, analysis: &Analysis, _extra: &Extra) -> Vec { - rtic::export::interrupt::free(|_| (&mut *#rq.get_mut()).split().0.enqueue_unchecked((#rqt::#name, index))); + rtic::export::interrupt::free(|_| + (&mut *#rq.get_mut()).split().0.enqueue_unchecked((#rqt::#name, index)) + ); #pend } @@ -137,7 +148,7 @@ pub fn codegen(app: &App, analysis: &Analysis, _extra: &Extra) -> Vec Vec waker.wake(), + rtic::export::TaskOrWaker::Task((task, index)) => { + match task { + #(#arms)* + } + } } } -- cgit v1.2.3