diff options
| author | Dario Nieuwenhuis <[email protected]> | 2024-10-22 15:18:35 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-10-22 15:18:35 +0000 |
| commit | 8eb80c6816a1f6ea7814acd4f48f07e79891f804 (patch) | |
| tree | 9489bb1aa5e2fada609eb9d19704baf87b907c5b | |
| parent | f7d372f33f312d75e6c8f974d0a92069951e2bf4 (diff) | |
| parent | c79791552563746e9f62e3d2647d787d3947c249 (diff) | |
Merge pull request #3444 from dnbln/main
feat: allow `bind_interrupts!` to accept conditional compilation attrs
| -rw-r--r-- | embassy-nrf/src/lib.rs | 19 | ||||
| -rw-r--r-- | embassy-rp/src/lib.rs | 19 | ||||
| -rw-r--r-- | embassy-stm32/src/lib.rs | 19 |
3 files changed, 42 insertions, 15 deletions
diff --git a/embassy-nrf/src/lib.rs b/embassy-nrf/src/lib.rs index 13623dd1c..bd53664a2 100644 --- a/embassy-nrf/src/lib.rs +++ b/embassy-nrf/src/lib.rs | |||
| @@ -177,22 +177,31 @@ 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 { $($irq:ident => $($handler:ty),*;)* }) => { | 180 | ($vis:vis struct $name:ident { |
| 181 | $( | ||
| 182 | $(#[cfg($cond_irq:meta)])? | ||
| 183 | $irq:ident => $( | ||
| 184 | $(#[cfg($cond_handler:meta)])? | ||
| 185 | $handler:ty | ||
| 186 | ),*; | ||
| 187 | )* | ||
| 188 | }) => { | ||
| 181 | #[derive(Copy, Clone)] | 189 | #[derive(Copy, Clone)] |
| 182 | $vis struct $name; | 190 | $vis struct $name; |
| 183 | 191 | ||
| 184 | $( | 192 | $( |
| 185 | #[allow(non_snake_case)] | 193 | #[allow(non_snake_case)] |
| 186 | #[no_mangle] | 194 | #[no_mangle] |
| 195 | $(#[cfg($cond_irq)])? | ||
| 187 | unsafe extern "C" fn $irq() { | 196 | unsafe extern "C" fn $irq() { |
| 188 | $( | 197 | $( |
| 198 | $(#[cfg($cond_handler)])? | ||
| 189 | <$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 | |||
| 201 | $(#[cfg($cond_handler)])? | ||
| 202 | unsafe impl $crate::interrupt::typelevel::Binding<$crate::interrupt::typelevel::$irq, $handler> for $name {} | ||
| 190 | )* | 203 | )* |
| 191 | } | 204 | } |
| 192 | |||
| 193 | $( | ||
| 194 | unsafe impl $crate::interrupt::typelevel::Binding<$crate::interrupt::typelevel::$irq, $handler> for $name {} | ||
| 195 | )* | ||
| 196 | )* | 205 | )* |
| 197 | }; | 206 | }; |
| 198 | } | 207 | } |
diff --git a/embassy-rp/src/lib.rs b/embassy-rp/src/lib.rs index f56cfba27..51f6ed7f8 100644 --- a/embassy-rp/src/lib.rs +++ b/embassy-rp/src/lib.rs | |||
| @@ -166,22 +166,31 @@ embassy_hal_internal::interrupt_mod!( | |||
| 166 | // developer note: this macro can't be in `embassy-hal-internal` due to the use of `$crate`. | 166 | // developer note: this macro can't be in `embassy-hal-internal` due to the use of `$crate`. |
| 167 | #[macro_export] | 167 | #[macro_export] |
| 168 | macro_rules! bind_interrupts { | 168 | macro_rules! bind_interrupts { |
| 169 | ($vis:vis struct $name:ident { $($irq:ident => $($handler:ty),*;)* }) => { | 169 | ($vis:vis struct $name:ident { |
| 170 | $( | ||
| 171 | $(#[cfg($cond_irq:meta)])? | ||
| 172 | $irq:ident => $( | ||
| 173 | $(#[cfg($cond_handler:meta)])? | ||
| 174 | $handler:ty | ||
| 175 | ),*; | ||
| 176 | )* | ||
| 177 | }) => { | ||
| 170 | #[derive(Copy, Clone)] | 178 | #[derive(Copy, Clone)] |
| 171 | $vis struct $name; | 179 | $vis struct $name; |
| 172 | 180 | ||
| 173 | $( | 181 | $( |
| 174 | #[allow(non_snake_case)] | 182 | #[allow(non_snake_case)] |
| 175 | #[no_mangle] | 183 | #[no_mangle] |
| 184 | $(#[cfg($cond_irq)])? | ||
| 176 | unsafe extern "C" fn $irq() { | 185 | unsafe extern "C" fn $irq() { |
| 177 | $( | 186 | $( |
| 187 | $(#[cfg($cond_handler)])? | ||
| 178 | <$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 | |||
| 190 | $(#[cfg($cond_handler)])? | ||
| 191 | unsafe impl $crate::interrupt::typelevel::Binding<$crate::interrupt::typelevel::$irq, $handler> for $name {} | ||
| 179 | )* | 192 | )* |
| 180 | } | 193 | } |
| 181 | |||
| 182 | $( | ||
| 183 | unsafe impl $crate::interrupt::typelevel::Binding<$crate::interrupt::typelevel::$irq, $handler> for $name {} | ||
| 184 | )* | ||
| 185 | )* | 194 | )* |
| 186 | }; | 195 | }; |
| 187 | } | 196 | } |
diff --git a/embassy-stm32/src/lib.rs b/embassy-stm32/src/lib.rs index 5f103e652..1e6185bc1 100644 --- a/embassy-stm32/src/lib.rs +++ b/embassy-stm32/src/lib.rs | |||
| @@ -165,22 +165,31 @@ pub use crate::_generated::interrupt; | |||
| 165 | // developer note: this macro can't be in `embassy-hal-internal` due to the use of `$crate`. | 165 | // developer note: this macro can't be in `embassy-hal-internal` due to the use of `$crate`. |
| 166 | #[macro_export] | 166 | #[macro_export] |
| 167 | macro_rules! bind_interrupts { | 167 | macro_rules! bind_interrupts { |
| 168 | ($vis:vis struct $name:ident { $($irq:ident => $($handler:ty),*;)* }) => { | 168 | ($vis:vis struct $name:ident { |
| 169 | $( | ||
| 170 | $(#[cfg($cond_irq:meta)])? | ||
| 171 | $irq:ident => $( | ||
| 172 | $(#[cfg($cond_handler:meta)])? | ||
| 173 | $handler:ty | ||
| 174 | ),*; | ||
| 175 | )* | ||
| 176 | }) => { | ||
| 169 | #[derive(Copy, Clone)] | 177 | #[derive(Copy, Clone)] |
| 170 | $vis struct $name; | 178 | $vis struct $name; |
| 171 | 179 | ||
| 172 | $( | 180 | $( |
| 173 | #[allow(non_snake_case)] | 181 | #[allow(non_snake_case)] |
| 174 | #[no_mangle] | 182 | #[no_mangle] |
| 183 | $(#[cfg($cond_irq)])? | ||
| 175 | unsafe extern "C" fn $irq() { | 184 | unsafe extern "C" fn $irq() { |
| 176 | $( | 185 | $( |
| 186 | $(#[cfg($cond_handler)])? | ||
| 177 | <$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 | |||
| 189 | $(#[cfg($cond_handler)])? | ||
| 190 | unsafe impl $crate::interrupt::typelevel::Binding<$crate::interrupt::typelevel::$irq, $handler> for $name {} | ||
| 178 | )* | 191 | )* |
| 179 | } | 192 | } |
| 180 | |||
| 181 | $( | ||
| 182 | unsafe impl $crate::interrupt::typelevel::Binding<$crate::interrupt::typelevel::$irq, $handler> for $name {} | ||
| 183 | )* | ||
| 184 | )* | 193 | )* |
| 185 | }; | 194 | }; |
| 186 | } | 195 | } |
