Everything

第6章  タスク例外処理機能


本章では,RI600PXが提供しているタスク例外処理機能について解説しています。
6.1 概  要
タスクに対してタスク例外を要求すると,タスク毎に定義されたタスク例外処理ルーチンが起動されます。タスク例外処理ルーチンには,要求された例外要因が渡されます。
本機能により,タスクにおける例外処理を容易に実装することができます。
タスク例外処理機能に関するサービス・コールを以下に示します。
表6-1  タスク例外処理機能
サービス・コール名
機能概要
発行有効範囲
タスク例外処理ルーチンの定義
タスク
タスク例外処理の要求
タスク
タスク例外処理の要求
非タスク
タスク例外処理の禁止
タスク
タスク例外処理の許可
タスク
タスク例外禁止状態の参照
タスク/非タスク
タスク例外処理の詳細情報の参照
タスク
タスク例外処理の詳細情報の参照
非タスク

6.2 タスク例外処理ルーチン
タスク例外処理ルーチンでは,要求された例外要因に応じた例外処理を実装します。
6.2.1 タスク例外処理ルーチンの基本型
以下に,タスク例外処理ルーチンを記述する場合の基本型を示します。
 #include        "kernel.h"              /*標準ヘッダ・ファイルの定義*/
 #include        "kernel_id.h"           /*cfg600pxが出力するヘッダ・ファイルの定義*/
 #pragma taskexception Texrtn1                 /*備考3参照*/
 void Texrtn1 ( TEXPTN texptn, VP_INT exinf );     /*備考3参照*/
 void Texrtn1 ( TEXPTN texptn, VP_INT exinf )
 {
         ............
         ............
 }

備考1 texptnには,受理した例外要因が渡されます。
備考2 exinfには,タスクの生成時に指定した拡張情報が渡されます。
備考3 システム・コンフィギュレーション・ファイルで定義したタスク例外処理ルーチンについては,これらのステートメントはcfg600pxがkernel_id.hに出力するため,記述不要です。
6.2.2 タスク例外処理ルーチン内での処理
- スタック
タスク例外処理ルーチンは,タスクのユーザ・スタックを使用します。
- サービス・コールの発行
タスク例外処理ルーチンでは,“発行有効範囲”が“タスク”のサービスコールを発行可能です。
- 処理開始時のPSW
表6-2  タスク例外処理ルーチン処理開始時のPSW
ビット

備考
I
1
IPL
タスク例外処理ルーチン起動直前のタスク本体と同じ
PM
1
ユーザ・モード
U
1
ユーザ・スタック
C, Z, S, O
不定
その他
0

- 処理開始時のFPSW
システム情報(system)タスク・コンテキスト・レジスタ(context)にFPSWを含む設定をした場合の処理開始時のFPSWを表6-3に示します。それ以外の場合は不定です。
表6-3  タスク例外処理開始時のFPSW
コンパイラ・オプション

-round
-denormalize
nearest
(デフォルト)
off(デフォルト)
0x00000100(DNビットのみ1)
on
0
zero
off(デフォルト)
0x00000101(DNビットとRMビットのみ1)
on
1(RMビットのみ1)

6.2.3 タスク例外処理ルーチンの起動条件
16.4 タスクのスケジューリング方式」にしたがってスケジューリングされたタスクについて,以下のすべての条件が満たされたとき,RI600PXはそのタスク本体を実行させる代わりに,タスク例外処理ルーチンを起動します。タスク例外処理ルーチンが終了すると,元のタスク本体の処理が再開されます。
表6-4  タスク例外処理ルーチンの起動条件
項番
起動条件
1
タスクはタスク例外許可状態である。
2
タスクの保留例外要因が0でない。

例外要因は,TEXPTN型のビット・パターンで表現されます。
ras_texまたはiras_texによってタスク例外処理を要求すると,対象タスクの保留例外パターンは,ras_texまたはiras_texで指定された例外要因パターンとの論理和に更新されます。
また,タスクはタスク例外禁止状態かタスク例外許可状態のいずれかの状態を取ります。タスク起動直後はタスク例外禁止状態です。また,タスク例外処理ルーチンが定義されていない間も,タスク例外禁止状態です。自タスクがena_texを呼び出すことでタスク例外許可状態に遷移し,dis_texを呼び出すことでタスク例外禁止状態に遷移します。
タスク例外処理ルーチンが起動するとタスク例外禁止状態に遷移し,タスク例外処理ルーチンが終了すると,タスク例外許可状態に遷移します。
表6-5  タスク例外禁止状態にする操作
項番
操作
タスク例外禁止状態になるタスク
1
起動されたタスク
2
自タスク
3
タスク例外処理ルーチンの起動
当該タスク
4
当該タスク

