我正在尝试在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库中导入了一些东西。
是否有可能解决这个问题?
答案 0 :(得分:2)
据我所知,你不。 Tokio Reactor 0.1.1 imports many things from the standard library,其中没有一个是有条件的。
大多数导入可能会切换到libcore
替代品,但Arc
需要内存分配,它位于alloc
箱中。
作为支持no_std
的套餐的示例,请查看Futures 0.1.20。这有一个功能标志,可以选择加入需要标准库的功能。
如果您希望这样做,您需要为Tokio及其所有依赖项贡献大量精力,以添加功能标记以选择加入需要标准库的所有功能。值得与维护人员讨论协调此类工作的问题。
答案 1 :(得分:2)
扩展Shepmaster已经说过的内容:你不想要tokio
;它基于mio
,它不太可能在内核中工作,特别是没有堆分配/ std。
那么如何在这样的环境中驱动任务(产生Future
)(这是为futures
0.1.x系列编写的):
Spawn<...>
中包含的Future
。应该可以使用&#34;静态&#34;为此分配了存储空间。UnsafeNotify
(和基本特征Notify
),可能是对任务的原始指针/ &'static
引用(包括状态); notify
需要能够以线程安全的方式对任务进行排队以进行轮询。 {clone,drop}_{raw,id}
函数可以为空,因为您无论如何都要使用静态分配。如果主循环正在休眠,notify
还需要安排主循环。队列本身也需要一些全局状态(&#34; list head + tail&#34;);如果您需要不同的队列,您也可以在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
所需的所有数据的结构)。您不必为将来存储Spawn<...>
,而是需要为每项任务手动存储LocalMap
,然后将其用于创建Context
Context::without_spawn
,然后传递到Future::poll
。