diff options
| author | Dario Nieuwenhuis <[email protected]> | 2021-01-04 22:25:39 +0100 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2021-01-04 22:25:39 +0100 |
| commit | 9e88718fbdd27a33e0182c8430bc51ff314f4e48 (patch) | |
| tree | 2accafc9f5e1020bbd806b6607cfbf522eccac33 /embassy-macros/src | |
| parent | 39ca8b8dedb3db14f9770f09814ccf92481b6136 (diff) | |
Add "context" pointer to owned interrupt handlers.
Diffstat (limited to 'embassy-macros/src')
| -rw-r--r-- | embassy-macros/src/lib.rs | 15 |
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 | ||
