第9章 システム状態管理機能
RI600V4におけるシステム状態管理機能では,タスクの優先順位の回転,ディスパッチ禁止状態への遷移などといったシステムの状態を操作する機能のほかに,コンテキスト種別の参照,CPUロック状態の参照などといったシステムの状態を参照する機能も提供しています。
なお,システム・ダウン(vsys_dwn,ivsys_dwn)については「第13章 システム・ダウン」,RI600V4の起動(vsta_knl,ivsta_knl)については「第16章 システム初期化処理」を参照してください。
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/ #include "kernel_id.h" /*cfg600が出力するヘッダ・ファイルの定義*/ void cychdr ( VP_INT exinf ) /*周期ハンドラ*/ { PRI tskpri = 8; /*変数の宣言,初期化*/ ............ ............ irot_rdq ( tskpri ); /*タスクの優先順位の回転*/ ............ ............ return; /*周期ハンドラの終了*/ } |
備考3 RI600V4におけるレディ・キューは,優先度をキーとしたハッシュ・テーブルであり,実行可能な状態(RUNNING状態またはREADY状態)へと遷移したタスクがFIFO順でキューイングされます。このため,スケジューラは,起動された際にレディ・キューの優先度高位から検出処理を実行し,キューイングされているタスクを検出した場合には,該当優先度の先頭タスクにCPUの利用権を与えることにより,RI600V4のスケジューリング方式(優先度方式,FCFS方式)を実現しています。
備考4 tskpriにTPRI_SELFを指定すると,自タスクのベース優先度を対象とします。
ミューテックスをロック中のタスクの現在優先度は,ベース優先度と異なる場合があります。この場合,そのタスクが本サービス・コールでtskpriにTPRI_SELFを指定しても,自タスクが属する現在優先度のレディ・キューを回転することはできません。
ミューテックスをロック中のタスクの現在優先度は,ベース優先度と異なる場合があります。この場合,そのタスクが本サービス・コールでtskpriにTPRI_SELFを指定しても,自タスクが属する現在優先度のレディ・キューを回転することはできません。
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/ #include "kernel_id.h" /*cfg600が出力するヘッダ・ファイルの定義*/ void inthdr ( void ) /*割り込みハンドラ*/ { ID p_tskid; /*変数の宣言*/ ............ ............ iget_tid ( &p_tskid ); /*RUNNING状態のタスクの参照*/ ............ ............ return; /*割り込みハンドラの終了*/ } |
CPUロック状態では,タスクのスケジューリングは禁止され,カーネル管理割り込みもマスクされます。つまり,カーネル管理外割り込みハンドラを除くすべての処理プログラムに対して,排他的に処理を行うことができます。
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/ #include "kernel_id.h" /*cfg600が出力するヘッダ・ファイルの定義*/ void task ( VP_INT exinf ) { ............ ............ loc_cpu ( ); /*CPUロック状態への移行*/ ............ /*CPUロック状態*/ ............ unl_cpu ( ); /*CPUロック状態の解除*/ ............ ............ } |
- sns_loc
本サービス・コールは,CPUロック状態か否かを調べます。本サービス・コールは,戻り値として,CPUロック状態の場合はTRUE,CPUロック解除状態の場合はFALSEを返します。
以下に,本サービス・コールの記述例を示します。
本サービス・コールは,CPUロック状態か否かを調べます。本サービス・コールは,戻り値として,CPUロック状態の場合はTRUE,CPUロック解除状態の場合はFALSEを返します。
以下に,本サービス・コールの記述例を示します。
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/ #include "kernel_id.h" /*cfg600が出力するヘッダ・ファイルの定義*/ void CommonFunc ( void ); void CommonFunc ( void ) { BOOL ercd; /*変数の宣言*/ ............ ............ ercd = sns_loc ( ); /*CPUロック状態の参照*/ if ( ercd == TRUE ) { ............ /*CPUロック状態*/ ............ } else if ( ercd == FALSE ) { ............ /*非CPUロック状態*/ ............ } ............ ............ } |
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/ #include "kernel_id.h" /*cfg600が出力するヘッダ・ファイルの定義*/ void task ( VP_INT exinf ) { ............ ............ dis_dsp ( ); /*ディスパッチ禁止状態への移行*/ ............ /*ディスパッチ禁止状態*/ ............ ena_dsp ( ); /*ディスパッチ禁止状態の解除*/ ............ ............ } |
備考4 ディスパッチ禁止状態の間に“自タスクを状態遷移させる可能性のあるサービス・コール(wai_sem,wai_flgなど)”を発行した場合には,要求条件の即時成立/不成立を問わず,戻り値としてE_CTXを返します。
- sns_dsp
本サービス・コールは,ディスパッチ禁止状態か否かを調べます。本サービス・コールは,戻り値として,ディスパッチ禁止状態の場合はTRUE,ディスパッチ許可状態の場合はFALSEを返します。
以下に,本サービス・コールの記述例を示します。
本サービス・コールは,ディスパッチ禁止状態か否かを調べます。本サービス・コールは,戻り値として,ディスパッチ禁止状態の場合はTRUE,ディスパッチ許可状態の場合はFALSEを返します。
以下に,本サービス・コールの記述例を示します。
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/ #include "kernel_id.h" /*cfg600が出力するヘッダ・ファイルの定義*/ void CommonFunc ( void ); void CommonFunc ( void ) { BOOL ercd; /*変数の宣言*/ ............ ............ ercd = sns_dsp ( ); /*ディスパッチ禁止状態の参照*/ if ( ercd == TRUE ) { ............ /*ディスパッチ禁止状態*/ ............ } else if ( ercd == FALSE ) { ............ /*ディスパッチ許可状態*/ ............ } ............ ............ } |
- sns_ctx
本サービス・コールは,本サービス・コールを発行した処理プログラムのコンテキスト種別を調べます。本サービス・コールは,戻り値として,非タスク・コンテキストの場合はTRUE,タスク・コンテキストの場合はFALSEを返します。
以下に,本サービス・コールの記述例を示します。
本サービス・コールは,本サービス・コールを発行した処理プログラムのコンテキスト種別を調べます。本サービス・コールは,戻り値として,非タスク・コンテキストの場合はTRUE,タスク・コンテキストの場合はFALSEを返します。
以下に,本サービス・コールの記述例を示します。
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/ #include "kernel_id.h" /*cfg600が出力するヘッダ・ファイルの定義*/ void CommonFunc ( void ); void CommonFunc ( void ) { BOOL ercd; /*変数の宣言*/ ............ ............ ercd = sns_ctx ( ); /*コンテキスト種別の参照*/ if ( ercd == TRUE ) { ............ /*非タスク・コンテキスト処理*/ ............ } else if ( ercd == FALSE ) { ............ /*タスク・コンテキスト処理*/ ............ } ............ ............ } |
- sns_dpn
本サービス・コールは,ディスパッチ保留状態か否かを調べます。本サービス・コールは,戻り値として,ディスパッチ保留状態の場合はTRUE,ディスパッチ保留状態でない場合はFALSEを返します。
以下に,本サービス・コールの記述例を示します。
本サービス・コールは,ディスパッチ保留状態か否かを調べます。本サービス・コールは,戻り値として,ディスパッチ保留状態の場合はTRUE,ディスパッチ保留状態でない場合はFALSEを返します。
以下に,本サービス・コールの記述例を示します。
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/ #include "kernel_id.h" /*cfg600が出力するヘッダ・ファイルの定義*/ void CommonFunc ( void ); void CommonFunc ( void ) { BOOL ercd; /*変数の宣言*/ ............ ............ ercd = sns_dpn ( ); /*ディスパッチ保留状態の参照*/ if ( ercd == TRUE ) { ............ /*ディスパッチ保留状態*/ ............ } else if ( ercd == FALSE ) { ............ /*非ディスパッチ保留状態*/ ............ } ............ ............ } |