diff options
| author | Dario Nieuwenhuis <[email protected]> | 2023-06-08 16:08:40 +0200 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2023-06-08 18:00:48 +0200 |
| commit | 921780e6bfb9bcb2cd087b8aa8b094d792c99fa2 (patch) | |
| tree | bd21fba9800471b860ca44e05567588dcc1afef7 /embassy-stm32/src/lib.rs | |
| parent | 87ad66f2b4a5bfd36dfc8d8aad5492e9e3f915e6 (diff) | |
Make interrupt module more standard.
- Move typelevel interrupts to a special-purpose mod: `embassy_xx::interrupt::typelevel`.
- Reexport the PAC interrupt enum in `embassy_xx::interrupt`.
This has a few advantages:
- The `embassy_xx::interrupt` module is now more "standard".
- It works with `cortex-m` functions for manipulating interrupts, for example.
- It works with RTIC.
- the interrupt enum allows holding value that can be "any interrupt at runtime", this can't be done with typelevel irqs.
- When "const-generics on enums" is stable, we can remove the typelevel interrupts without disruptive changes to `embassy_xx::interrupt`.
Diffstat (limited to 'embassy-stm32/src/lib.rs')
| -rw-r--r-- | embassy-stm32/src/lib.rs | 55 |
1 files changed, 24 insertions, 31 deletions
diff --git a/embassy-stm32/src/lib.rs b/embassy-stm32/src/lib.rs index 75d8af3dd..b42864567 100644 --- a/embassy-stm32/src/lib.rs +++ b/embassy-stm32/src/lib.rs | |||
| @@ -72,46 +72,39 @@ pub(crate) mod _generated { | |||
| 72 | include!(concat!(env!("OUT_DIR"), "/_generated.rs")); | 72 | include!(concat!(env!("OUT_DIR"), "/_generated.rs")); |
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | pub mod interrupt { | 75 | pub use crate::_generated::interrupt; |
| 76 | //! Interrupt definitions and macros to bind them. | 76 | |
| 77 | pub use cortex_m::interrupt::{CriticalSection, Mutex}; | 77 | /// Macro to bind interrupts to handlers. |
| 78 | pub use embassy_cortex_m::interrupt::{Binding, Handler, Interrupt, Priority}; | 78 | /// |
| 79 | 79 | /// This defines the right interrupt handlers, and creates a unit struct (like `struct Irqs;`) | |
| 80 | pub use crate::_generated::interrupt::*; | 80 | /// and implements the right [`Binding`]s for it. You can pass this struct to drivers to |
| 81 | 81 | /// prove at compile-time that the right interrupts have been bound. | |
| 82 | /// Macro to bind interrupts to handlers. | 82 | // developer note: this macro can't be in `embassy-cortex-m` due to the use of `$crate`. |
| 83 | /// | 83 | #[macro_export] |
| 84 | /// This defines the right interrupt handlers, and creates a unit struct (like `struct Irqs;`) | 84 | macro_rules! bind_interrupts { |
| 85 | /// and implements the right [`Binding`]s for it. You can pass this struct to drivers to | 85 | ($vis:vis struct $name:ident { $($irq:ident => $($handler:ty),*;)* }) => { |
| 86 | /// prove at compile-time that the right interrupts have been bound. | 86 | $vis struct $name; |
| 87 | // developer note: this macro can't be in `embassy-cortex-m` due to the use of `$crate`. | 87 | |
| 88 | #[macro_export] | 88 | $( |
| 89 | macro_rules! bind_interrupts { | 89 | #[allow(non_snake_case)] |
| 90 | ($vis:vis struct $name:ident { $($irq:ident => $($handler:ty),*;)* }) => { | 90 | #[no_mangle] |
| 91 | $vis struct $name; | 91 | unsafe extern "C" fn $irq() { |
| 92 | |||
| 93 | $( | ||
| 94 | #[allow(non_snake_case)] | ||
| 95 | #[no_mangle] | ||
| 96 | unsafe extern "C" fn $irq() { | ||
| 97 | $( | ||
| 98 | <$handler as $crate::interrupt::Handler<$crate::interrupt::$irq>>::on_interrupt(); | ||
| 99 | )* | ||
| 100 | } | ||
| 101 | |||
| 102 | $( | 92 | $( |
| 103 | unsafe impl $crate::interrupt::Binding<$crate::interrupt::$irq, $handler> for $name {} | 93 | <$handler as $crate::interrupt::typelevel::Handler<$crate::interrupt::typelevel::$irq>>::on_interrupt(); |
| 104 | )* | 94 | )* |
| 95 | } | ||
| 96 | |||
| 97 | $( | ||
| 98 | unsafe impl $crate::interrupt::typelevel::Binding<$crate::interrupt::typelevel::$irq, $handler> for $name {} | ||
| 105 | )* | 99 | )* |
| 106 | }; | 100 | )* |
| 107 | } | 101 | }; |
| 108 | } | 102 | } |
| 109 | 103 | ||
| 110 | // Reexports | 104 | // Reexports |
| 111 | pub use _generated::{peripherals, Peripherals}; | 105 | pub use _generated::{peripherals, Peripherals}; |
| 112 | pub use embassy_cortex_m::executor; | 106 | pub use embassy_cortex_m::executor; |
| 113 | use embassy_cortex_m::interrupt::Priority; | 107 | use embassy_cortex_m::interrupt::Priority; |
| 114 | pub use embassy_cortex_m::interrupt::_export::interrupt; | ||
| 115 | pub use embassy_hal_common::{into_ref, Peripheral, PeripheralRef}; | 108 | pub use embassy_hal_common::{into_ref, Peripheral, PeripheralRef}; |
| 116 | #[cfg(feature = "unstable-pac")] | 109 | #[cfg(feature = "unstable-pac")] |
| 117 | pub use stm32_metapac as pac; | 110 | pub use stm32_metapac as pac; |
