cortex-m: remove owned interrupts.
This commit is contained in:
@ -3,32 +3,19 @@ use quote::{format_ident, quote};
|
||||
|
||||
pub fn run(name: syn::Ident) -> Result<TokenStream, TokenStream> {
|
||||
let name = format_ident!("{}", name);
|
||||
let name_interrupt = format_ident!("{}", name);
|
||||
let name_handler = format!("__EMBASSY_{}_HANDLER", name);
|
||||
|
||||
let doc = format!("{} interrupt singleton.", name);
|
||||
let doc = format!("{} interrupt.", name);
|
||||
|
||||
let result = quote! {
|
||||
#[doc = #doc]
|
||||
#[allow(non_camel_case_types)]
|
||||
pub struct #name_interrupt(());
|
||||
unsafe impl ::embassy_cortex_m::interrupt::Interrupt for #name_interrupt {
|
||||
fn number(&self) -> u16 {
|
||||
pub enum #name{}
|
||||
unsafe impl ::embassy_cortex_m::interrupt::Interrupt for #name {
|
||||
fn number() -> u16 {
|
||||
use cortex_m::interrupt::InterruptNumber;
|
||||
let irq = InterruptEnum::#name;
|
||||
irq.number() as u16
|
||||
}
|
||||
unsafe fn steal() -> Self {
|
||||
Self(())
|
||||
}
|
||||
unsafe fn __handler(&self) -> &'static ::embassy_cortex_m::interrupt::DynHandler {
|
||||
#[export_name = #name_handler]
|
||||
static HANDLER: ::embassy_cortex_m::interrupt::DynHandler = ::embassy_cortex_m::interrupt::DynHandler::new();
|
||||
&HANDLER
|
||||
}
|
||||
}
|
||||
|
||||
::embassy_hal_common::impl_peripheral!(#name_interrupt);
|
||||
};
|
||||
Ok(result)
|
||||
}
|
||||
|
@ -1,57 +0,0 @@
|
||||
use proc_macro2::TokenStream;
|
||||
use quote::{format_ident, quote};
|
||||
|
||||
pub fn run(name: syn::Ident) -> Result<TokenStream, TokenStream> {
|
||||
let name = format!("{}", name);
|
||||
let name_interrupt = format_ident!("{}", name);
|
||||
let name_handler = format!("__EMBASSY_{}_HANDLER", name);
|
||||
|
||||
#[cfg(feature = "rtos-trace-interrupt")]
|
||||
let (isr_enter, isr_exit) = (
|
||||
quote! {
|
||||
::embassy_executor::rtos_trace_interrupt! {
|
||||
::embassy_executor::_export::trace::isr_enter();
|
||||
}
|
||||
},
|
||||
quote! {
|
||||
::embassy_executor::rtos_trace_interrupt! {
|
||||
::embassy_executor::_export::trace::isr_exit();
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
#[cfg(not(feature = "rtos-trace-interrupt"))]
|
||||
let (isr_enter, isr_exit) = (quote! {}, quote! {});
|
||||
|
||||
let result = quote! {
|
||||
{
|
||||
#[allow(non_snake_case)]
|
||||
#[export_name = #name]
|
||||
pub unsafe extern "C" fn trampoline() {
|
||||
extern "C" {
|
||||
#[link_name = #name_handler]
|
||||
static HANDLER: interrupt::DynHandler;
|
||||
}
|
||||
|
||||
let func = HANDLER.func.load(interrupt::_export::atomic::Ordering::Relaxed);
|
||||
let ctx = HANDLER.ctx.load(interrupt::_export::atomic::Ordering::Relaxed);
|
||||
let func: fn(*mut ()) = ::core::mem::transmute(func);
|
||||
#isr_enter
|
||||
|
||||
func(ctx);
|
||||
#isr_exit
|
||||
|
||||
}
|
||||
|
||||
static TAKEN: interrupt::_export::atomic::AtomicBool = interrupt::_export::atomic::AtomicBool::new(false);
|
||||
|
||||
if TAKEN.compare_exchange(false, true, interrupt::_export::atomic::Ordering::AcqRel, interrupt::_export::atomic::Ordering::Acquire).is_err() {
|
||||
core::panic!("IRQ Already taken");
|
||||
}
|
||||
|
||||
let irq: interrupt::#name_interrupt = unsafe { ::core::mem::transmute(()) };
|
||||
irq
|
||||
}
|
||||
};
|
||||
Ok(result)
|
||||
}
|
@ -1,5 +1,4 @@
|
||||
pub mod cortex_m_interrupt;
|
||||
pub mod cortex_m_interrupt_declare;
|
||||
pub mod cortex_m_interrupt_take;
|
||||
pub mod main;
|
||||
pub mod task;
|
||||
|
Reference in New Issue
Block a user