第6章 タスク例外処理機能
- 処理開始時のFPSW
システム情報(system)のタスク・コンテキスト・レジスタ(context)にFPSWを含む設定をした場合の処理開始時のFPSWを表6-3に示します。それ以外の場合は不定です。
システム情報(system)のタスク・コンテキスト・レジスタ(context)にFPSWを含む設定をした場合の処理開始時のFPSWを表6-3に示します。それ以外の場合は不定です。
「16.4 タスクのスケジューリング方式」にしたがってスケジューリングされたタスクについて,以下のすべての条件が満たされたとき,RI600PXはそのタスク本体を実行させる代わりに,タスク例外処理ルーチンを起動します。タスク例外処理ルーチンが終了すると,元のタスク本体の処理が再開されます。
また,タスクはタスク例外禁止状態かタスク例外許可状態のいずれかの状態を取ります。タスク起動直後はタスク例外禁止状態です。また,タスク例外処理ルーチンが定義されていない間も,タスク例外禁止状態です。自タスクがena_texを呼び出すことでタスク例外許可状態に遷移し,dis_texを呼び出すことでタスク例外禁止状態に遷移します。
1 ) システム・コンフィギュレーション・ファイルでの定義
システム・コンフィギュレーション・ファイルで静的API“task[]”を使用してタスクを生成する際に,タスク例外処理ルーチンを定義できます。
静的API“task[]”の詳細は,「20.10 タスク情報(task[])」を参照してください。
システム・コンフィギュレーション・ファイルで静的API“task[]”を使用してタスクを生成する際に,タスク例外処理ルーチンを定義できます。
静的API“task[]”の詳細は,「20.10 タスク情報(task[])」を参照してください。
2 ) def_texサービスコールによる定義
def_texは,パラメータpk_dtex指す領域に設定されたタスク例外処理ルーチン定義情報にしたがって,パラメータtskidで指定されたタスクのタスク例外処理ルーチンを定義します。
指定するタスク例外処理ルーチン定義情報は,以下の通りです。
def_texは,パラメータpk_dtex指す領域に設定されたタスク例外処理ルーチン定義情報にしたがって,パラメータtskidで指定されたタスクのタスク例外処理ルーチンを定義します。
指定するタスク例外処理ルーチン定義情報は,以下の通りです。
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/ #include "kernel_id.h" /*cfg600pxが出力するヘッダ・ファイルの定義*/ extern void Texrtn1 ( TEXPTN texptn, VP_INT exinf ); #pragma task Task1 /*備考参照*/ void Task1 ( VP_INT exinf ); /*備考参照*/ void Task1 ( VP_INT exinf ) { ER ercd; /*変数の宣言*/ ID tskid = TSK_SELF; /*変数の宣言,初期化*/ T_DTEX pk_dtex = { /*変数の宣言,初期化*/ TA_HLNG, /*タスク例外処理ルーチン属性(texatr)*/ (FP)Texrtn1, /* 開始アドレス(texrtn)*/ }; ............ ............ ercd = def_tex ( tskid, pk_dtex ); /*タスク例外処理ルーチンの定義*/ ............ ............ } |
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/ #include "kernel_id.h" /*cfg600pxが出力するヘッダ・ファイルの定義*/ #pragma task Task1 /*備考参照*/ void Task1 ( VP_INT exinf ); /*備考参照*/ void Task1 ( VP_INT exinf ) { ER ercd; /*変数の宣言*/ ID tskid = TSK_SELF; /*変数の宣言,初期化*/ ............ ............ ercd = def_tex ( tskid, (T_DTEX *)NULL ); /*タスク例外処理ルーチンの定義解除*/ ............ ............ } |
- ras_tex,iras_tex
パラメータtskidで指定されたタスクに対して,タスク例外処理を要求します。対象タスクの保留例外要因を,rasptn で示された値との論理和に更新します。
本サービス・コールにより,「6.2.3 タスク例外処理ルーチンの起動条件」に示す条件がすべて揃った場合には,RI600PXはタスク例外処理ルーチンを起動します。
以下に,本サービス・コールの記述例を示します。
パラメータtskidで指定されたタスクに対して,タスク例外処理を要求します。対象タスクの保留例外要因を,rasptn で示された値との論理和に更新します。
本サービス・コールにより,「6.2.3 タスク例外処理ルーチンの起動条件」に示す条件がすべて揃った場合には,RI600PXはタスク例外処理ルーチンを起動します。
以下に,本サービス・コールの記述例を示します。
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/ #include "kernel_id.h" /*cfg600pxが出力するヘッダ・ファイルの定義*/ #pragma task Task1 /*備考参照*/ void Task1 ( VP_INT exinf ); /*備考参照*/ void Task1 ( VP_INT exinf ) { ID tskid = 8; /*変数の宣言,初期化*/ TEXPTN rasptn = 0x00000001UL; /*変数の宣言,初期化*/ ............ ............ ras_tex ( tskid, rasptn ); /*タスク例外処理の要求*/ ............ ............ } |
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/ #include "kernel_id.h" /*cfg600pxが出力するヘッダ・ファイルの定義*/ #pragma task Task1 /*備考参照*/ void Task1 ( VP_INT exinf ); /*備考参照*/ void Task1 ( VP_INT exinf ) { ............ ............ ena_tex ( ); /*タスク例外許可状態へ移行*/ ............ /*タスク例外許可状態*/ ............ dis_tex ( ); /*タスク例外禁止状態へ移行*/ ............ ............ } |
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/ #include "kernel_id.h" /*cfg600pxが出力するヘッダ・ファイルの定義*/ void CommonFunc ( void ); void CommonFunc ( void ) { BOOL ctx; /*変数の宣言*/ BOOL tex; /*変数の宣言*/ ............ ............ ctx = sns_ctx ( ); /*コンテキスト種別の参照*/ if ( ctx == TRUE ) { ............ /*非タスク・コンテキスト処理*/ ............ } else if ( ctx == FALSE ) { ............ /*タスク・コンテキスト処理*/ ............ tex = sns_tex ( ); /*タスク例外禁止状態の参照*/ if ( tex == TRUE ) { ............ /*自タスクはタスク例外禁止状態*/ ............ } else if ( tex == FALSE ) { ............ /*自タスクはタスク例外許可状態*/ ............ } } ............ ............ } |
- ref_tex,iref_tex
パラメータtskidで指定されたタスクのタスク例外処理の詳細情報をパラメータpk_rtexで指定された領域に格納します。
以下に,本サービス・コールの記述例を示します。
パラメータtskidで指定されたタスクのタスク例外処理の詳細情報をパラメータpk_rtexで指定された領域に格納します。
以下に,本サービス・コールの記述例を示します。
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/ #include "kernel_id.h" /*cfg600pxが出力するヘッダ・ファイルの定義*/ #pragma task Task1 /*備考2参照*/ void Task1 ( VP_INT exinf ); /*備考2参照*/ void Task1 ( VP_INT exinf ) { ID tskid = 8; /*変数の宣言,初期化*/ T_RTEX pk_rtex; /*データ構造体の宣言*/ STAT texstat; /*変数の宣言*/ TEXPTN pndptn; /*変数の宣言*/ ............ ............ ref_tex ( tskid, &pk_rtex ); /*タスク例外処理の詳細情報の参照*/ texstat = pk_rtex.texstat; /*タスク例外処理状態の獲得*/ pndptn = pk_rtex.pndptn; /*保留例外要因の獲得*/ ............ ............ } |