組み込み向けリアルタイムOSの基礎知識 ―― プログラムの実行およびコンピュータ資源を管理するOSの種類や機能を整理する
6.リアルタイムOSの理解に欠かせないタスク
リアルタイムOSについて理解するためには,タスクやスケジューリングをはじめとするさまざまな知識が必要となります.ここでは,μITRON4.0仕様を例に,リアルタイムOSが持つ機能の中で最も基本的な機能であるタスク管理機能に絞って説明します.
● ある機能の実行単位であり優先順位がある
μITRON4.0仕様を見ると,タスクとはプログラムの並行実行の単位と定義されています.つまり,それぞれのタスクはシステム内で並行的に実行されているかのように振る舞います.一方,それぞれのタスク処理は逐次的に実行されます(図7).
図7 タスクとは
タスクとは並行実行の単位であり,OSによって並行的に実行しているように扱われる.各タスク処理は逐次的に実行される.
タスクは状態や優先度といったパラメータを持ち,それらはOSによって管理されます.タスクには実行状態,実行可能状態,待ち状態,休止状態などがあり,状態に応じて動作が決まります(図8).優先度は数値であり,μITRON仕様では小さいほど高い優先度を示します.高い優先度を持つタスクは高い実行の優先順位を持ち,優先度の低いタスクよりも必ず先に実行されます注17.
図8 タスクの状態 タスクは状態を持つ.OSはタスクの状態を管理し,実行可能状態に移行したタスクの中で最も優先順位の高い処理を実行する.また,タスクは何らかの事象を待つための待ち状態を持つ.待ち状態のタスクは実行されない.μITRON仕様ではこのほか強制待ち状態なども存在するが,簡単のため省略した.
注17;優先度と優先順位が意識的に使い分けられていることに注意.優先度はタスクのパラメータであり,優先順位はOSにより実行されるタスクの順番を示す.
μITRON仕様は主にC言語による記述を前提としており注18,タスクで行う処理は主にC言語の関数として作成します(図9).タスクの大きさについて特に制限はありません.
図9 タスクの記述形式
タスクは関数として記述する. 関数名や引き数の名称はC言語規格およびμITRON仕様の範囲で適当な名称を付けられる.
注18;アセンブラ言語など,ほかの言語もできないわけではない.おそらく通常はC言語を使うと思われる.
関数をタスクで行う処理としてOSに登録して,OSに呼び出してもらうためには,OS側で用意された手続きに沿う必要があります.μITRON4.0仕様ではコンフィグレーションと呼ばれます.図10および図11に一つのソフトウェア開発手順とコンフィグレーション結果の例を示します.コンフィグレーションによってOSがタスクを管理できるようになります.
図10 OSを利用したソフトウェアの開発手順
アプリケーションおよびOSなどのプログラムをコンパイルし,最後にすべてのオブジェクト・ファイルをリンクして一つの実行プログラムを作成する.OSの管理情報に相当するC言語ファイルはコンフィグレーションにより生成する.
図11 コンフィグレーションによるC言語データの生成
TOPPERS/JSPカーネルによる例.μITRON4.0で規定される静的APIを使ってタスク定義を記述しコンフィグレーションを行うことで,タスクなどOSの管理対象の構成情報をC言語形式で出力させている.
● スケジューリングができる
μITRON仕様では優先度ベース・スケジューリング方式に従ってタスクのスケジューリングが行われます(図12).具体的には以下の方針に従います.
図12 OSによるタスクの実行管理
タスクの実行順序は優先度と起動順序により決定される.通常,レディ・キューと呼ばれる待ち行列をもち,それに基づいて順序を決定する.図の場合,最も優先度の高いタスクの中で最初に起動されたAから実行され,順次B→Cと実行される.
- 実行できるタスク注19が複数ある場合,その中で最も優先順位の高いタスクが実行状態となり,残りは実行可能状態となる
- タスクの優先順位は優先度が異なる場合,優先度の高いタスクの方が優先順位が高く,優先度の同じタスクの間では,先に実行できる状態になったタスクの方が優先順位が高い注20.
注19;実行可能状態と実行状態を合わせて実行できる状態と呼ばれる.実行できるタスクとは実行状態および実行可能状態のタスクのことをいう.
注20;FCFS(First Come First Served)と呼ばれる.
OSはスケジューリングのほか,タスクの状態を変化させる機能を持ちます(表1).タスクの状態変化は処理が開始したり停止したりするなど,タスクの実行に影響を与えます.OSはタスクの状態を変化させたタイミングでスケジューリングが必要かどうかを判断し,必要ならスケジューリングを行います,注21.
act_tsk, iact_tsk | 休止状態 → 実行可能状態 |
ext_tsk | 実行状態 → 休止状態 |
ter_tsk | {実行可能 or 待ち or 強制待ち}状態→ 休止状態 |
slp_tsk, tslp_tsk, dly_tsk | 実行状態 → 待ち状態 |
wup_tsk, iwup_tsk, rel_wai, irel_wai | 待ち状態の解除 |
sus_tsk | (ある特定の状態) → 強制待ち状態 |
rsm_tsk | 強制待ち状態の解除 |
chg_pri, get_pri | 優先度の変更/優先度の参照 |
can_act, can_wup | 要求のキャンセル |
表1 μITRON4.0仕様のタスク管理機能
注21;この場合のように,スケジューリングを行う条件が整ったときに即座にスケジューリングが実施されることをプリエンプティブ(preemptive)であると言う.