#interrupt #handler #scoped #handling

no-std irq

作用域中断处理程序和中断锁,用于共享数据

3 个版本

0.2.3 2020年3月8日
0.2.2 2020年2月16日
0.2.1 2020年1月26日
0.2.0 2020年1月21日
0.1.0 2020年1月19日

#12 in #handling

0BSD 许可证

32KB
396

IRQ – 用于编写中断处理程序的实用工具

crates.io docs.rs Build Status

此软件包提供了用于处理嵌入式设备中断的实用工具。

请参阅变更日志以了解最新版本中的更改。

特性

  • 动态和原子注册、零分配的中断处理程序。
  • 允许将数据移动到中断处理程序中,并在处理程序之间共享数据。
  • 完全平台无关,不需要原子交换操作(例如在 thumbv6 目标上工作)。

用法

在您的 Cargo.toml 中添加条目

[dependencies]
irq = "0.2.3"

有关如何使用软件包功能的信息,请参阅API 文档。以下提供了一个展示作用域中断 API 的小示例。

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.
    });
}

Rust 版本支持

此软件包针对稳定 Rust。对此之外不做保证,因此可能需要根据需要提高最低支持版本。

.travis.yml 中明确测试了 MSRV。

无运行时依赖