diff options
| -rw-r--r-- | embassy-nrf/src/lib.rs | 63 | ||||
| -rw-r--r-- | embassy-rp/src/lib.rs | 15 | ||||
| -rw-r--r-- | embassy-stm32/src/lib.rs | 11 |
3 files changed, 58 insertions, 31 deletions
diff --git a/embassy-nrf/src/lib.rs b/embassy-nrf/src/lib.rs index 03d3ca5f7..430b6fae7 100644 --- a/embassy-nrf/src/lib.rs +++ b/embassy-nrf/src/lib.rs | |||
| @@ -177,34 +177,43 @@ mod chip; | |||
| 177 | // developer note: this macro can't be in `embassy-hal-internal` due to the use of `$crate`. | 177 | // developer note: this macro can't be in `embassy-hal-internal` due to the use of `$crate`. |
| 178 | #[macro_export] | 178 | #[macro_export] |
| 179 | macro_rules! bind_interrupts { | 179 | macro_rules! bind_interrupts { |
| 180 | ($vis:vis struct $name:ident { | 180 | ($vis:vis struct $name:ident { |
| 181 | $( | 181 | $( |
| 182 | $(#[cfg($cond_irq:meta)])? | 182 | $(#[cfg($cond_irq:meta)])? |
| 183 | $irq:ident => $( | 183 | $irq:ident => $( |
| 184 | $(#[cfg($cond_handler:meta)])? | 184 | $(#[cfg($cond_handler:meta)])? |
| 185 | $handler:ty | 185 | $handler:ty |
| 186 | ),*; | 186 | ),*; |
| 187 | )* | 187 | )* |
| 188 | }) => { | 188 | }) => { |
| 189 | #[derive(Copy, Clone)] | 189 | #[derive(Copy, Clone)] |
| 190 | $vis struct $name; | 190 | $vis struct $name; |
| 191 | 191 | ||
| 192 | $( | 192 | $( |
| 193 | #[allow(non_snake_case)] | 193 | #[allow(non_snake_case)] |
| 194 | #[no_mangle] | 194 | #[no_mangle] |
| 195 | $(#[cfg($cond_irq)])? | 195 | $(#[cfg($cond_irq)])? |
| 196 | unsafe extern "C" fn $irq() { | 196 | unsafe extern "C" fn $irq() { |
| 197 | $( | 197 | $( |
| 198 | $(#[cfg($cond_handler)])? | 198 | $(#[cfg($cond_handler)])? |
| 199 | <$handler as $crate::interrupt::typelevel::Handler<$crate::interrupt::typelevel::$irq>>::on_interrupt(); | 199 | <$handler as $crate::interrupt::typelevel::Handler<$crate::interrupt::typelevel::$irq>>::on_interrupt(); |
| 200 | 200 | ||
| 201 | $(#[cfg($cond_handler)])? | 201 | )* |
| 202 | unsafe impl $crate::interrupt::typelevel::Binding<$crate::interrupt::typelevel::$irq, $handler> for $name {} | 202 | } |
| 203 | )* | 203 | |
| 204 | } | 204 | $(#[cfg($cond_irq)])? |
| 205 | )* | 205 | $crate::bind_interrupts!(@inner |
| 206 | }; | 206 | $( |
| 207 | $(#[cfg($cond_handler)])? | ||
| 208 | unsafe impl $crate::interrupt::typelevel::Binding<$crate::interrupt::typelevel::$irq, $handler> for $name {} | ||
| 209 | )* | ||
| 210 | ); | ||
| 211 | )* | ||
| 212 | }; | ||
| 213 | (@inner $($t:tt)*) => { | ||
| 214 | $($t)* | ||
| 207 | } | 215 | } |
| 216 | } | ||
| 208 | 217 | ||
| 209 | // Reexports | 218 | // Reexports |
| 210 | 219 | ||
diff --git a/embassy-rp/src/lib.rs b/embassy-rp/src/lib.rs index 51f6ed7f8..f0893b5a0 100644 --- a/embassy-rp/src/lib.rs +++ b/embassy-rp/src/lib.rs | |||
| @@ -175,8 +175,8 @@ macro_rules! bind_interrupts { | |||
| 175 | ),*; | 175 | ),*; |
| 176 | )* | 176 | )* |
| 177 | }) => { | 177 | }) => { |
| 178 | #[derive(Copy, Clone)] | 178 | #[derive(Copy, Clone)] |
| 179 | $vis struct $name; | 179 | $vis struct $name; |
| 180 | 180 | ||
| 181 | $( | 181 | $( |
| 182 | #[allow(non_snake_case)] | 182 | #[allow(non_snake_case)] |
| @@ -187,12 +187,21 @@ macro_rules! bind_interrupts { | |||
| 187 | $(#[cfg($cond_handler)])? | 187 | $(#[cfg($cond_handler)])? |
| 188 | <$handler as $crate::interrupt::typelevel::Handler<$crate::interrupt::typelevel::$irq>>::on_interrupt(); | 188 | <$handler as $crate::interrupt::typelevel::Handler<$crate::interrupt::typelevel::$irq>>::on_interrupt(); |
| 189 | 189 | ||
| 190 | )* | ||
| 191 | } | ||
| 192 | |||
| 193 | $(#[cfg($cond_irq)])? | ||
| 194 | $crate::bind_interrupts!(@inner | ||
| 195 | $( | ||
| 190 | $(#[cfg($cond_handler)])? | 196 | $(#[cfg($cond_handler)])? |
| 191 | unsafe impl $crate::interrupt::typelevel::Binding<$crate::interrupt::typelevel::$irq, $handler> for $name {} | 197 | unsafe impl $crate::interrupt::typelevel::Binding<$crate::interrupt::typelevel::$irq, $handler> for $name {} |
| 192 | )* | 198 | )* |
| 193 | } | 199 | ); |
| 194 | )* | 200 | )* |
| 195 | }; | 201 | }; |
| 202 | (@inner $($t:tt)*) => { | ||
| 203 | $($t)* | ||
| 204 | } | ||
| 196 | } | 205 | } |
| 197 | 206 | ||
| 198 | #[cfg(feature = "rp2040")] | 207 | #[cfg(feature = "rp2040")] |
diff --git a/embassy-stm32/src/lib.rs b/embassy-stm32/src/lib.rs index 1e6185bc1..286a18da2 100644 --- a/embassy-stm32/src/lib.rs +++ b/embassy-stm32/src/lib.rs | |||
| @@ -186,12 +186,21 @@ macro_rules! bind_interrupts { | |||
| 186 | $(#[cfg($cond_handler)])? | 186 | $(#[cfg($cond_handler)])? |
| 187 | <$handler as $crate::interrupt::typelevel::Handler<$crate::interrupt::typelevel::$irq>>::on_interrupt(); | 187 | <$handler as $crate::interrupt::typelevel::Handler<$crate::interrupt::typelevel::$irq>>::on_interrupt(); |
| 188 | 188 | ||
| 189 | )* | ||
| 190 | } | ||
| 191 | |||
| 192 | $(#[cfg($cond_irq)])? | ||
| 193 | $crate::bind_interrupts!(@inner | ||
| 194 | $( | ||
| 189 | $(#[cfg($cond_handler)])? | 195 | $(#[cfg($cond_handler)])? |
| 190 | unsafe impl $crate::interrupt::typelevel::Binding<$crate::interrupt::typelevel::$irq, $handler> for $name {} | 196 | unsafe impl $crate::interrupt::typelevel::Binding<$crate::interrupt::typelevel::$irq, $handler> for $name {} |
| 191 | )* | 197 | )* |
| 192 | } | 198 | ); |
| 193 | )* | 199 | )* |
| 194 | }; | 200 | }; |
| 201 | (@inner $($t:tt)*) => { | ||
| 202 | $($t)* | ||
| 203 | } | ||
| 195 | } | 204 | } |
| 196 | 205 | ||
| 197 | // Reexports | 206 | // Reexports |
