1 个不稳定版本
0.1.0 | 2020年7月7日 |
---|
#1395 在 嵌入式开发
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