aboutsummaryrefslogtreecommitdiff
path: root/embassy-macros/src/lib.rs
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2021-01-04 22:25:39 +0100
committerDario Nieuwenhuis <[email protected]>2021-01-04 22:25:39 +0100
commit9e88718fbdd27a33e0182c8430bc51ff314f4e48 (patch)
tree2accafc9f5e1020bbd806b6607cfbf522eccac33 /embassy-macros/src/lib.rs
parent39ca8b8dedb3db14f9770f09814ccf92481b6136 (diff)
Add "context" pointer to owned interrupt handlers.
Diffstat (limited to 'embassy-macros/src/lib.rs')
-rw-r--r--embassy-macros/src/lib.rs15
1 files changed, 8 insertions, 7 deletions
diff --git a/embassy-macros/src/lib.rs b/embassy-macros/src/lib.rs
index c46f114a0..861406393 100644
--- a/embassy-macros/src/lib.rs
+++ b/embassy-macros/src/lib.rs
@@ -117,9 +117,9 @@ pub fn interrupt_declare(item: TokenStream) -> TokenStream {
117 fn number(&self) -> u8 { 117 fn number(&self) -> u8 {
118 Interrupt::#name as u8 118 Interrupt::#name as u8
119 } 119 }
120 unsafe fn __handler(&self) -> &'static ::core::sync::atomic::AtomicPtr<u32> { 120 unsafe fn __handler(&self) -> &'static ::embassy::interrupt::Handler {
121 #[export_name = #name_handler] 121 #[export_name = #name_handler]
122 static HANDLER: ::core::sync::atomic::AtomicPtr<u32> = ::core::sync::atomic::AtomicPtr::new(::core::ptr::null_mut()); 122 static HANDLER: ::embassy::interrupt::Handler = ::embassy::interrupt::Handler::new();
123 &HANDLER 123 &HANDLER
124 } 124 }
125 } 125 }
@@ -141,13 +141,14 @@ pub fn interrupt_take(item: TokenStream) -> TokenStream {
141 pub unsafe extern "C" fn trampoline() { 141 pub unsafe extern "C" fn trampoline() {
142 extern "C" { 142 extern "C" {
143 #[link_name = #name_handler] 143 #[link_name = #name_handler]
144 static HANDLER: ::core::sync::atomic::AtomicPtr<u32>; 144 static HANDLER: ::embassy::interrupt::Handler;
145 } 145 }
146 146
147 let p = HANDLER.load(::core::sync::atomic::Ordering::Acquire); 147 let func = HANDLER.func.load(::core::sync::atomic::Ordering::Acquire);
148 if !p.is_null() { 148 let ctx = HANDLER.ctx.load(::core::sync::atomic::Ordering::Acquire);
149 let f: fn() = ::core::mem::transmute(p); 149 if !func.is_null() {
150 f() 150 let func: fn(*mut ()) = ::core::mem::transmute(func);
151 func(ctx)
151 } 152 }
152 } 153 }
153 154