第6章  タスク例外処理機能
 本章では,RI600PXが提供しているタスク例外処理機能について解説しています。
 
 タスクに対してタスク例外を要求すると,タスク毎に定義されたタスク例外処理ルーチンが起動されます。タスク例外処理ルーチンには,要求された例外要因が渡されます。
 
 本機能により,タスクにおける例外処理を容易に実装することができます。
 
 タスク例外処理機能に関するサービス・コールを以下に示します。
 
 タスク例外処理ルーチンでは,要求された例外要因に応じた例外処理を実装します。
 
 以下に,タスク例外処理ルーチンを記述する場合の基本型を示します。
 
 
 #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  タスク例外処理ルーチン処理開始時のPSW
 
 
| 
 | 
 | 
| 
 | 
 | 
| 
 | 
 | 
 | 
| 
 | 
 | 
| 
 | 
 | 
 0x00000101(DNビットとRMビットのみ1)
  
 | 
| 
 | 
 | 
 
 「
16.4 タスクのスケジューリング方式」にしたがってスケジューリングされたタスクについて,以下のすべての条件が満たされたとき,RI600PXはそのタスク本体を実行させる代わりに,タスク例外処理ルーチンを起動します。タスク例外処理ルーチンが終了すると,元のタスク本体の処理が再開されます。
 
 例外要因は,
TEXPTN型のビット・パターンで表現されます。
 
 また,タスクはタスク例外禁止状態かタスク例外許可状態のいずれかの状態を取ります。タスク起動直後はタスク例外禁止状態です。また,タスク例外処理ルーチンが定義されていない間も,タスク例外禁止状態です。自タスクが
ena_texを呼び出すことでタスク例外許可状態に遷移し,
dis_texを呼び出すことでタスク例外禁止状態に遷移します。
 
 タスク例外処理ルーチンが起動するとタスク例外禁止状態に遷移し,タスク例外処理ルーチンが終了すると,タスク例外許可状態に遷移します。
 
 タスク例外処理ルーチンは,以下のいずれかの方法で定義します。
 
 1 )	 システム・コンフィギュレーション・ファイルでの定義
システム・コンフィギュレーション・ファイルで静的API“task[]”を使用してタスクを生成する際に,タスク例外処理ルーチンを定義できます。
静的API“task[]”の詳細は,「
20.10 タスク情報(task[])」を参照してください。
 
 2 )	 
def_texサービスコールによる定義
def_texは,パラメータ
pk_dtex指す領域に設定されたタスク例外処理ルーチン定義情報にしたがって,パラメータ
tskidで指定されたタスクのタスク例外処理ルーチンを定義します。
指定するタスク例外処理ルーチン定義情報は,以下の通りです。
 
 -	 タスク例外処理ルーチン属性(
texatr)
TA_HLNGのみを指定できます。
 
 -	 
タスク例外処理ルーチンの実行開始アドレス(
texrtn)
 
 以下に,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に出力するため,記述不要です。
 
 def_texで,パラメータ
pk_dtexにNULLを指定すると,パラメータ
tskidで指定されたタスクのタスク例外処理ルーチンの定義を解除します。
 
 以下に,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に出力するため,記述不要です。
 
 -	 
ras_tex,
iras_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に出力するため,記述不要です。
 
 以下に,これらのサービス・コールの記述例を示します。
 
 
 #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に出力するため,記述不要です。
 
 複数のタスクやハンドラから呼ばれる関数では,呼び出し元のタスクのタスク例外処理禁止状態を参照したい場合があります。このような場合には,
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 ) {
                     ............            /*自タスクはタスク例外許可状態*/
                     ............
             }
         }
         ............
         ............
 }
 
 | 
 
 -	 
ref_tex,
iref_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;        /*保留例外要因の獲得*/
 
 
         ............
         ............
 }
 
 | 
 
 備考2	 システム・コンフィギュレーション・ファイルで生成したタスクについては,これらのステートメントはcfg600pxがkernel_id.hに出力するため,記述不要です。