[英]How do I use Tokio Reactor in a #[no_std] environment?
我正在尝试在Tock OS嵌入式操作系统上实施期货。 我正在尝试在#[no_std]
环境中使用Tokio 。
我的Cargo.toml
文件如下所示:
[package]
name = "nrf52dk"
version = "0.1.0"
authors = ["Tock Project Developers <tock-dev@googlegroups.com>"]
build = "build.rs"
[profile.dev]
panic = "abort"
lto = true
opt-level = "z"
debug = true
[profile.release]
panic = "abort"
lto = true
opt-level = "z"
debug = true
[dependencies]
cortexm4 = { path = "../../arch/cortex-m4" }
capsules = { path = "../../capsules" }
kernel = { path = "../../kernel" }
nrf52 = { path = "../../chips/nrf52" }
nrf5x = { path = "../../chips/nrf5x" }
futures = {version = "0.2.0", default-features = false }
编译没有错误,但是当我添加tokio-reactor = "0.1.1"
,出现错误: error[E0463]: can't find crate for std
。 我了解这是因为Tokio从std库中导入了一些东西。
有可能解决这个问题吗?
据我所知,你没有 。 Tokio Reactor 0.1.1 从标准库中导入了很多东西 ,有条件地没有。
大部分的进口也许可以切换到libcore
的替代品,但Arc
需要的内存分配,它生活在alloc
箱。
作为支持no_std
的板条箱的示例,请查看Futures 0.1.20 。 它具有一个功能标记,可以选择需要标准库的功能。
如果您希望这样做,则需要为Tokio及其所有依赖项做出大量努力,以添加功能标记以选择加入需要标准库的所有功能。 值得与维护者共同解决这一问题。
扩展一下Shepmaster已经说过的话:您不需要tokio
; 它基于mio
,它不太可能在内核中运行,尤其是没有堆分配/ std的情况。
那么如何在这样的环境中驱动任务(产生的Future
)(这是针对futures
0.1.x系列编写的):
Future
存储在Spawn<...>
。 为此应该可以使用“静态”分配的存储。 UnsafeNotify
(和基本特征Notify
),可能是对任务(包括状态)的原始指针/ &'static
引用; notify
需要能够将任务排队,以便以线程安全的方式进行轮询。 {clone,drop}_{raw,id}
函数可以为空,因为无论如何您都将使用静态分配。 如果睡眠,则notify
还需要安排主循环。 队列本身也将需要一些全局状态(“ list head + tail”)。 如果需要不同的队列,也可以在NotifyHandle
存储对其的引用(例如,在id: usize
参数中)。 ThreadPool
可能给出了一些实现方法(或tokio-threadpool
板条箱)。 NotifyHandle
存储到应该在超时时唤醒的任务,并应提供某种状态来跟踪是否达到了超时状态,并且事件循环需要一个活动(指向)计时器的列表来确定等待时间。 ( tokio-timer
板条箱可能会给您一些实现方法的想法) select
(或它的特定于平台的优化版本),在内核中,您可能必须找到其他方法:)(在tokio
世界中,这是由Reactor
提供的,它基于mio
) poll_future_notify
的任务 在期货0.2 NotifyHandle
成为Waker
,并UnsafeNotify
成为UnsafeWake
; id: usize
上下文已消失(只需将结构与实现UnsafeWake
所需的所有数据UnsafeWake
使用)。 而不是存储的Spawn<...>
为将来你需要手动存储LocalMap
为每一个任务,然后将其用于创建一个Context
与Context::without_spawn
,然后将其传递给Future::poll
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.