Restart executor on finish if there are retries

This commit is contained in:
Emil Fresk 2022-06-12 21:24:26 +02:00
parent b2ec1fa651
commit 952bb5c431
2 changed files with 20 additions and 11 deletions

View file

@ -164,12 +164,6 @@ pub fn codegen(app: &App, analysis: &Analysis, extra: &Extra) -> Vec<TokenStream
#(#arms)*
}
}
while let Some((task, index)) = retry_queue.pop() {
rtic::export::interrupt::free(|_| {
(&mut *#rq.get_mut()).enqueue_unchecked((task, index));
});
}
));
for (name, _task) in app.software_tasks.iter().filter_map(|(name, task)| {
@ -185,14 +179,26 @@ pub fn codegen(app: &App, analysis: &Analysis, extra: &Extra) -> Vec<TokenStream
stmts.push(quote!(
if #executor_run_ident.load(core::sync::atomic::Ordering::Relaxed) {
#executor_run_ident.store(false, core::sync::atomic::Ordering::Relaxed);
(&mut *#exec_name.get_mut()).poll(|| {
if (&mut *#exec_name.get_mut()).poll(|| {
#executor_run_ident.store(true, core::sync::atomic::Ordering::Release);
rtic::pend(#device::#enum_::#interrupt);
});
}) && !retry_queue.is_empty() {
// If the retry queue is not empty and the executor finished, restart this
// dispatch to check if the executor should be restarted.
rtic::pend(#device::#enum_::#interrupt);
}
}
));
}
stmts.push(quote!(
while let Some((task, index)) = retry_queue.pop() {
rtic::export::interrupt::free(|_| {
(&mut *#rq.get_mut()).enqueue_unchecked((task, index));
});
}
));
let doc = format!("Interrupt handler to dispatch tasks at priority {}", level);
let attribute = &interrupts[&level].1.attrs;
items.push(quote!(

View file

@ -65,7 +65,7 @@ pub mod executor {
self.task = Some(future);
}
pub fn poll(&mut self, wake: fn()) {
pub fn poll(&mut self, wake: fn()) -> bool {
if let Some(future) = &mut self.task {
unsafe {
let waker = Waker::from_raw(RawWaker::new(wake as *const (), &WAKER_VTABLE));
@ -75,11 +75,14 @@ pub mod executor {
match future.poll(&mut cx) {
Poll::Ready(_) => {
self.task = None;
true // Only true if we finished now
}
Poll::Pending => {}
};
Poll::Pending => false,
}
}
} else {
false
}
}
}
}