From e8b4fa7b32cf044428971f22e01428ff9cccff3c Mon Sep 17 00:00:00 2001 From: Emil Fresk Date: Thu, 8 Oct 2020 17:33:16 +0200 Subject: [PATCH] Added critical sections --- macros/src/codegen/module.rs | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/macros/src/codegen/module.rs b/macros/src/codegen/module.rs index bba64bb9ac..1fd3cd4273 100644 --- a/macros/src/codegen/module.rs +++ b/macros/src/codegen/module.rs @@ -350,13 +350,6 @@ pub fn codegen( let device = extra.device; let enum_ = util::interrupt_ident(); let interrupt = &analysis.interrupts.get(&priority); - let pend = { - quote!( - rtic::pend(#device::#enum_::#interrupt); - ) - }; - - eprintln!("pend {}", &pend); items.push(quote!( #(#cfgs)* @@ -365,25 +358,26 @@ pub fn codegen( use rtic::Mutex as _; let input = #tupled; - // TODO: use critical section, now we are unsafe - unsafe { - if let Some(index) = #app_path::#fq.dequeue() { + + if let Some(index) = rtic::export::interrupt::free(|_| #app_path::#fq.dequeue()) { + unsafe { #app_path::#inputs .get_unchecked_mut(usize::from(index)) .as_mut_ptr() .write(input); - - // #write_instant, do we need? - - #app_path::#rq.enqueue_unchecked((#app_path::#t::#name, index)); - - #pend - - Ok(()) - } else { - Err(input) } + + rtic::export::interrupt::free(|_| { + #app_path::#rq.enqueue_unchecked((#app_path::#t::#name, index)); + }); + + rtic::pend(#device::#enum_::#interrupt); + + Ok(()) + } else { + Err(input) } + })); }