第13章 スケジューリング機能
本章では,RI850V4が提供しているスケジューリング機能について解説しています。
RI850V4におけるスケジューリング機能では,動的に変化していくタスクの状態を直接参照することにより,タスクの実行順序を管理/決定し,最適なタスクにCPUの利用権を与える機能を提供しています。
RI850V4では,スケジューラの駆動方式として何らかの事象(きっかけ)が発生した際に起動する“
事象駆動方式”を採用しています。
RI850V4における事象駆動方式では,以下に示した事象が発生した場合にスケジューラを起動し,タスクのスケジューリング処理を実行します。
- タスクの状態遷移を引き起こす可能性があるサービス・コールの発行
- 非タスク(周期ハンドラ,割り込みハンドラなど)からの復帰命令の発行
- 時間管理を行う際に使用している基本クロック用タイマ割り込みの発生
RI850V4では,タスクのスケジューリング方式として各タスクに定義されている優先度を利用した“
優先度方式”,およびRI850V4のスケジューリング対象となってからの経過時間を利用した“
FCFS方式”を採用しています。
RI850V4における優先度方式では,実行可能な状態(RUNNING状態,またはREADY状態)にある全タスクの中から“最も高い優先度を持つタスク”を選び出し,CPUの利用権を与えます。
RI850V4におけるFCFS方式(First Come First Served方式)では,実行可能な状態(READY状態)へと遷移してから“最も時間が経過しているタスク”を選び出し,CPUの利用権を与えます。
ただし,FCFS方式によるタスクのスケジューリングは,優先度方式による選び出し基準である“最も高い優先度を持つタスク”が複数存在した場合に限り実行されます。
RI850V4では,タスクのスケジューリング方式を実現する手段として“レディ・キュー”を提供しています。
なお,RI850V4におけるレディ・キューは,優先度をキーとしたハッシュ・テーブルであり,実行可能な状態(RUNNING状態,またはREADY状態)へと遷移したタスクの管理ブロック(タスク管理ブロック)がFIFO順でキューイングされます。このため,スケジューラは,起動された際にレディ・キューの優先度高位から検出処理を実行し,キューイングされているタスクを検出した場合には,該当優先度の先頭タスクにCPUの利用権を与えることにより,RI850V4のスケジューリング方式(優先度方式,FCFS方式)を実現しています。
以下に,複数のタスクがレディ・キューにキューイングされている場合を示します。
図13−1 スケジューリング方式(優先度方式,FCFS方式)の実現
- レディ・キューの生成
RI850V4では,レディ・キューの静的な生成のみサポートしています。処理プログラムからサービス・コールを発行して動的に生成することはできません。
レディ・キューの静的生成とは,システム・コンフィギュレーション・ファイルでシステム情報“MAX_PRI”を使用して最大タスク優先度を定義することをいいます。
システム情報“MAX_PRI”の詳細は,「
17.4.2 基本情報」を参照してください。
RI850V4では,処理プログラムからスケジューラの状態を明示的に操作し,ディスパッチ処理を禁止/許可する機能(スケジューリングのロック機能)を提供しています。
以下に,スケジューリングのロック機能を利用した際の処理の流れを示します。
なお,スケジューリングのロック機能は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。
RI850V4では,さまざまな実行環境に対応するために,スケジューリング機能のうち,RI850V4が処理を実行するうえで必要となるハードウエア依存処理(
アイドル・ルーチン)をユーザ・オウン・コーディング部として切り出しています。
これにより,さまざまな実行環境への移植性を向上させるとともに,カスタマイズ化を容易なものとしています。
アイドル・ルーチンは,CPUが提供しているスタンバイ機能を有効活用(低消費電力システムの実現)するためにユーザ・オウン・コーディング部として切り出されたアイドル処理専用ルーチンであり,RI850V4のスケジューリング対象となるタスク(RUNNING状態,またはREADY状態のタスク)がシステム内に1つも存在しなくなった際にスケジューラから呼び出されます。
なお,RI850V4では,アイドル・ルーチンを管理するに当たり,アイドル・ルーチンと一対一に対応した管理オブジェクト(アイドル・ルーチン管理ブロック)を用いることにより,アイドル・ルーチンが取り得る状態の管理,およびアイドル・ルーチン自体の管理を行っています。
- アイドル・ルーチンの基本型
アイドル・ルーチンを記述する場合,引き数を持たないvoid型の関数として記述します。
以下に,アイドル・ルーチンをC言語で記述する場合の基本型を示します。
#include <kernel.h> /*標準ヘッダ・ファイルの定義*/
void
idlrtn ( void )
{
............
............
return; /*アイドル・ルーチンの終了*/
}
|
- アイドル・ルーチン内での処理
RI850V4では,スケジューラからアイドル・ルーチンに制御を移す際,独自のアイドル前処理を行っています。また,アイドル・ルーチンからスケジューラに制御を戻す際にも,独自のアイドル後処理を行っています。このため,アイドル・ルーチンを記述する際には,以下に示す注意点があります。
- 記述方法
C言語,またはアセンブリ言語で記述します。
C言語で記述するときは通常の関数と同様に記述することができます。
アセンブリ言語で記述するときは使用するコンパイラの呼び出し規約にのっとって作成してください。
- スタックの切り替え
RI850V4では,アイドル・ルーチンに制御を移す際,
基本情報において指定されたシステム・スタックへの切り替え処理を行っています。したがって,アイドル・ルーチン内でスタックの切り替えに関する記述を行う必要がありません。
- サービス・コールの発行
RI850V4では,アイドル・ルーチン内でサービス・コールの発行を制限(禁止)しています。
- EIレベル・マスカブル割り込みの受け付け状態
RI850V4では,アイドル・ルーチンに制御を移す際,
EIレベル・マスカブル割り込みの受け付け許可処理として,プライオリティ・マスク・レジスタPMRのPM
nビットに対する操作
,およびプログラム・ステータス・ワードPSWのIDビットに対する操作
を行います。
なお,操作対象となるPM
nビットは,コンフィギュレーション時に
最大割り込み優先度maxintpriで定義した割り込み優先度範囲となります。
備考 通常,アイドル・ルーチンからの復帰(他の処理プログラムへの移行)は,待ち時間の経過,EIレベル・マスカブル割り込みの発生が継起となるため,アイドル・ルーチン内でDI命令を発行することは抑制してください。
RI850V4では,アイドル・ルーチンの静的な登録のみサポートしています。処理プログラムからサービス・コールを発行して動的に登録することはできません。
アイドル・ルーチンの静的登録とは,システム・コンフィギュレーション・ファイルで静的API“VATT_IDL”を使用してアイドル・ルーチンを定義することをいいます。
備考
アイドル・ルーチン情報が未定義の場合には,コンフィギュレーション時にデフォルト・アイドル・ルーチン(関数名:_kernel_default_idlrtn)の登録処理を行っています。
なお,デフォルト・アイドル・ルーチンでは,HALT命令の発行が行われます。
RI850V4では,非タスク(周期ハンドラ,割り込みハンドラなど)内の処理を高速に終了させる目的から,非タスク内の処理が完了するまでの間,スケジューラの起動を遅延しています。したがって,非タスク内でディスパッチ処理(タスクのスケジューリング処理)を伴うサービス・コール(
isig_sem,
iset_flgなど)が発行された際には,キュー操作などといった処理が行われるだけであり,実際のディスパッチ処理の実行は“非タスクからの復帰命令(return命令の発行)”が発行されるまで遅延され,一括して行うようにしています。
以下に,非タスク内でディスパッチ処理を伴うサービス・コールを発行した際の処理の流れを示します。
図13−3 非タスク内におけるスケジューリング処理