RTOSでもっとも基本的なものがタスクです。がタスクの無いアプリケーションも可能です。非タスク部(割り込みハンドラなど)だけで動くシステムを構築することももちろん可能です。割り込みハンドラというのも割り込み要因というイベントが発生した時のみ起動されるタスクと考えられなくも無いからです。ですが多くの場合はタスクを生成してそれを制御することがRTOSの領発揮させることになります。
タスクとはプログラムの実行単位です。HOSはマルチタスクシステムですから複数のタスクが同時に存在できます。といっても実際MPUは1つですからこれらのタスクが特定の条件によって切り替わりながら実行されていきます。
タスクの持っている情報は主に以下の通りです(HOSの場合)。
タスクはタスクIDによって一意に識別されます。ITRONの場合タスクIDは生成時にプログラマが指定します。HOSではコンフィギュレーターに自動的にIDを生成させることもがきます。Windowsなどのように生成時にハンドルが返されるようにはなっておらずプログラマ側でユニークな番号を管理しなければならないのでそちらに慣れている人は注意が必要かもしれません。
タスクには優先度があり、優先度の高いタスクから順に実行されます。この場合のタスク優先度は絶対的なものであり、実行可能状態の優先度の高いタスクがある限り優先度の低いタスクは実行されません。WindowsやUNIXなどのTSSシステムのように優先度どの高いものが優先的にCPU時間をもらえるといった程度のものではないので注意が必要です。
また優先度が同じ場合はラウンドロビン方式でスケジューリングされますが、待ち状態に入るなどの要因で実行をOSに返すか、rot_rdq などで故意にレディーキューを回転させない限りタスクディスパッチは起こりません。
タスク状態はいくつかあり、システムコールを呼び出すことにより状態を遷移していきます。
もっとも分かりやすいのがこの実行状態でしょうか。すなわちタスクがCPUを占有して実行されている状態です。極端な話シングルタスクではこの状態しかないわけです(厳密には違うんでしょうけど)。ただ、気をつけなければいけないのは非タスク部(割り込みハンドラ)を実行しているときです。非タスク部はタスクではないため、非タスク部実行中でもその前に実行されていたタスクは実行状態として認識されます。
これはいつでも実行できるにもかかわらず、CPUが割り当てられていない状態です。主に自分より優先度の高いタスクが実行中と言う場合この状態になります。ITRONはTSS(タイムシェアリングシステム)ではありませんので基本的に優先度の高いタスクが実行可能状態で低い優先度のタスクが実行されることはありません(ディスパッチを禁止した場合に例外があります)。
タスクが何らかの条件が満たされるまで自ら休止している状態です。待ち条件はいろいろありますが、他のタスクが起こしてくれる(wup_tsk)まで待つ(slp_tsk)、一定時間待つ(dly_tsk)、セマフォ待ち(wai_sem)、イベントフラグ待ち(wai_flg)、メイルボックス待ち(rcv_msg)、メモリプール待ち(get_blf)などがあります。いずれも待ち条件が満たされるか待ち状態の解除(rel_wai)によって、実行可能状態に移ります(実行中のタスクより待ちが解除されたタスクのほうが優先度が高ければ即座にディスパッチが起こり実行されます)。
他のタスクによって一時的に実行を禁止(sus_tsk)されたのがSUSPEND状態です。他のタスクから強制待ちを解除(rsm_tsk)されるまでそのタスクは実行されません。サスペンド状態はネスト可能で、sus_tskされた回数だけ rsm_tsk されないと実行可能状態に戻りません。
WAIT状態のときに、強制待ち(sus_tsk)がかかったときにこの状態になります。rsm_tskによってSUSPENDのネストがすべて解除されるとWAIT状態に戻ります。またSUSPENDが解除される前にWAIT条件が揃うと、SUSPEND状態に移行します。
タスクが実行できない状態です。HOSの場合タスクは静的に生成されますので実行を開始した時点ですべてのタスクがDOMANT状態です。sta_tskによって実行可能状態となり、ext_tskやter_tskによって再び DOMANT状態に戻ります。