Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Rust で RTOSを考える
Search
Ryuji Fuchikami
October 24, 2021
Programming
0
150
Rust で RTOSを考える
TOPPERS開発者会議2021 (2021/10/24) の LT で発表させて頂いた資料です。
https://www.toppers.jp/devconf2021.html
Ryuji Fuchikami
October 24, 2021
Tweet
Share
More Decks by Ryuji Fuchikami
See All by Ryuji Fuchikami
Verilator + Rust + gRPC と Efinix の RISC-V でAIアクセラレータをAIで作ってる話 RTLを語る会(18) 2025/11/08
ryuz88
0
380
オリジナルの深層学習で HLS Challenge にチャレンジ
ryuz88
0
610
Zynq MP SoC で楽しむエッジコンピューティング ~RTLプログラミングのススメ~
ryuz88
0
2.2k
LUT-Network ~その後の話~
ryuz88
0
110
Verilatorやってみた! ~ OpenCVでテストベンチを書いてみた ~
ryuz88
0
160
Fast and Light-weight Binarized Neural Network Implemented in an FPGA using LUT-based Signal Processing and its Time-domain Extension for Multi-bit Processing
ryuz88
0
140
LUT-Network ~Edge環境でリアルタイムAIの可能性を探る~
ryuz88
0
68
LUT-Network ~本物のリアルタイムコンピューティングを目指して~
ryuz88
0
1.3k
Other Decks in Programming
See All in Programming
AIコーディングエージェント(skywork)
kondai24
0
130
【Streamlit x Snowflake】データ基盤からアプリ開発・AI活用まで、すべてをSnowflake内で実現
ayumu_yamaguchi
1
110
Level up your Gemini CLI - D&D Style!
palladius
1
180
『実践MLOps』から学ぶ DevOps for ML
nsakki55
2
560
開発に寄りそう自動テストの実現
goyoki
1
590
TVerのWeb内製化 - 開発スピードと品質を両立させるまでの道のり
techtver
PRO
3
1.4k
Full-Cycle Reactivity in Angular: SignalStore mit Signal Forms und Resources
manfredsteyer
PRO
0
100
Integrating WordPress and Symfony
alexandresalome
0
130
DSPy Meetup Tokyo #1 - はじめてのDSPy
masahiro_nishimi
1
150
Socio-Technical Evolution: Growing an Architecture and Its Organization for Fast Flow
cer
PRO
0
280
著者と進める!『AIと個人開発したくなったらまずCursorで要件定義だ!』
yasunacoffee
0
120
GeistFabrik and AI-augmented software development
adewale
PRO
0
270
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
76
5.2k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
253
22k
KATA
mclloyd
PRO
32
15k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.7k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.5k
Designing Experiences People Love
moore
142
24k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.1k
Become a Pro
speakerdeck
PRO
30
5.7k
Docker and Python
trallard
46
3.7k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
Build The Right Thing And Hit Your Dates
maggiecrowley
38
3k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
Transcript
Rust で RTOSを考える TOPPERS開発者会議2021 LT 2021/10/24 Ryuji Fuchikami @Ryuz88
自己紹介 (渕上竜司/Ryuji Fuchikami) • 平日は某企業で働くサラリーマン (以下、趣味の経歴のみ) • 1976年生まれ 全国転々としつつも結局、福岡が一番長く、今も福岡在住 •
1998~ μITRON仕様 Real-Time OS HOS-80 をリリース • 現在 HOS-V4a にて各種組み込みCPUに対応 (組み込みRustも実験中) (ARM,H8,SH,MIPS,x86,Z80,AM,V850,MicroBlaze, etc.) • 2008~ FPGA用ソフトコアSoC環境 Jelly をリリース(MIPS互換コア) • 現在 Zynq 上にて Real-Time GPU や LUT-Network の実験など 各種 Real-Time コア開発の実験場と化す • 2018~ LUT-Network用の環境 BinaryBrain を開発中 • 微分可能回路記述にてFPGA回路自体をそのまま深層学習 • 2021年現在、Rust勉強中 • リアルタイムコンピューティングを(趣味の範囲で)探求中 • 電脳メガネ計画(いつかやりたい電脳コイルの世界) • Real-Time 画像I/O (カメラ[IMX219] & OLED 1kfps駆動) • Real-Time GPU開発 (frame buffer無し、ゼロ遅延描画) • Real-Time DNN開発 (超低遅延DNN認識) 2 本日の発表は個人的見解であり、所属する組織とは関係ありません 娘に書いてもらいました
私の活動領域と環境 3 • アカデミックでもビジネスでもなく、ホビーとしてのOSS • 論文も書かなければ、特許も出さないという、無責任な立ち位置 • 産学連携や、各種商用RTOSのようには、ちゃんとしてないです。 m(_ _)m
• 今回を動機に勉強を始めたところなのでRustは初心者です。 • Xilinx社の ZynqMP という Cortex-A53(Linux)と Cortex-R5 と FPGA が1チップになった欲張りセットなエッジプロセッサでいろいろやってます。 今日はここでRustを やってみたお話 (ARM Cortex-R5) https://japan.xilinx.com/products/silicon-devices/soc/zynq-ultrascale-mpsoc.html
やってみたことと、やろうとしていること • ITRON(HOS)を移植して、その上でRust使ってみた • ITRONが動いてしまえば、Rustは予想以上に簡単に試せる • configurator が build.rs から呼べるのは素敵
• kernel_id.h をどうするかは課題 • なのでC使わずにRustでRTOSを作れないか検討中 • Rustの勉強に良い題材。 • C言語よりもいろいろ楽できそう。 • カーネルとアプリを跨いだ最適化が期待できそう • 「RustらしいRTOSの仕様ってどうあるべき?」で悩み中 4 あまりにあっさり動いて びっくり 悩みつつも「論よりRUN」で タスク切り替えと割り込みと タイムアウトまでお試し
過去のHOS実装 vs. RustらしいRTOSとは? 5
ID方式 vs. Rust • ITRONのオブジェクトはID管理、Rustだとどうするべき? • ID方式は所有権の概念が無い。Rustの恩恵にあずかれない • ちゃんとRustできれば E_IDとか、E_DLTとかそもそも不要なエラーもあるのでは?
• IDでないならそれに代わる、タスク/セマフォなどのオブジェクトを指すハンドルは 誰がいつ生成/削除する? • 誰がライフタイムを管理するのか? 全部 static? • どうやって利用者(タスク/割り込みハンドラ)にオブジェクトの利用権を渡す? 全部 static経由? • クロージャに束縛して渡すべきと思われるがテクニックが難しく、no_std で実現でき るのか不透明。 6
何でもTCBに追加 vs. Rustの trait • HOSはCでプリプロセッサマクロの乱用で無理やり少しカプセル化していた。 結局TCB生成しないとどの機能もテストできない。 • Rust ならうまくtrait切れば、優先度キューだけ、タイムアウトキューだけ、
といったテストをTCBと独立にやれる。(C++のclassより柔軟?) 7 至る所でプリプロセッサマクロのお化けでした.... Rust だと言語機能でカプセル化
最初から何でも装備 vs. crate機能拡張 • 昔はインターネットもなく、そこにあるものしか使えないのが普通だった • なのでITRON4.0 でいろんなAPIが定義されていたのは良かった • 内部的にはHOSもマイクロカーネルと同期オブジェクトのモジュール構造はあった
• Rust の場合、クラウドから欲しい機能が降ってくる • セマフォクレート、メールボックスクレート、みたいなのが後からどんどん自由に追加 出来るようにできないか? • うまくプリミティブな機能だけでシンプルなカーネルが定義できないか? • RTOSはある意味CPUやIRCに対する HAL (Hardware Abstraction Layer)ではないか? • 転じてカーネルに先立ってPAC(Peripheral Access Crate)書いておくと楽だと感じ ています。 8
Makefile vs. Cargo • 何をいまさらと言われそうですが • Cargo 環境はとっても便利です。 • 組込みRTOSはクロスコンパイルが基本、makefile時代は
• コンパイルする環境さまざま • コンパイラメーカーさまざま • コンパイラについてくる make ツールさまざま • 同じCPUに対しても各社がコンパイラ出してきて全部方言が違う • makefileだけでなく、アセンブラもリンカも方言だらけ • 全て同じようにビルドできるソースとビルドシステム作るのはとても困難 9 アーキテクチャに依存しないビルドシステムだけでRustの価値は計り知れない
RTOS故の悩み 10
思っていたほど既存のコレクションとかが使えない • 最悪実行時間(WCET)が見積もれなければならない • 実行時間の保証のないアルゴリズムはOSサービスコール内で使えない • 最大割り込み禁止時間観点で、途中で割り解除とかしたかったり • 公平性ではなく、デッドライン厳守のスケジューリングポリシーが必要 •
タスク優先度ベースのオブジェクトを跨いだ管理機構の入れ込み余地 • Priority inheritance protocol とか • Dynamic priority exchange server とか Rustには空間リソースの所有権はあるけど、時間リソース保証に関しては 自力で準備が必要? 11 Rustで楽できるかなと思っていたのですが...
所有権とライフタイム難しい • コンテキストを跨いだ所有権のやり取りが難しい • 初心者の私にはなかなかハードルが高い • 特に割り込みハンドラ • Deferred procedure
call やるときどうする? • HOSではパラメータシリアライズしてFIFOに投げ込んでいるが... • 遅延してる間にターゲットが削除されるとかありえるが Rust の思想と合 わない? • そもそも排他区間でロックしないので、その間の割り込みハンドラから見た 対象オブジェクトの状態が不確定。 • 排他区間を抜けるまで状態不確定なものに対してリクエストを投げると いうのがRust思想外かも? 12
まとめ 13
目指したい方向性 • ITRONの弱い標準化+Rust • Rustで書いたRTOSをITRONと言うつもりはさすがにないですが思想は大事。 • 思想だけ継承できないか • 「ITRON経験者 +
Rust知識 → 素早く意味がわかる」 を目指したい • Rustのモジュール階層は弱い標準化思想には相性が良さそう • 基本機能として似たようなものを提供しておけば、細かい固有機能は #[cfg(target_arch = XXX)] などで、場合分けして個別事情で実装しても、使う側としてそこまで困らないと思う。 14
今後のRustに望むことなど • static の初期化でもっと何でも許容してほしい • コンフィギュレーターのような静的初期化をいろいろやろうとすると「mutable references are not allowed
in statics」 となり許されていない。 • const fn の内での制約も同様。 • シンプルに未初期化の変数を許す方法が欲しいかも? • レジスタの退避は細かく制御できないか? • OS(アセンブラ)から呼ぶケースで壊してもいいものまで退避しちゃう。 • 割り込みハンドラだけは浮動小数点レジスタ使うときは自分で退避して欲しい (OS側で退避すると、使ってなかったら無駄な退避になる) • cargo run で組み込み環境への download&run できないか? • Makefileから cargo 呼ぼうかとも... • Macro 2.0 は楽しみ • 今のマクロでも出来ると思いますが、個人的には20年前に構造体メンバの詰 め込みソートががしたかったとかいろいろあって、マクロの拡充は楽しみです。 15
参考にさせて頂いた文献等 • 「Rustで始める自作組込みOS入門」 • https://techbookfest.org/product/6484983 722016768 • 「基礎から学ぶ 組込みRust」 •
https://www.c-r.com/book/detail/1403 • 「RTIC」 • https://rtic.rs/0.5/book/en/ 16
発表者アクセス先 • 渕上 竜司 (Ryuji Fuchikami) • e-mail :
[email protected]
• Web-Site : http://ryuz.my.coocan.jp/ • Blog. : http://ryuz.txt-nifty.com/ https://ryuz.hatenablog.com/ • GitHub : https://github.com/ryuz/ • Twitter : https://twitter.com/Ryuz88 • Facebook : https://www.facebook.com/ryuji.fuchikami • YouTube : https://www.youtube.com/user/nekoneko1024 17 本発表に関連するコードは下記で試行錯誤中です https://github.com/ryuz/rust_rtos お気軽にアクセスください
ご清聴ありがとうございました 18