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