繁体   English   中英

如何在#[no_std]环境中使用Tokio Reactor?

[英]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参数中)。
  • 您甚至可以尝试在同一个“轮询队列”上运行多个循环,祝您好运,使其具有线程安全性:) future-0.2 ThreadPool可能给出了一些实现方法(或tokio-threadpool板条箱)。
  • 您可能需要在事件循环中添加一些“计时器”处理; 计时器应将NotifyHandle存储到应该在超时时唤醒的任务,并应提供某种状态来跟踪是否达到了超时状态,并且事件循环需要一个活动(指向)计时器的列表来确定等待时间。 tokio-timer板条箱可能会给您一些实现方法的想法)
  • 异步IO的一些类似处理; 在用户空间中,您可以使用带有超时的select (或它的特定于平台的优化版本),在内核中,您可能必须找到其他方法:)(在tokio世界中,这是由Reactor提供的,它基于mio
  • 驱动您要使用poll_future_notify的任务

在期货0.2 NotifyHandle成为Waker ,并UnsafeNotify成为UnsafeWake ; id: usize上下文已消失(只需将结构与实现UnsafeWake所需的所有数据UnsafeWake使用)。 而不是存储的Spawn<...>为将来你需要手动存储LocalMap为每一个任务,然后将其用于创建一个ContextContext::without_spawn ,然后将其传递给Future::poll

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM