ディスパッチとはプロセッサが実行するタスクを切り替えることであり、T-Kernel仕様書では以下のように定義している。
(2) ディスパッチとディスパッチャ
プロセッサが実行するタスクを切り替えることを「ディスパッチ」(または「タスクディスパッチ」)と呼ぶ。
また、ディスパッチを実現するカーネル内の機構を「ディスパッチャ」(または「タスクディスパッチャ」)と呼ぶ。
「T-Kernel仕様書 Ver.1.00.00」 TEF020-S001-01.00.00/ja (P.16)より
|
マルチタスクのシステムにおいてプログラムを作成する場合、
ディスパッチが発生するタイミングを正確に把握しておかなければならない。
ディスパッチはシステムコールの発行やタイムアウトなどによって発生するが、
システムコールの発行では必ずしもディスパッチが発生するとは限らない。
発行するシステムコールがどのような動作を行うかを理解し、
ディスパッチの有無を考慮したうえでプログラムする必要がある。
本例題では、各システムコールにおいてディスパッチが発生するか否かを個別に検討して、
解答すればよい。
選択肢1のtk_cre_flg()はイベントフラグを生成するシステムコールである。
イベントフラグの生成により新たに待ち状態になるタスクや、
待ち状態の解除されるタスクはない。
そのため、
tk_cre_flg()でディスパッチが起こることはない。
選択肢2のtk_del_flg()はイベントフラグを削除するシステムコールである。
イベントフラグXが削除される時に、
そのイベントフラグXで条件成立を待っていたタスクAが存在した場合には、
タスクAにE_DLT(待ちオブジェクトが削除された)のエラーを返した上で、タスクAの待ち状態を解除する。
この時、
待ち解除となったタスクAのタスク優先度がtk_del_flgを発行したタスクBのタスク優先度よりも高ければ、
タスクAが待ち状態から実行状態、タスクBが実行状態から実行可能状態となって、ディスパッチが起こる。
この様子を図1に示す。

図1 tk_del_flgによりディスパッチが起こる例
選択肢3のtk_set_flg()はイベントフラグをセットするシステムコールである。
イベントフラグXで条件成立を待っていたタスクAが存在し、
イベントフラグのセットにより待ち解除の条件が満たされた場合には、
タスクAにE_OK(正常終了)を返した上で、タスクAの待ち状態を解除する。
これは、イベントフラグ本来のタスク間同期機能である。
この時、選択肢2と同様に、
待ち解除となったタスクAのタスク優先度がtk_set_flgを発行したタスクBのタスク優先度よりも高ければ、
タスクAが待ち状態から実行状態、タスクBが実行状態から実行可能状態となって、ディスパッチが起こる。
この様子を図2に示す。

図2 tk_set_flgによりディスパッチが起こる例
選択肢4のtk_clr_flg()はイベントフラグをクリアするシステムコールであり、
対象となるイベントフラグの一部のビットを1から0に設定(クリア)する。
イベントフラグを待つタスクの待ち解除の条件は、
指定したビットの全て(TWF_ANDWの場合)、
ビットのいずれか(TWF_ORWの場合)が1に設定(セット)されることであるので、
ビットをクリアする(1→0)ことによって新たに待ち解除の条件が満たされることはない。
したがって、tk_clr_flg()の実行によって新たに待ち状態の解除されるタスクはない。
もちろん、tk_clr_flg()の実行によって新たに待ち状態になるタスクもない。
結局、
tk_clr_flg()でディスパッチが起こる可能性はない。
なお、tk_clr_flg()でディスパッチが起こらないことは、仕様書にも以下の様に明記されている。
|
tk_clr_flgでは、対象イベントフラグを待っているタスクが待ち解除となることはない。
すなわち、ディスパッチは起らない。
「T-Kernel仕様書 Ver.1.00.00」 TEF020-S001-01.00.00/ja (P.94)より
|
本例題は、リアルタイムシステムの基本概念について確認する問題である。
リアルタイムシステムとは、定められた時刻(デッドライン)までに何らかの結果を出す必要があるような、時間に関する制約条件が要求されるシステムのことを言う。単純に高速な処理を行って即時応答するシステムという意味ではないので注意が必要である。
T-KernelやμITRONが利用されているような組込み機器であれば1ミリ秒や10ミリ秒のオーダーが利用されることが多いが、
処理によっては数秒や数十秒というオーダーでも構わない処理も存在する。
逆に、より高精度にするためにマイクロ秒のオーダーが必要となる場合もある。
これらの処理を必要に応じて組み合わせて時間的制約を満足するように実装されたシステムがリアルタイムシステムである。
なお、時間制約が守れなかった場合に、致命的な障害を引き起こすようなシステムを
ハードリアルタイムシステム、
時間制約が守られなくても致命的な障害にはならないようなシステムを
ソフトリアルタイムシステムと言う。
以上のことを踏まえて、各選択肢を確認する。
選択肢1
「即座に反応して高速で処理する」と定義しているが、時間制約に関しては全く触れていない。
前述の通り、リアルタイムシステムでは処理速度よりも時間制約が重要であるので、
選択肢1は誤りである。
選択肢2
前述の説明をまとめたものとなっているので、選択肢2は正しい。よって、
選択肢2が正解となる。
選択肢3
ラウンドロビンスケジューリングでは、タスクの時間を均等に割当てることになるので、一般に応答性が悪くなる。
このため、多くのリアルタイムシステムでは、
プリエンプティブな優先度ベース・スケジューリングを採用している。
すなわち、
選択肢3は誤りである。
なお、
優先度ベース・スケジューリングとは、実行可能な処理(タスク)の中で最も優先度の高いタスクを優先的に実行し、
優先度の高いタスクの実行が不要になるまでは、優先度の低いタスクは実行されないというスケジューリングのことを言う。
さらに、
プリエンプティブ(preemptive)とは
先取り(preempt)することができるという意味で、 優先度の低いタスクが実行途中に優先度の高いタスクが実行可能になると、 タスク切り替え(ディスパッチ)が発生して優先度の高いタスクが優先的に実行されることを言う(図3)。

