簡體   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