#嵌入式设备 #定时器 #HAL #异步 #假设

no-std 嵌入式异步定时器

嵌入式设备的异步定时器

1 个不稳定版本

0.1.0 2020年7月7日

#1395嵌入式开发

MIT 许可证

44KB
707

嵌入式异步定时器

Rust中嵌入式设备的异步定时器。

这个crate提供了一个定时器的接口和泛型实现,该定时器可以使用Rust提供的Future架构处理多个并发截止日期。此crate还为STM32F103和STM32L476提供了两个接口参考实现。

使用Timer特质的实现,你可以实例化一个AsyncTimer,它提供了一种与Future兼容的接口,可以同时等待特定的截止日期或持续时间。使用这个crate,你可以实现需要延迟的设备驱动程序。使用与嵌入式异步定时器兼容的HAL crate,你可以开发需要直接延迟或使用上述驱动的固件。对于具有闹钟功能的HAL RTC实现,应该很容易将其修改为实现Timer特质。查看impls模块中的STM32F103示例以获取灵感。

注意:由于const_generics尚未实现,AsyncTimer的容量是硬编码的。

注意:当前的设计假设了一个类似于bare_metal的单核架构,该架构支持类似于interrupt::free的块。在将来,我希望重写一切,不再需要这个。

注意:在此实现中使用的优先级队列可能不是最有效的数据结构选择。我打算尝试各种配置,以根据少量并发定时器的实际测量结果进行有根据的性能考虑。

状态: 此软件包已在两个嵌入式设备上使用简单示例进行测试,但尚未应用于生产。虽然超出了简单的概念验证,但我们的意图是为异步生态系统提供基础。其质量可能也不足以在生产环境中运行。当前的异步await状态可能使得在内存受限的嵌入式设备上实际上不可用。尽管如此,我们鼓励使用此软件包开发异步HAL驱动程序。

示例

async {
    let timer = AsyncTimer::new(rtc);
    timer.wait(Duration::from_millis(500).into()).await;

    let mut interval = Interval::new(Duration::from_secs(1).into(), &timer);

    loop {
        interval.wait(&timer).await;
        println!("ping");
    }
}

依赖项

~0.1–11MB
~321K SLoC