図3 プリエンプティブな優先度ベース・スケジューリング
より優先度の高いタスクが実行可能になると、実行中のタスクがプリエンプトされて優先度の高いタスクが優先的に実行される。
- タスクC実行中に、より優先度の高いタスクBの待ち状態が解除されて実行可能になると、
タスクCは実行可能状態に移行し、タスクBが実行状態になる。
- タスクB実行中に、より優先度の高いタスクAの待ち状態が解除されて実行可能になると、
タスクBは実行可能状態に移行し、タスクAが実行状態になる。
- タスクAが待ち状態に移行すると、次に優先度の高いタスクBが実行状態になる。
- タスクAもタスクBも待ち状態に移行すると、タスクCが実行状態になる。
選択肢4
「最悪値は問われない。」となっているが、最悪値が分からないということは、
与えられたデッドラインまでにその処理が終わるかどうか判断できないということである。
リアルタイムシステムでは、定められたデッドラインまでに結果を出す必要があるので、
最悪値がどのくらいかということが重要となる。つまり、
選択肢4は誤りである。
μITRONにおいて下記のプログラムで周期ハンドラが4回目に起動するのは、どのタイミングか。
正しいものを、選択肢の中から一つ選べ。
なお、タイムティックの間隔は1msecとし、
(a)のタイミングで
cre_cyc サービスコールを発行したものとする。
また、サービスコールや
/* 略 */ で示されたタスク処理にかかる時間は
タイムティックの間隔より十分小さく無視できるものとする。
typedef struct t_ccyc {
VP exinf; /* Extended information */
ATR cycatr; /* Cycle handler attribute */
FP cychdr; /* Cycle handler address */
RELTIM cyctim; /* Cycle interval */
RELTIM cycphs; /* Cycle phase */
/* 上記以外のメンバの記載は省略 */
} T_CCYC;
void task(VP_INT exinf)
{
T_CCYC ccyc1;
ccyc1.cycatr = TA_STA | TA_PHS;
ccyc1.cychdr = cyclic1;
ccyc1.cyctim = 2;
ccyc1.cycphs = 1;
cre_cyc(ID_cyc1, &ccyc1);
/* 略 */
dly_tsk(1);
stp_cyc(ID_cyc1);
/* 略 */
dly_tsk(0);
sta_cyc(ID_cyc1);
/* 略 */
}
|
|
【正解3】[2]
※マウスでドラッグして文字を反転させてください。 |
本例題は、周期ハンドラ属性による周期ハンドラの動作の違いに関する知識を問う問題である。
プログラムを見ると周期ハンドラ属性
cycatr には
TA_STA | TA_PHS が設定されている。
TA_STA が指定されているので、
sta_cyc を発行しなくても、
cre_cyc の発行直後から周期ハンドラは動作を開始することになる。
また、
TA_PHS が指定されているので、周期ハンドラの動作を開始する時に、
周期ハンドラの起動位相を保存して、次に起動すべき時刻を決定する。
このため、周期ハンドラの起動タイミングは2ms、4ms、6ms、8ms、10ms、... となる。
μITRON4.0仕様書では、以下の図を用いて
TA_PHS について説明している。

図4 起動位相の保存
「μITRON4.0仕様書 Ver.4.03.00」 (P.242)より
|
さて、プログラムの途中で
stp_cyc と
sta_cyc が発行されているが、
stp_cyc によって動作停止となっているのは2ms〜3msの間だけであり、
周期ハンドラの起動には影響が無い。
この部分を図示すると図5のようになる。

図5 taskのタスク状態と周期ハンドラの動作状態
結果として、周期ハンドラが4回目に起動するのは8msとなるので、
選択肢2が正解である。
トロン技術者認定試験では、
T-KernelやμITRONを利用したシステムを開発できる実践的な能力を認定することを目的としています。
そこで、TRONSHOW2009では、組込みソフトウェア開発の基礎的な知識があれば解ける問題だけでなく、
T-Kernel仕様やμITRON仕様の詳細に関する知識を必要とする問題を掲載しました。
これらの問題と解説をよく確認して、
実践においてどのような知識が要求されているかを確認し、
トロン技術者認定試験の受験に役立てるようにしてください。
Copyright © 2008-2009 T-Engine Forum. All Rights Reserved..