This crate provides utilities for handling interrupts on embedded devices.
Please refer to the changelog to see what changed in the last releases.
- Dynamically and atomically registered, zero-allocation interrupt handlers.
- Allows moving data into interrupt handlers, and sharing data between handlers.
- Completely platform agnostic, does not require atomic swap operations (works on eg. thumbv6 targets).
Add an entry to your Cargo.toml:
[dependencies] irq = "0.2.3"Check the API Documentation for how to use the crate's functionality. A small example showcasing the Scoped Interrupts API is provided below:
use irq::{scoped_interrupts, handler, scope}; use mock_pac::interrupt; // Hook `INT0` and `INT1` using the `#[interrupt]` attribute imported above. scoped_interrupts! { enum Interrupt { INT0, INT1, } use #[interrupt]; } fn main() { // Define data to be used (via move or borrow) by the interrupt handlers. let mut i = 0; let shared = [0, 1, 2]; // Define handlers using the `handler!` macro. handler!(int0 = || i += shared[1]); handler!(int1 = || println!("{}", shared[2])); // Create a scope and register the handlers. scope(|scope| { scope.register(Interrupt::INT0, int0); scope.register(Interrupt::INT1, int1); // The interrupts stay registered for the duration of this closure. // This is a good place for the application's idle loop. }); }This crate targets stable Rust. No guarantees are made beyond that, so the minimum supported version might be bumped as needed.