第11章 スケジューリング機能
RI78V4では,タスクのスケジューリング方式として“各タスクに定義されている優先度”を利用した優先度方式,および,RI78V4のスケジューリング対象となってからの経過時間を利用したFCFS方式を採用しています。
そこで,RI78V4では,このような場合には,FCFS方式(First Come First Service方式)によるディスパッチ処理(タスクのスケジューリング処理)を実行し,実行可能な状態(READY状態)へと遷移してから“最も時間が経過しているタスク”を選び出し,CPUの利用権を与えます。
なお,RI78V4におけるレディ・キューは,優先度をキーとしたハッシュ・テーブルであり,実行可能な状態(RUNNING状態,またはREADY状態)へと遷移したタスクがFIFO順でキューイングされます。このため,スケジューラは,起動された際にレディ・キューの優先度高位から“タスクの検出処理”を実行し,キューイングされているタスクを検出した際には,該当優先度の先頭タスクにCPUの利用権を与えることにより,タスクのスケジューリング方式(優先度方式,FCFS方式)を実現しています。
- 静的な生成
レディ・キューの静的な生成は,システム・コンフィギュレーション・ファイルに優先度情報を定義することにより実現されます。
RI78V4では,カーネル初期化部において,情報ファイルに格納されているデータをもとにレディ・キューの生成処理を実行し,管理対象とします。
レディ・キューの静的な生成は,システム・コンフィギュレーション・ファイルに優先度情報を定義することにより実現されます。
RI78V4では,カーネル初期化部において,情報ファイルに格納されているデータをもとにレディ・キューの生成処理を実行し,管理対象とします。
- rot_rdq,irot_rdq
パラメータtskpriで指定された優先度に対応したレディ・キューの先頭タスクを最後尾につなぎかえ,タスクの実行順序を明示的に変更します。
以下に,本サービス・コールの記述例を示します。
パラメータtskpriで指定された優先度に対応したレディ・キューの先頭タスクを最後尾につなぎかえ,タスクの実行順序を明示的に変更します。
以下に,本サービス・コールの記述例を示します。
#include <kernel.h> /*標準ヘッダ・ファイルの定義*/ #include <kernel_id.h> /*システム情報ヘッダ・ファイルの定義*/ void func_cychdr ( void ) { PRI tskpri = 8; /*変数の宣言,初期化*/ ............ ............ irot_rdq ( tskpri ); /*レディ・キューの回転*/ ............ ............ return; /*周期ハンドラの終了*/ } |
備考1 本サービス・コールでは,回転要求のキューイングが行われません。このため,該当優先度に対応したレディ・キューにタスクが1つもキューイングされていなかった場合には,何も処理は行わず,エラーとしても扱いません。
#include <kernel.h> /*標準ヘッダ・ファイルの定義*/ #include <kernel_id.h> /*システム情報ヘッダ・ファイルの定義*/ void func_task ( VP_INT exinf ) { ID tskid = ID_tskA; /*変数の宣言,初期化*/ PRI tskpri = 9; /*変数の宣言,初期化*/ ............ ............ chg_pri ( tskid, tskpri ); /*優先度の変更*/ ............ ............ } |
備考 本サービス・コールを発行した際,対象タスクがRUNNING状態,またはREADY状態であった場合には,優先度の変更処理を実行したのち,パラメータtskpriで指定された優先度に対応したレディ・キューの最後尾にキューイングし直す処理もあわせて実行されます。
- dis_dsp
システム状態種別をディスパッチ禁止状態へと変更します。
これにより,本サービス・コールの発行からena_dspが発行されるまでの間,ディスパッチ処理(タスクのスケジューリング処理)が禁止されます。
なお,RI78V4では,本サービス・コールの発行からena_dspが発行されるまでの間に“ディスパッチ処理を伴うサービス・コール(chg_pri,sig_semなど)”が発行された場合には,キュー操作,カウンタ操作などといった処理を行うだけであり,実際のディスパッチ処理は,ena_dspが発行されるまで遅延され,一括して行うようにしています。
以下に,本サービス・コールの記述例を示します。
システム状態種別をディスパッチ禁止状態へと変更します。
これにより,本サービス・コールの発行からena_dspが発行されるまでの間,ディスパッチ処理(タスクのスケジューリング処理)が禁止されます。
なお,RI78V4では,本サービス・コールの発行からena_dspが発行されるまでの間に“ディスパッチ処理を伴うサービス・コール(chg_pri,sig_semなど)”が発行された場合には,キュー操作,カウンタ操作などといった処理を行うだけであり,実際のディスパッチ処理は,ena_dspが発行されるまで遅延され,一括して行うようにしています。
以下に,本サービス・コールの記述例を示します。
#include <kernel.h> /*標準ヘッダ・ファイルの定義*/ #include <kernel_id.h> /*システム情報ヘッダ・ファイルの定義*/ void func_task ( VP_INT exinf ) { ............ ............ dis_dsp ( ); /*ディスパッチ禁止状態への移行*/ ............ /*ディスパッチ禁止状態*/ ............ ena_dsp ( ); /*ディスパッチ禁止状態の解除*/ ............ ............ } |
- ena_dsp
システム状態種別をディスパッチ許可状態へと変更します。
これにより,dis_dspの発行により禁止されていたディスパッチ処理(タスクのスケジューリング処理)が許可されます。
なお,RI78V4では,dis_dspの発行から本サービス・コールが発行されるまでの間に“ディスパッチ処理を伴うサービス・コール(chg_pri,sig_semなど)”が発行された場合には,キュー操作,カウンタ操作などといった処理を行うだけであり,実際のディスパッチ処理は,本サービス・コールが発行されるまで遅延され,一括して行うようにしています。
以下に,本サービス・コールの記述例を示します。
システム状態種別をディスパッチ許可状態へと変更します。
これにより,dis_dspの発行により禁止されていたディスパッチ処理(タスクのスケジューリング処理)が許可されます。
なお,RI78V4では,dis_dspの発行から本サービス・コールが発行されるまでの間に“ディスパッチ処理を伴うサービス・コール(chg_pri,sig_semなど)”が発行された場合には,キュー操作,カウンタ操作などといった処理を行うだけであり,実際のディスパッチ処理は,本サービス・コールが発行されるまで遅延され,一括して行うようにしています。
以下に,本サービス・コールの記述例を示します。
#include <kernel.h> /*標準ヘッダ・ファイルの定義*/ #include <kernel_id.h> /*システム情報ヘッダ・ファイルの定義*/ void func_task ( VP_INT exinf ) { ............ ............ dis_dsp ( ); /*ディスパッチ禁止状態への移行*/ ............ /*ディスパッチ禁止状態*/ ............ ena_dsp ( ); /*ディスパッチ禁止状態の解除*/ ............ ............ } |
RI78V4では,非タスク(周期ハンドラ,割り込みハンドラなど)内の処理を高速に終了させる目的から,非タスク内の処理が完了するまでの間に“ディスパッチ処理(タスクのスケジューリング処理)を伴うサービス・コール(ichg_pri,isig_semなど)”が発行された場合には,キュー操作,カウンタ操作などといった処理を行うだけであり,実際のディスパッチ処理は,非タスクからの復帰命令(return命令の発行など)が発行されるまで遅延され,一括して行うようにしています。
アイドル・ルーチンは,CPUが提供しているスタンバイ機能を有効活用(低消費電力システムの実現)するためにユーザ・オウン・コーディング部として切り出されたアイドル処理専用ルーチンであり,RI78V4のスケジューリング対象となるタスク(RUNNING状態,またはREADY状態のタスク)がシステム内に1つも存在しなくなった際にスケジューラから呼び出されます。
- 静的な登録
アイドル・ルーチンの静的な登録は,規定された関数名idle_handlerでアイドル・ルーチンを記述することにより実現されます。
RI78V4では,カーネル初期化部において,該当シンボル情報をもとにアイドル・ルーチンの登録処理を実行し,管理対象とします。
アイドル・ルーチンの静的な登録は,規定された関数名idle_handlerでアイドル・ルーチンを記述することにより実現されます。
RI78V4では,カーネル初期化部において,該当シンボル情報をもとにアイドル・ルーチンの登録処理を実行し,管理対象とします。
#include <kernel.h> /*標準ヘッダ・ファイルの定義*/ #include <kernel_id.h> /*システム情報ヘッダ・ファイルの定義*/ void idle_handler ( void ) { ............ /*アイドル・ルーチンの本体処理*/ ............ return; /*アイドル・ルーチンの終了*/ } |
- スタックの切り替え
RI78V4では,アイドル・ルーチンに制御を移す際に“システム・スタックへの切り替え処理”を,アイドル・ルーチンから制御を戻す際に“切り替え先の処理プログラム用スタック(システム・スタック,またはタスク・スタック)への切り替え処理”を実行しています。
したがって,ユーザは,アイドル・ルーチン内でスタックの切り替えに関する処理を記述する必要はありません。
RI78V4では,アイドル・ルーチンに制御を移す際に“システム・スタックへの切り替え処理”を,アイドル・ルーチンから制御を戻す際に“切り替え先の処理プログラム用スタック(システム・スタック,またはタスク・スタック)への切り替え処理”を実行しています。
したがって,ユーザは,アイドル・ルーチン内でスタックの切り替えに関する処理を記述する必要はありません。