embassy book

时间保持

在嵌入式程序中,延迟任务是最常见的操作之一。在事件循环中,如果未执行其他 I/O 操作,则需要插入延迟以确保其他任务有机会在循环的下一次迭代被调用之前运行。Embassy 提供了抽象来延迟当前任务指定的间隔时间。

Embassy 中时间保持的接口由 embassy-time crate 处理。这些类型可以与 embassy-executor 中的内部定时器队列或自定义定时器队列实现一起使用。

定时器

embassy::time::Timer 类型提供了两种定时方法。

  • Timer::at 创建一个 future,该 future 在指定的 Instant 完成,相对于系统启动时间。
  • Timer::after 创建一个 future,该 future 在指定的 Duration 之后完成,相对于 future 创建的时间。

以下是延迟的示例:

提示:运行此示例所需的依赖项可以在这里找到。

use embassy::executor::{task, Executor};
use embassy::time::{Duration, Timer};

#[task]
/// Task that ticks periodically
async fn tick_periodic() -> ! {
    loop {
        rprintln!("tick!");
        // async sleep primitive, suspends the task for 500ms.
        Timer::after(Duration::from_millis(500)).await;
    }
}

延迟

embassy::time::Delay 类型提供了 embedded-halembedded-hal-async traits 的实现。这可以用于期望提供通用延迟实现的驱动程序。

以下是如何使用它的示例:

提示:运行此示例所需的依赖项可以在这里找到。

use embassy::executor::{task, Executor};

#[task]
/// Task that ticks periodically
async fn tick_periodic() -> ! {
    loop {
        rprintln!("tick!");
        // async sleep primitive, suspends the task for 500ms.
        generic_delay(embassy::time::Delay).await
    }
}

async fn generic_delay<D: embedded_hal_async::delay::DelayNs>(delay: D) {
      delay.delay_ms(500).await;
}