表6-6  タスク例外許可状態にする操作
項番
操作
タスク例外禁止状態になるタスク
1
自タスク
2
タスク例外処理ルーチンの終了
当該タスク

6.3 タスク例外処理ルーチンの定義
タスク例外処理ルーチンは,以下のいずれかの方法で定義します。
1 ) システム・コンフィギュレーション・ファイルでの定義
システム・コンフィギュレーション・ファイルで静的API“task[]”を使用してタスクを生成する際に,タスク例外処理ルーチンを定義できます。
静的API“task[]”の詳細は,「20.10 タスク情報(task[])」を参照してください。
2 ) def_texサービスコールによる定義
def_texは,パラメータpk_dtex指す領域に設定されたタスク例外処理ルーチン定義情報にしたがって,パラメータtskidで指定されたタスクのタスク例外処理ルーチンを定義します。
指定するタスク例外処理ルーチン定義情報は,以下の通りです。
- タスク例外処理ルーチン属性(texatr
TA_HLNGのみを指定できます。
- タスク例外処理ルーチンの実行開始アドレスtexrtn
def_texは,信頼されたドメインに所属するタスクだけが呼び出せます。
以下に,def_texによるタスク例外処理ルーチンの定義の記述例を示します。
 #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 );   /*タスク例外処理ルーチンの定義*/
         ............
         ............
 }

備考 システム・コンフィギュレーション・ファイルで生成したタスクについては,これらのステートメントはcfg600pxがkernel_id.hに出力するため,記述不要です。
6.4 タスク例外処理ルーチンの定義解除
def_texで,パラメータpk_dtexにNULLを指定すると,パラメータtskidで指定されたタスクのタスク例外処理ルーチンの定義を解除します。
def_texは,信頼されたドメインに所属するタスクだけが呼び出せます。
以下に,def_texによるタスク例外処理ルーチンの定義解除の記述例を示します。
 #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 );   /*タスク例外処理ルーチンの定義解除*/
         ............
         ............
 }

備考 システム・コンフィギュレーション・ファイルで生成したタスクについては,これらのステートメントはcfg600pxがkernel_id.hに出力するため,記述不要です。
6.5 タスク例外処理の要求
- ras_texiras_tex
パラメータ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 );      /*タスク例外処理の要求*/
 
         ............
         ............
 }

備考 システム・コンフィギュレーション・ファイルで生成したタスクについては,これらのステートメントはcfg600pxがkernel_id.hに出力するため,記述不要です。
6.6 タスク例外処理の禁止と許可
自タスクのタスク例外処理を禁止するにdis_tex,許可するにはena_texを使用します。
以下に,これらのサービス・コールの記述例を示します。
 #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 ( );                    /*タスク例外禁止状態へ移行*/
 
         ............
         ............
 }

備考 システム・コンフィギュレーション・ファイルで生成したタスクについては,これらのステートメントはcfg600pxがkernel_id.hに出力するため,記述不要です。
6.7 タスク例外処理禁止状態の参照
複数のタスクやハンドラから呼ばれる関数では,呼び出し元のタスクのタスク例外処理禁止状態を参照したい場合があります。このような場合には,sns_texを使用します。
- sns_tex
本サービス・コールは,RUNNING状態のタスクがタスク例外禁止状態の場合はTRUE,そうでない場合はFALSEを返します。
以下に,本サービス・コールの記述例を示します。
 #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 ) {
                     ............            /*自タスクはタスク例外許可状態*/
                     ............
             }
         }
         ............
         ............
 }

6.8 タスク例外処理の詳細情報の参照
- ref_texiref_tex
パラメータ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;        /*保留例外要因の獲得*/
 
         ............
         ............
 }

備考1 タスク詳細情報T_RTEXについての詳細は,「【 タスク基本情報T_RTEXの構造 】」を参照してください。
備考2 システム・コンフィギュレーション・ファイルで生成したタスクについては,これらのステートメントはcfg600pxがkernel_id.hに出力するため,記述不要です。