2025/09/30 21:29 Pre-Emptive Multi-Tasking on Arm Cortex-M

やあ、ロボ子!今日は組み込みソフトウェアの話をするのじゃ。

博士、こんにちは。組み込みソフトウェア、興味深いです!

今日はRustでRTOS(リアルタイムOS)を自作する、というちょっとマニアックな話題なのじゃ。CからRustへの移行を考えている人には特に役立つ情報みたいだぞ。

RTOSですか。名前は聞いたことがありますが、具体的にはよく知りません。

RTOSは、タスクに優先度をつけて、決められた時間内に処理が終わるように保証するOSのことじゃ。たとえば、車のブレーキ制御とか、工場のロボット制御とか、そういうリアルタイム性が重要なシステムで使われるのじゃ。

なるほど。それで、RustでRTOSを自作するというのは、どういうことでしょうか?

記事によると、既存のC言語で書かれたRTOS上でRustコードを実行する方法と、Rustで完全に記述されたRTOSを使う方法があるみたいじゃな。既存のRTOSだと、Amazon FreeRTOSとか、Zephyrとかがあるみたいじゃ。

RustはCと互換性があるから、既存のRTOSでもRustが使えるんですね。

そうそう。Rustでタスクを書いて、CのRTOS上で動かすことができるのじゃ。でも、せっかくRustを使うなら、Rustで書かれたRTOSも試してみたいところじゃな。embassyとか、RTICとかがあるみたいじゃ。

Rust製のRTOSですか。それは面白そうですね。

記事には、Arm Cortex-Mプロセッサ向けのRTOSを自作する方法も書いてあるぞ。Arm Cortex-Mは、RTOSを簡単に書けるように設計されているらしいのじゃ。

具体的には、どうやって作るんですか?

まず、タスクごとにスタックを用意して、初期状態をスタックにプッシュするのじゃ。それから、PendSVというのを使って、タスクを切り替えるらしいぞ。

PendSV…初めて聞きました。

PendSVは、割り込み処理の一種で、タスク切り替えのために用意されたものなのじゃ。これを使うと、タスクの切り替えがスムーズにできるのじゃ。

なるほど。タスクの切り替えには、スケジューラも必要ですよね?

その通り!スケジューラは、どのタスクを次に実行するかを決める役割があるのじゃ。タスクの優先順位とか、実行時間とかを考慮して、最適なタスクを選ぶのじゃ。

この記事によると、プリエンプティブなタスク切り替えスケジューラを記述するには、300行程度のRustとアセンブリコードが必要みたいですね。

そうみたいじゃな。意外と少ない行数で実現できるのじゃ。Armv7-MのSysTick、PendSV、PSP関数が、RTOSを作るために調整されているからじゃな。

へえ、すごいですね。

ロボ子もRTOS作ってみる?

私にはまだ難しいです。でも、いつか挑戦してみたいです!

いい心がけじゃ!そういえば、RTOSって、Real Time Operating Systemの略だけど、ロボ子の場合は、Real Time Operating Robot System…ってことじゃな!

博士、それはちょっと無理があります…!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。