1 个不稳定版本

0.1.0 2018年3月26日

#6#targeted

78 个星标 & 15 个关注者

8KB
148

一个兼容no_std、无分配、单线程的futures执行器;针对支持嵌入式用例。

目标

目前支持两个主要目标:thumbv6mthumbv7m。这两个目标使用内置事件系统,允许在future空闲等待输入时休眠。

还支持任何具有完整原子支持的目标。这比使用忙循环的效率低,但可用于在“原生”目标(即您的机器)上测试代码。

安全性

您会注意到Executor::block_on函数的签名接受&'static mut self。这是必要的,因为我们不能像常规使用分配的执行器那样对wakers使用引用计数。相反,我们在执行器中有一个预先分配的waker,并将其引用提供给在它上面运行的任何future。因为waker必须是一个类似于Arc的类型,即使future完成后,我们也不能知道是否仍然存在活动引用,这需要它具有'static生命周期。

使用此执行器有两种方式:静态分配或者动态分配并泄露(例如,如果有 std 分配可用,可以使用 Box::leak)。您需要一个可变引用,因此如果静态分配,则需要使用 static mut 或一些特定于目标的内部借用形式。如果您使用 static mut,必须小心重入性,以确保不会意外地创建多个对执行器的可变引用。

示例

#![feature(const_fn)]
use embrio_executor::Executor;

static mut EXECUTOR: Executor = Executor::new();

// Safety: We are in a non-reentrant context, so this is the only reference
// to the executor that will ever exist.
let executor = unsafe { &mut EXECUTOR };

assert_eq!(executor.block_on(async { 5 }), 5);

依赖关系

~180KB