12个版本 (6个重大更新)

0.6.0 2024年8月5日
0.5.0 2024年1月11日
0.4.0 2023年12月7日
0.3.3 2023年11月15日
0.0.0 2020年10月31日

#31 in 嵌入式开发

Download history 3874/week @ 2024-05-04 3448/week @ 2024-05-11 5480/week @ 2024-05-18 6036/week @ 2024-05-25 4783/week @ 2024-06-01 4903/week @ 2024-06-08 4887/week @ 2024-06-15 5851/week @ 2024-06-22 5324/week @ 2024-06-29 6495/week @ 2024-07-06 8572/week @ 2024-07-13 7401/week @ 2024-07-20 5039/week @ 2024-07-27 5684/week @ 2024-08-03 7791/week @ 2024-08-10 4367/week @ 2024-08-17

每月下载量 23,701
用于 39 软件包

MIT/Apache

120KB
2K SLoC

embassy-executor

为嵌入式使用设计的异步/await 执行器。

  • 无需alloc,无需堆。
  • 使用nightly Rust,任务futures可以完全静态分配。
  • 无“固定容量”数据结构,执行器无需配置/调整即可处理1或1000个任务。
  • 集成定时器队列:休眠很容易,只需做 Timer::after_secs(1).await;
  • 无忙等待轮询:当没有工作要做时,CPU会进入睡眠状态,使用中断或WFE/SEV
  • 高效轮询:唤醒只会轮询唤醒的任务,而不会轮询所有任务。
  • 公平:即使任务不断被唤醒,任务也无法独占CPU时间。在给定的任务第二次被轮询之前,所有其他任务都有机会运行。
  • 支持创建多个执行器实例,以运行具有多个优先级的任务。这允许高优先级任务抢占低优先级任务。

任务竞技场

当不启用nightly Cargo功能时,embassy-executor将从竞技场(一个非常简单的增量分配器)分配任务。

如果任务竞技场已满,程序将在运行时崩溃。为了保证不会发生这种情况,您必须将其大小设置为所有任务大小的总和。

任务首次生成时从竞技场分配。如果任务存在,则分配不会释放到竞技场,但可以重复使用来再次生成任务。对于多实例任务(如 #[embassy_executor::task(pool_size = 4)]),首次生成将分配所有实例的内存。这是为了性能和可预测性(例如,在启动时至少生成每个任务的一个实例可以保证如果竞技场过小,将立即发生恐慌,而按需分配实例可能会延迟恐慌,仅在程序处于负载时发生)。

竞技场大小可以通过两种方式配置

  • 通过 Cargo 功能:启用 Cargo 功能,如 task-arena-size-8192。仅提供一组值,请参阅任务区域大小以供参考。
  • 通过构建时的环境变量:设置名为 EMBASSY_EXECUTOR_TASK_ARENA_SIZE 的变量。例如 EMBASSY_EXECUTOR_TASK_ARENA_SIZE=4321 cargo build。您也可以在 [env] 部分的 .cargo/config.toml 中设置它们。可以设置任何值,与 Cargo 功能不同。

环境变量优先于 Cargo 功能。如果为同一设置启用了具有不同值的两个 Cargo 功能,则编译失败。

静态分配任务

当使用夜间 Rust 时,启用 nightly Cargo 功能。这将使 embassy-executor 使用 type_alias_impl_trait 功能,在静态中分配所有任务。每个任务都获得自己的 static,编译时自动计算用于容纳任务的确切大小(或如果使用 pool_size,则为其多个实例)。如果任务不适合内存,则链接器在编译时检测到。运行时因内存不足而引发的恐慌是不可能的。

忽略配置的竞技场大小,根本不使用任何竞技场。

依赖项

~0.8–8.5MB
~237K SLoC