1 个不稳定版本
0.1.0 | 2018年3月26日 |
---|
#6 在 #targeted
78 个星标 & 15 个关注者
8KB
148 行
一个兼容no_std、无分配、单线程的futures执行器;针对支持嵌入式用例。
目标
目前支持两个主要目标:thumbv6m
,thumbv7m
。这两个目标使用内置事件系统,允许在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