1. ファクシミリ(受信)のタスク分割と優先度割り当て
応用事例としてファクシミリの受信から印刷までのシステムを考えて見ましょう。
ファクシミリシステムは次のように2つのハンドラと3つのタスクに分割できます。
-
通信(受信)割込みハンドラ
データを受信した際に発生する割込みにより起動される割込みハンドラ。受信タスクを起床させる(iwup_tsk)。 -
印刷完了割込みハンドラ
印刷エンジン(ハードウェア)が印刷を終了した際に発生する割込みにより起動される割込みハンドラ。印刷タスクを起床させる(iwup_tsk)。 -
受信タスク
受信したデータをバッファに格納する。普段は起床待ち状態(slp_tsk)で、通信(受信)割込みハンドラから起床される。受信データをバッファに格納して復号化タスクに送る(snd_mbx)。データの受信は最優先で行わなければならないので、最も高いプライオリティを割り当てる。 -
印刷タスク
復号化されたイメージデータを印刷する。普段は復号化タスクから送られるメッセージ待ち状態(rcv_mbx)で、メッセージを受け取ると印刷処理を行う。イメージデータを印刷エンジン(ハードウェア)に送った後は、印刷完了まで起床待ち状態になる(slp_tsk)。印刷が完了したら次のイメージデータが送られてくるのを待つ。復号化タスクの処理結果を処理しなければならないので、復号化タスクより高いプライオリティを割り当てる。 -
復号化タスク
送られてきたデータを復号化する。普段は、通信(受信)タスクから送られるメッセージ待ち状態(rcv_mbx)で、メッセージを受け取ると、復号化処理を行う。復号化処理が完了したら、復号化したイメージデータを印刷タスクに送る(snd_mbx)。演算処理を行うだけなので、もっとも低いプライオリティを割り当てる。
2. メールボックスを使用したタスク間通信の例
この事例では下の図のように、2つのメールボックス(MBX1とMBX2)を使用します。
通信(受信)タスクは、受信したデータを受信バッファに格納し、復号化処理のために復号化タスクへメールボックスMBX1を使用してデータを送信します。
復号化タスクは、メールボックスMBX1を通じて受け取った受信データを復号化し、復号化バッファに格納します。
復号化タスクは、復号化したデータをメールボックスMBX2を使用して印刷タスクに送信します。
印刷タスクは、メールボックスMBX2を通じて受け取った復号化データ(イメージデータ)を印刷します。
メールボックス
マルチタスクで動作するタスク間でデータのやり取りを行うために、OSが提供する同期・通信機能。
予め必要数のメールボックス(郵便箱) を用意しておきます。送り手側のタスクがそこに投函する(snd_msgサービスコールを発行する)と、投函を待っている(rcv_msgサービスコールを発行した)タスクがいれば、OSはタスクを起床しそのタスクはデータを受け取ることができます。投函がなければ受け手のタスクは投函があるまで待ち状態にします。投函するデータが複数の場合にはデータ行列を作り、受け手が複数の場合には待ちタスク行列を作ります。
3. タスク実行遷移
タスクの実行の推移を示します。タスクの切り替えのタイミングをわかりやすくするために図中にサービスコールの発行の様子を付記しています。 各サービスコールの機能は以下のとおりです。
iwup_tsk:割込みハンドラからのタスク起床。起床するタスクを指定します。
slp_tsk:自タスクを起床待ちにします。iwup_tsk(割込みからの発行)またはwup_tsk(タスクからの発行)とペアで使われます。
snd_msg:メッセージを投函します。投函するメールボックスを指定します。
rcv_msg :メッセージ待ちにします。どのメールボックスへの投函を待つかを指定します。
4. メールボックスを使用したタスク間通信の例(2)
メールボックスを使用してデータの受け渡しを行っている場合、送られてくるデータのフォーマットさえ共通になっていれば、 前段の処理を意識することなく、メールボックスから受け取ったデータを処理することができます。
例えば、ファクシミリをマルチファンクションプリンタに拡張する場合を考えます。
ファクシミリのときは、FAX復号化タスクから印刷タスクにデータが送られるだけでしたが、ここにプリンタのデータ処理(PostScript変換処理) を行うタスクを作成し、ここから印刷タスクへメールボックスを通じて印刷データを送るような構成にします。これにより、印刷タスクの構成を変更することなく、プリンタ機能が追加できます。
プリンタの通信手段もLANであったり、USBであったりしますが、これらも、それぞれの受信タスクを作成し、メールボックスを通じてデータを PostScript変換タスクに送る構成にしておけば、PostScript変換タスクは通信手段を考慮する必要がなくなります。
5. ラウンドロビンの応用例
主に計算処理を行うタスクの場合、実行を始めるとCPUの使用権を放棄しないので、いつまでも実行状態となってしまい、他のタスクが実行できなくなる場合があります。 例えば、前出のマルチファンクションプリンタの構成をとった場合、FAX復号化タスクが実行されている間、PostScript変換タスクは動作できなくなります。 (この2つのタスクは同一プライオリティとする)
以下にタスクの処理例を示します。
FAXデコードタスクが一度メールボックスMBX1からメッセージを受け取ると、MBX1にメッセージ(FAX受信データ)がある限り、FAX復号化タスクが動作し続けます(RUNNING状態)。 このとき、プリンタデータがメールボックスMBX3に送られてきても、PostScript変換タスクは動作することができません。 そこで、適当なタイミングでrot_rdqサービスコールにより、レディキューの回転を行い、実行タスクの入れ替えを行います。 これにより、RUNNING状態のタスクが入れ替わり、PostScript変換タスクが動作します。