[英]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.