組み込みRustのRTOS vs C言語のRTOS:結局どっちを使うべき?
Embedded Rust RTOS vs. C RTOS
Embedded Rust RTOS vs. C RTOS
組み込み開発の現場で最近よく議論される「Rust RTOS」と「従来のC言語RTOS」の比較についてまとめました。メモリ安全性や開発効率、エコシステムの違いなど、実務で気になるポイントを整理しています。
くそっ、コンパイラに仕事が奪われちまうぞ!!!
これ、CPU負荷がかなり軽い状態での話だね。だからプリエンプションのない非同期アプローチでもうまくいく。計算負荷が高くなれば、そうはいかないはず。オシロスコープで測定すべき有益な数値は、最悪のケースの割り込みレイテンシだ。ハードリアルタイムの制約がある場合はこれが重要になる。彼らは標準偏差を測定しているけど、最悪のケースは測っていない。一般的なテスト設定としては、入力信号(通常は方形波)を入力ピンに入れて、割り込みが禁止されていなければ割り込みが発生し、タスクが開始され、タスクが出力ピンをオンにする。入力から出力までの遅延をオシロスコープで見て、外れ値を探すんだ。完全にRun-to-completionで実行している場合、外れ値は最長の計算タスクによって決まってしまう。計算タスクがある場合、これが問題になる。歴史的にQNXが優れているのはここだね。割り込みが処理されてスレッドがスケジュールされる。割り込みレベルで起こるのはほぼスレッドの起動だけで、スレッドが出力ピンをオンにする。オシロスコープでスケジューリングの外れ値をチェックできる。ベストケースのレイテンシは割り込みレベルで処理するより高くなるけど、ワーストケースのレイテンシは一定だ。たとえ優先度の低いスレッドが計算集中型であってもね。これがリアルタイムと「ニアリアルタイム」なスケジューリングの違いだよ。
(2022年)
タイトルを変えるべき。Async RustとRTOSは別物だよ。RTOSはプリエンプティブなマルチスレッドだけど、asyncはyieldポイントを使った協調的なものだから。たぶん「組み込みAsync Rust vs C RTOS」くらいが適切だね。
Webの世界ではasync/awaitがスレッドに勝利した
ちょっと話がそれるけど、Webはそもそもスレッドをサポートしてなかった(今でもWorker間はメッセージパッシングしかない)から、asyncが勝ったって言うのは少し空虚な気がするな。
この記事、もう5年近く前になるのか。組み込みRust界隈だとかなり古いな。全体的な状況はそれほど変わっていないと思うけど、細部をそのまま鵜呑みにするのは注意したほうがいいよ。