Add "context" pointer to owned interrupt handlers.

This commit is contained in:
Dario Nieuwenhuis
2021-01-04 22:25:39 +01:00
parent 39ca8b8ded
commit 9e88718fbd
7 changed files with 58 additions and 27 deletions

View File

@ -117,9 +117,9 @@ pub fn interrupt_declare(item: TokenStream) -> TokenStream {
fn number(&self) -> u8 {
Interrupt::#name as u8
}
unsafe fn __handler(&self) -> &'static ::core::sync::atomic::AtomicPtr<u32> {
unsafe fn __handler(&self) -> &'static ::embassy::interrupt::Handler {
#[export_name = #name_handler]
static HANDLER: ::core::sync::atomic::AtomicPtr<u32> = ::core::sync::atomic::AtomicPtr::new(::core::ptr::null_mut());
static HANDLER: ::embassy::interrupt::Handler = ::embassy::interrupt::Handler::new();
&HANDLER
}
}
@ -141,13 +141,14 @@ pub fn interrupt_take(item: TokenStream) -> TokenStream {
pub unsafe extern "C" fn trampoline() {
extern "C" {
#[link_name = #name_handler]
static HANDLER: ::core::sync::atomic::AtomicPtr<u32>;
static HANDLER: ::embassy::interrupt::Handler;
}
let p = HANDLER.load(::core::sync::atomic::Ordering::Acquire);
if !p.is_null() {
let f: fn() = ::core::mem::transmute(p);
f()
let func = HANDLER.func.load(::core::sync::atomic::Ordering::Acquire);
let ctx = HANDLER.ctx.load(::core::sync::atomic::Ordering::Acquire);
if !func.is_null() {
let func: fn(*mut ()) = ::core::mem::transmute(func);
func(ctx)
}
}