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 嵌入式开发
每月下载量 23,701
用于 39 软件包
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