今回は,組込みリアルタイムの基礎の応用編として,第二区分の例題を取り上げます。1つめは,組込みリアルタイムシステムで利用されるスケジューリングに関する問題,2つめは,組込み開発で必要な,基本的な電子回路に関する問題です。

例題1 テーマ:タスクのスケジューリング

【問題】
今,組込み機器上に,例えば,以下のように,read_event() で外部からのイベントを待ち,得られたイベントに応じた処理を process_event() で実行するという処理を無限ループで繰り返すタスクが,3つある(タスクA,タスクB,タスクC)とする。


    task()
    {
        EVENT ev;
        while (1) {
          read_event(&ev);  /* 外部イベントを待ち,取得する */
          process_event(ev);  /* 外部イベントを処理する */
        }
    }

■機器X
機器Xは,リアルタイムカーネルで実装されており,各タスクは,イベントベースの優先度付きのスケジューリングが適用されている。優先度の低いタスクが実行状態のときに,外部イベント入力によって優先度の高いタスクが実行可能状態になると,処理は,優先度の高いタスクが横取りするプリエンプティブスケジューリングで行われる。現在,タスクA,B,Cが,優先度の低い順番でA,B,Cであるとする。

例えば,ここで,タスクA,B,Cが起動されてから,0.1秒目に,0.3秒間で処理される外部イベントがタスクAに来たあと,0.2秒目に0.1秒間で処理される外部イベントがタスクBに来たときのスケジューリングは図1の通りである。

図1●スケジューリング
図1●スケジューリング

■機器Y
機器Yは,リアルタイムカーネルではなくラウンドロビンスケジューリングによるタスクスケジューラが適用されている。機器Yでは,各タスクを0.1秒単位で切り替えて,順番に処理を実行する。現在タスクA,B,Cは,この順番で0.1秒毎にCPU時間を割り当てられている。

例えば,ここで,タスクA,B,Cが起動されてから,0.1秒目に,0.3秒間で処理される外部イベントがタスクAに来たあと,0.2秒目に0.1秒間で処理される外部イベントがタスクBに来たときのスケジューリングは図2の通りである。

図2●スケジューリング●
図2●スケジューリング

以上の通りに設定されたこれらの機器XとYに対して,図3の通りに外部イベント列が入力されたときに,どのように処理が進むかを考え,設問ア~ウに答えよ。

図3●各タスクへのイベントの入力の様子
図3●各タスクへのイベントの入力の様子

【設問ア】
機器Xで,タスクA,B,Cの中で最初に処理が終了するタスクはどれか。正しいものを選択肢の中から一つ選べ。

【選択肢】
 1. タスクA
 2. タスクB
 3. タスクC
 4. タスクBとタスクCが同時に処理を終了する

【設問イ】
機器Yで,タスクA,B,Cの中で最初に処理が終了するタスクはどれか。正しいものを選択肢の中から一つ選べ。

【選択肢】
 1. タスクA
 2. タスクB
 3. タスクC
 4. タスクBとタスクCが同時に処理を終了する

【設問ウ】
機器X,Yを同時に実行させ,同じタイミングで,外部イベントを入力したとき,機器X,Yの中で,最後に処理が終了するタスクはどれか。正しいものを選択肢の中から一つ選べ。

【選択肢】
 1. 機器X上のタスクA
 2. 機器X上のタスクB
 3. 機器X上のタスクC
 4. 機器Y上のタスクA
 5. 機器Y上のタスクB
 6. 機器Y上のタスクC

【正解】
 設問ア(マウスでドラッグして文字を反転させてください)= 3
 設問イ(マウスでドラッグして文字を反転させてください)= 2
 設問ウ(マウスでドラッグして文字を反転させてください)= 4