組み込みOSの基本動作(★)

組み込みOSの基本動作を一言でいいますと、CPUのレジスタをタスクごとに切り替えるだけかと思います。

CPUはPC(プログラムカウンタ)、SP(スタックポインタ)、PSR(状態レジスタ)、汎用レジスタという状態を持っていますが、これをタスクごとに切り替えてあげれば、独立したプログラムとしてCPUで動作しているように振る舞います。

切り替えるタイミングは、割り込みが発生した時とOSシステムコールが呼ばれた時です。

切り替える規則は、優先順位に従って、切り替えてあげます。その切り替える時に、待ちの状態であった場合は、次に優先順位が高いものに切り替えます。

切り替えた時のCPUのレジスタの値は、それぞれのタスクが持つスタック上に退避しておきます。再度、そのタスクが実行できるようになったら、そこから取り出して、CPUのレジスタに復帰させます。

やっていることは簡単なのですが、CPUのレジスタ値を変更するため、C言語などの高級言語(?!)ではOSを書けません。必ずアセンブラレベルのコーディングが必要です。また、割り込みのマスクなどCPUの構造を知らないと作ることができません。そのため、少しハードルの高いソフトウェアになっています。


OSの状態

組み込みOSのタスクには、下記のようにREADY, RUNNING, WAITという3つの状態があります。
複数のタスクでCPUを取り合うため、動作中のタスク(RUNNING)、 実行待ちのタスク(READY)、資源待ちのタスク(WAIT)です。


OSの状態遷移シーケンス

OSの状態は下記のように変化していきます。変化するトリガは、システムコールか割り込みしかありません。RUNNINGとWAITの状態は、CPUで実行中か、何かを待っているかというのでわかりやすいのですが、READYの状態はちょっとわかりずらいです。
READYというのは実行できるが、他の優先度の高いタスクが動作している状態です。そのケースは、RUNNINGで実行中に割り込みが発生した場合だけ起こります。
タスクの状態の割合としては、さまざまなタスクが動作していて、CPUが1つしかないため、READY状態のタスクがほとんどになります。WAITは応答待ちのようなものだけですので、たまに移行するというものです。