aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlf Lilleengen <[email protected]>2022-08-23 14:57:45 +0200
committerUlf Lilleengen <[email protected]>2022-08-25 12:46:24 +0200
commit045ae2c29f2ca358a501e664ed2a7863b9a6bd59 (patch)
treeaaf0b1ac5b83a9c23151964fd6c6b4aeb40360c0
parent529535194d4b5d58b31fd6a7541176105e3c63f7 (diff)
Ensure interrupt::take works without embassy-executor
Add "rtos-trace-interrupt" feature flag on embassy-macros and enable it for embassy-executor, to ensure that the interrupt::take! macro can be used without depending on embassy-executor.
-rw-r--r--embassy-executor/Cargo.toml4
-rw-r--r--embassy-macros/Cargo.toml3
-rw-r--r--embassy-macros/src/macros/cortex_m_interrupt_take.rs27
3 files changed, 26 insertions, 8 deletions
diff --git a/embassy-executor/Cargo.toml b/embassy-executor/Cargo.toml
index 1a611720c..409a341f0 100644
--- a/embassy-executor/Cargo.toml
+++ b/embassy-executor/Cargo.toml
@@ -31,7 +31,7 @@ nightly = []
31integrated-timers = ["dep:embassy-time"] 31integrated-timers = ["dep:embassy-time"]
32 32
33# Trace interrupt invocations with rtos-trace. 33# Trace interrupt invocations with rtos-trace.
34rtos-trace-interrupt = ["rtos-trace"] 34rtos-trace-interrupt = ["rtos-trace", "embassy-macros/rtos-trace-interrupt"]
35 35
36[dependencies] 36[dependencies]
37defmt = { version = "0.3", optional = true } 37defmt = { version = "0.3", optional = true }
@@ -39,7 +39,7 @@ log = { version = "0.4.14", optional = true }
39rtos-trace = { version = "0.1.2", optional = true } 39rtos-trace = { version = "0.1.2", optional = true }
40 40
41futures-util = { version = "0.3.17", default-features = false } 41futures-util = { version = "0.3.17", default-features = false }
42embassy-macros = { version = "0.1.0", path = "../embassy-macros"} 42embassy-macros = { version = "0.1.0", path = "../embassy-macros" }
43embassy-time = { version = "0.1.0", path = "../embassy-time", optional = true} 43embassy-time = { version = "0.1.0", path = "../embassy-time", optional = true}
44atomic-polyfill = "1.0.1" 44atomic-polyfill = "1.0.1"
45critical-section = "1.1" 45critical-section = "1.1"
diff --git a/embassy-macros/Cargo.toml b/embassy-macros/Cargo.toml
index 19a3e9de2..03fa79dd8 100644
--- a/embassy-macros/Cargo.toml
+++ b/embassy-macros/Cargo.toml
@@ -15,3 +15,6 @@ proc-macro = true
15[features] 15[features]
16std = [] 16std = []
17wasm = [] 17wasm = []
18
19# Enabling this cause interrupt::take! to require embassy-executor
20rtos-trace-interrupt = []
diff --git a/embassy-macros/src/macros/cortex_m_interrupt_take.rs b/embassy-macros/src/macros/cortex_m_interrupt_take.rs
index f6e41bcb4..d30189ce3 100644
--- a/embassy-macros/src/macros/cortex_m_interrupt_take.rs
+++ b/embassy-macros/src/macros/cortex_m_interrupt_take.rs
@@ -6,6 +6,23 @@ pub fn run(name: syn::Ident) -> Result<TokenStream, TokenStream> {
6 let name_interrupt = format_ident!("{}", name); 6 let name_interrupt = format_ident!("{}", name);
7 let name_handler = format!("__EMBASSY_{}_HANDLER", name); 7 let name_handler = format!("__EMBASSY_{}_HANDLER", name);
8 8
9 #[cfg(feature = "rtos-trace-interrupt")]
10 let (isr_enter, isr_exit) = (
11 quote! {
12 ::embassy_executor::rtos_trace_interrupt! {
13 ::embassy_executor::export::trace::isr_enter();
14 }
15 },
16 quote! {
17 ::embassy_executor::rtos_trace_interrupt! {
18 ::embassy_executor::export::trace::isr_exit();
19 }
20 },
21 );
22
23 #[cfg(not(feature = "rtos-trace-interrupt"))]
24 let (isr_enter, isr_exit) = (quote! {}, quote! {});
25
9 let result = quote! { 26 let result = quote! {
10 { 27 {
11 #[allow(non_snake_case)] 28 #[allow(non_snake_case)]
@@ -19,13 +36,11 @@ pub fn run(name: syn::Ident) -> Result<TokenStream, TokenStream> {
19 let func = HANDLER.func.load(interrupt::_export::atomic::Ordering::Relaxed); 36 let func = HANDLER.func.load(interrupt::_export::atomic::Ordering::Relaxed);
20 let ctx = HANDLER.ctx.load(interrupt::_export::atomic::Ordering::Relaxed); 37 let ctx = HANDLER.ctx.load(interrupt::_export::atomic::Ordering::Relaxed);
21 let func: fn(*mut ()) = ::core::mem::transmute(func); 38 let func: fn(*mut ()) = ::core::mem::transmute(func);
22 ::embassy_executor::rtos_trace_interrupt! { 39 #isr_enter
23 ::embassy_executor::export::trace::isr_enter(); 40
24 }
25 func(ctx); 41 func(ctx);
26 ::embassy_executor::rtos_trace_interrupt! { 42 #isr_exit
27 ::embassy_executor::export::trace::isr_exit(); 43
28 }
29 } 44 }
30 45
31 static TAKEN: interrupt::_export::atomic::AtomicBool = interrupt::_export::atomic::AtomicBool::new(false); 46 static TAKEN: interrupt::_export::atomic::AtomicBool = interrupt::_export::atomic::AtomicBool::new(false);