第10章  時間管理機能
 本章では,RI600PXが提供している時間管理機能について解説しています。
 
 システム時刻とは,RI600PXが時間管理を行う際に使用する“時間(単位:ミリ秒)”です。
 
 RI600PXでは,時間管理機能を実現するために,一定周期で発生する割り込み(基本クロック用タイマ割り込み)を使用します。
 
 基本クロック用タイマ割り込みが発生した際は,RI600PXの時間に関連した処理(システム時刻の更新,タスクのタイムアウト/遅延,周期ハンドラの起動,アラーム・ハンドラの起動など)が実行されます。
 
 RI600PXのサービス・コールでは時間指定パラメータの単位は「ミリ秒」になっています。
 
 基本クロック用タイマ割り込みの発生周期は1ミリ秒とするのが望ましいですが,ターゲット・システムの性質上(処理能力,必要とする時間分解能など) 1ミリ秒とすることが困難な場合があります。
 
 基本クロック周期を指定すると1回の基本クロック用タイマ割り込みで基本クロック周期分の時間が経過したとして処理されます。
 
 タスクの遅延は,一定の時間が経過するまでの間,自タスクをRUNNING状態からWAITING状態(時間経過待ち状態)へと遷移させ,一定の時間が経過した際には,該当タスクをWAITING状態からREADY状態へと遷移させるものです。
 
 なお,遅延起床は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。
 
 タイムアウトとは,タスクから発行された要求条件が即時成立しなかった場合,一定の時間が経過するまでの間,該当タスクをRUNNING状態からWAITING状態(起床待ち状態,資源獲得待ち状態,イベントフラグ待ち状態など)へと遷移させ,一定の時間が経過した際には,要求条件の成立/不成立を問わず,該当タスクをWAITING状態からREADY状態へと遷移させるものです。
 
 なお,タイムアウトは,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。
 
 周期ハンドラは,一定の時間ごとに周期的に起動される周期処理専用ルーチンです。
 
 なお,RI600PXでは,周期ハンドラを“タスクとは独立したもの(非タスク)”として位置づけています。このため,一定の時間が経過した際には,システム内で最高優先度を持つタスクが処理を実行中であっても,その処理は中断され,周期ハンドラに制御が移ります。
 
 以下に,周期ハンドラを記述する場合の基本型を示します。
exinfには,周期ハンドラ生成時に指定した拡張情報が渡されます。
 
 
 #include        "kernel.h"              /*標準ヘッダ・ファイルの定義*/
 
 #include        "kernel_id.h"           /*cfg600pxが出力するヘッダ・ファイルの定義*/
 
 #pragma cychandler Cychdr1              /*備考参照*/
 
 void Cychdr1 ( VP_INT exinf );          /*備考参照*/
 
 void Cychdr1 ( VP_INT exinf )
 {
         ............
         ............
 
 
         return;                         /*周期ハンドラの終了*/
 }
 
 | 
 
 備考	 システム・コンフィギュレーション・ファイルで生成した周期ハンドラについては,これらのステートメントはcfg600pxがkernel_id.hに出力するため,記述不要です。
 
 -	 スタック
周期ハンドラは,システム・スタックを使用します。
 
 -	 サービス・コールの発行
RI600PXでは,周期ハンドラを“タスクとは独立したもの(非タスク)”として位置づけています。
周期ハンドラでは,“発行有効範囲”が“非タスク”のサービスコールを発行可能です。
 
 備考	 RI600PXでは,周期ハンドラ内の処理を高速に終了させる目的から,周期ハンドラ内の処理が完了するまでの間,スケジューラの起動を遅延しています。したがって,周期ハンドラ内でディスパッチ処理(タスクのスケジューリング処理)を伴うサービス・コール(
isig_sem,
iset_flgなど)が発行された際には,キュー操作などといった処理が行われるだけであり,実際のディスパッチ処理の実行は“周期ハンドラからの復帰命令(return命令の発行)”が発行されるまで遅延され,一括して行うようにしています。
 
 周期ハンドラは,以下のいずれかの方法で生成します。
 
 1 )	 システム・コンフィギュレーション・ファイルによる生成
システム・コンフィギュレーション・ファイルで静的API“cyclic_hand[]”を使用して周期ハンドラを生成します。
静的API“cyclic_hand[]”の詳細は,「
20.19 周期ハンドラ情報(cyclic_hand[])」を参照してください。
 
 2 )	 
cre_cycまたは
acre_cycサービスコールによる生成
cre_cycは,パラメータ
pk_ccycが指す領域に設定された周期ハンドラ生成情報にしたがって,パラメータ
cycidで指定された周期ハンドラIDのタスクを生成します。
acre_cycは,パラメータ
pk_ccycが指す領域に設定された周期ハンドラ生成情報にしたがって周期ハンドラ生成し,生成された周期ハンドラIDを返します。
指定する周期ハンドラ生成情報は,以下の通りです。
 
 -	 周期ハンドラ属性(
cycatr)
以下を指定します。
 
 -	 生成後に動作状態にする指定(TA_STA属性)
 
 -	 周期ハンドラの実行開始アドレス(
cychdr)
 
 以下に,代表としてacre_cycの記述例を示します。
 
 
 #include        "kernel.h"              /*標準ヘッダ・ファイルの定義*/
 
 #include        "kernel_id.h"           /*cfg600pxが出力するヘッダ・ファイルの定義*/
 
 
 
 extern void Cychdr1 ( VP_INT exinf );
 
 
 
 #pragma task Task1                      /*備考参照*/
 
 void Task1 ( VP_INT exinf );            /*備考参照*/
 
 void Task1 ( VP_INT exinf )
 
 {
         ID      cycid;                  /*変数の宣言*/
         T_CCYC  pk_ccyc = {             /*変数の宣言,初期化*/
                          TA_STA,            /*周期ハンドラ属性(cycatr)*/
                          0,                 /*拡張情報(exinf)*/
                          (FP)Cychdr1,       /*周期ハンドラの開始アドレス(cychdr)*/
                          10,                /*起動周期(cyctim)*/
                          2,                 /*起動位相(cycphs)*/
        };
         ............
         cycid = acre_cyc ( &pk_ccyc );   /*周期ハンドラの生成*/
         ............
 }
 
 | 
 
 備考	 システム・コンフィギュレーション・ファイルで生成したタスクについては,これらのステートメントはcfg600pxがkernel_id.hに出力するため,記述不要です。
 
 -	 
del_cyc
パラメータ
cycidで指定された周期ハンドラを削除します。
本サービス・コールは,
信頼されたドメインに所属するタスクだけが呼び出せます。
以下に,本サービス・コールの記述例を示します。
 
 
 #include        "kernel.h"              /*標準ヘッダ・ファイルの定義*/
 
 #include        "kernel_id.h"           /*cfg600pxが出力するヘッダ・ファイルの定義*/
 
 #pragma task Task1                      /*備考参照*/
 
 void Task1 ( VP_INT exinf );            /*備考参照*/
 
 void Task1 ( VP_INT exinf )
 
 {
         ID      cycid = 8;              /*変数の宣言,初期化*/
 
 
         ............
         ............
 
         del_cyc( cycid );               /*周期ハンドラの削除*/
 }
 
 | 
 
 備考	 システム・コンフィギュレーション・ファイルで生成したタスクについては,これらのステートメントはcfg600pxがkernel_id.hに出力するため,記述不要です。
 
 周期ハンドラの動作開始は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。
 
 -	 
sta_cyc,
ista_cyc
パラメータ
cycidで指定された周期ハンドラの動作状態を停止状態(STP状態)から動作状態(STA状態)へと遷移させます。これにより,対象周期ハンドラは,RI600PXの起動対象となります。
なお,本サービス・コールの発行から1回目の起動要求が発行されるまでの相対時間間隔は,
周期ハンドラの生成時にTA_PHS属性を指定しているか否かにより異なります。
 
 -	 TA_PHS属性を指定した場合
起動位相および起動周期にしたがって,起動タイミングが設定されます。
ただし,対象周期ハンドラの動作状態が開始状態の場合には,本サービス・コールを発行しても何も処理は行わず,エラーとしても扱いません
図10−1に,周期ハンドラの起動タイミング・イメージを示します。
 
 -	 TA_PHS属性を指定しない場合
本サービス・コールの発行時点を基点に,起動周期にしたがって起動タイミングが設定されます。
なお,起動タイミング設定処理については,対象周期ハンドラの動作状態に関係なく実行されます。
図10−2に,周期ハンドラの起動タイミング・イメージを示します。
 
 
 #include        "kernel.h"              /*標準ヘッダ・ファイルの定義*/
 
 #include        "kernel_id.h"           /*cfg600pxが出力するヘッダ・ファイルの定義*/
 
 #pragma task Task1                      /*備考参照*/
 
 void Task1 ( VP_INT exinf );            /*備考参照*/
 
 void Task1 ( VP_INT exinf )
 
 {
         ID      cycid = 1;              /*変数の宣言,初期化*/
 
 
         ............
         ............
 
 
         sta_cyc ( cycid );    /*周期ハンドラの動作開始*/
 
 
         ............
         ............
 }
 
 | 
 
 備考	 システム・コンフィギュレーション・ファイルで生成したタスクについては,これらのステートメントはcfg600pxがkernel_id.hに出力するため,記述不要です。
 
 周期ハンドラの動作停止は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。
 
 -	 
stp_cyc,
istp_cyc
パラメータ
cycidで指定された周期ハンドラの動作状態を動作状態(STA状態)から停止状態(STP状態)へと遷移させます。これにより,本サービス・コールの発行から
sta_cycまたは
ista_cycが発行されるまでの間,対象周期ハンドラは,RI600PXの起動対象から除外されます。
以下に,本サービス・コールの記述例を示します。
 
 
 #include        "kernel.h"              /*標準ヘッダ・ファイルの定義*/
 
 #include        "kernel_id.h"           /*cfg600pxが出力するヘッダ・ファイルの定義*/
 
 #pragma task Task1                      /*備考2参照*/
 
 void Task1 ( VP_INT exinf );            /*備考2参照*/
 
 void Task1 ( VP_INT exinf )
 
 {
         ID      cycid = 1;              /*変数の宣言,初期化*/
 
 
         ............
         ............
 
 
         stp_cyc ( cycid );              /*周期ハンドラの動作停止*/
 
 
         ............
         ............
 }
 
 | 
 
 備考1	 本サービス・コールでは,停止要求のキューイングが行われません。このため,すでに本サービス・コールが発行され,対象周期ハンドラの動作状態が停止状態(STP状態)へと遷移していた場合には,何も処理は行わず,エラーとしても扱いません。
 
 備考2	 システム・コンフィギュレーション・ファイルで生成したタスクについては,これらのステートメントはcfg600pxがkernel_id.hに出力するため,記述不要です。
 
 周期ハンドラ詳細情報の参照は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。
 
 -	 
ref_cyc,
iref_cyc
パラメータ
cycidで指定された周期ハンドラの周期ハンドラ詳細情報(現在状態,残り時間)をパラメータ
pk_rcycで指定された領域に格納します。
以下に,本サービス・コールの記述例を示します。
 
 
 #include        "kernel.h"              /*標準ヘッダ・ファイルの定義*/
 
 #include        "kernel_id.h"           /*cfg600pxが出力するヘッダ・ファイルの定義*/
 
 #pragma task Task1                      /*備考2参照*/
 
 void Task1 ( VP_INT exinf );            /*備考2参照*/
 
 void Task1 ( VP_INT exinf )
 
 {
         ID      cycid = 1;              /*変数の宣言,初期化*/
         T_RCYC  pk_rcyc;                /*データ構造体の宣言*/
         STAT    cycstat;                /*変数の宣言*/
         RELTIM  lefttim;                /*変数の宣言*/
 
 
         ............
         ............
 
 
         ref_cyc ( cycid, &pk_rcyc );    /*周期ハンドラ詳細情報の参照*/
 
 
         cycstat = pk_rcyc.cycstat;      /*現在状態の獲得*/
         lefttim = pk_rcyc.lefttim;      /*残り時間の獲得*/
 
 
         ............
         ............
 }
 
 | 
 
 備考2	 システム・コンフィギュレーション・ファイルで生成したタスクについては,これらのステートメントはcfg600pxがkernel_id.hに出力するため,記述不要です。
 
 アラーム・ハンドラは,指定した時間が経過したときに起動されるルーチンです。
 
 なお,RI600PXでは,アラーム・ハンドラを“タスクとは独立したもの(非タスク)”として位置づけています。このため,指定した時間が経過した際には,システム内で最高優先度を持つタスクが処理を実行中であっても,その処理は中断され,アラーム・ハンドラに制御が移ります。
 
 以下に,アラーム・ハンドラを記述する場合の基本型を示します。
exinfには,アラーム・ハンドラ生成時に指定した拡張情報がが渡されます。
 
 
 #include        "kernel.h"              /*標準ヘッダ・ファイルの定義*/
 
 #include        "kernel_id.h"           /*cfg600pxが出力するヘッダ・ファイルの定義*/
 
 #pragma almhandler Almhdr1              /*備考参照*/
 
 void Almhdr1 ( VP_INT exinf );          /*備考参照*/
 
 void Almhdr1 ( VP_INT exinf )
 
 {
         ............
         ............
 
 
         return;                         /*アラーム・ハンドラの終了*/
 }
 
 | 
 
 備考	 システム・コンフィギュレーション・ファイルで生成したアラーム・ハンドラについては,これらのステートメントはcfg600pxがkernel_id.hに出力するため,記述不要です。
 
 -	 スタック
アラーム・ハンドラは,システム・スタックを使用します。
 
 -	 サービス・コールの発行
RI600PXでは,アラーム・ハンドラを“タスクとは独立したもの(非タスク)”として位置づけています。
アラーム・ハンドラでは,“発行有効範囲”が“非タスク”のサービスコールを発行可能です。
 
 備考	 RI600PXでは,アラーム・ハンドラ内の処理を高速に終了させる目的から,アラーム・ハンドラ内の処理が完了するまでの間,スケジューラの起動を遅延しています。したがって,アラーム・ハンドラ内でディスパッチ処理(タスクのスケジューリング処理)を伴うサービス・コール(
isig_sem,
iset_flgなど)が発行された際には,キュー操作などといった処理が行われるだけであり,実際のディスパッチ処理の実行は“アラーム・ハンドラからの復帰命令(return命令の発行)”が発行されるまで遅延され,一括して行うようにしています。
 
 アラーム・ハンドラは,以下のいずれかの方法で生成します。
 
 1 )	 システム・コンフィギュレーション・ファイルによる生成
システム・コンフィギュレーション・ファイルで静的API“alarm_hand[]”を使用してアラーム・ハンドラを生成します。
静静的API“alarm_hand[]”の詳細は,「
20.20 アラーム・ハンドラ情報(alarm_hand[])」を参照してください。
 
 2 )	 
cre_almまたは
acre_almサービスコールによる生成
cre_almは,パラメータ
pk_calmが指す領域に設定されたアラーム・ハンドラ生成情報にしたがって,パラメータ
almidで指定されたアラーム・ハンドラIDのタスクを生成します。
acre_almは,パラメータ
pk_calmが指す領域に設定されたアラーム・ハンドラ生成情報にしたがってアラーム・ハンドラ生成し,生成されたアラーム・ハンドラIDを返します。
生成されたアラーム・ハンドラは,停止状態(STA状態)となります。
指定するアラーム・ハンドラ生成情報は,以下の通りです。
 
 -	 アラーム・ハンドラ属性(
almatr)
TA_HLNGのみを指定できます。
 
 -	 アラーム・ハンドラの開始アドレス(
almhdr)
 
 以下に,代表としてacre_almの記述例を示します。
 
 
 #include        "kernel.h"              /*標準ヘッダ・ファイルの定義*/
 
 #include        "kernel_id.h"           /*cfg600pxが出力するヘッダ・ファイルの定義*/
 
 
 
 extern void Almhdr1 (VP_INT exinf);
 
 
 
 #pragma task Task1                      /*備考参照*/
 
 void Task1 ( VP_INT exinf );            /*備考参照*/
 
 void Task1 ( VP_INT exinf )
 
 {
         ID      almid;                  /*変数の宣言*/
         T_CALM  pk_calm = {             /*変数の宣言,初期化*/
                          TA_HLNG,          /*アラーム・ハンドラ属性(almatr)*/
                          0,                 /*拡張情報(exinf)*/
                          (FP)Almhdr1        /*アラーム・ハンドラの開始アドレス(almhdr)*/
       };
         ............
         almid = acre_alm ( &pk_calm );   /*アラーム・ハンドラの生成*/
         ............
 }
 
 | 
 
 備考	 システム・コンフィギュレーション・ファイルで生成したタスクについては,これらのステートメントはcfg600pxがkernel_id.hに出力するため,記述不要です。
 
 -	 
del_alm
パラメータ
almidで指定されたアラーム・ハンドラを削除します。
本サービス・コールは,
信頼されたドメインに所属するタスクだけが呼び出せます。
以下に,本サービス・コールの記述例を示します。
 
 
 #include        "kernel.h"              /*標準ヘッダ・ファイルの定義*/
 
 #include        "kernel_id.h"           /*cfg600pxが出力するヘッダ・ファイルの定義*/
 
 #pragma task Task1                      /*備考参照*/
 
 void Task1 ( VP_INT exinf );            /*備考参照*/
 
 void Task1 ( VP_INT exinf )
 
 {
         ID      almid = 8;              /*変数の宣言,初期化*/
 
 
         ............
         ............
 
         del_alm( almid );               /*アラーム・ハンドラの削除*/
 }
 
 | 
 
 備考	 システム・コンフィギュレーション・ファイルで生成したタスクについては,これらのステートメントはcfg600pxがkernel_id.hに出力するため,記述不要です。
 
 アラーム・ハンドラの動作開始は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。
 
 -	 
sta_alm,
ista_alm
almidで指定されたアラーム・ハンドラの起動時刻をalmtimミリ秒後に設定し,動作状態(STA状態)にします。これにより,対象アラーム・ハンドラは,RI600PXの起動対象となります
以下に,本サービス・コールの記述例を示します。
 
 
 #include        "kernel.h"              /*標準ヘッダ・ファイルの定義*/
 
 #include        "kernel_id.h"           /*cfg600pxが出力するヘッダ・ファイルの定義*/
 
 #pragma task Task1                      /*備考3参照*/
 
 void Task1 ( VP_INT exinf );            /*備考3参照*/
 
 void Task1 ( VP_INT exinf )
 
 {
         ID      almid = 1;              /*変数の宣言,初期化*/
 
 
         ............
         ............
 
 
         sta_alm ( almid );    /*アラーム・ハンドラの動作開始*/
 
 
         ............
         ............
 }
 
 | 
 
 備考1	 
almtimに0を指定すると,次回の基本クロック割り込み時にアラーム・ハンドラが起動されます。
 
 備考2	 対象アラーム・ハンドラがすでに動作状態の場合でも,本サービス・コールは起動時刻を再設定します。以前の起動時刻の設定は無効となります。
 
 備考3	 システム・コンフィギュレーション・ファイルで生成したタスクについては,これらのステートメントはcfg600pxがkernel_id.hに出力するため,記述不要です。
 
 アラーム・ハンドラの動作停止は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。
 
 -	 
stp_alm,
istp_alm
パラメータ
almidで指定されたアラーム・ハンドラの動作状態を動作状態(STA状態)から停止状態(STP状態)へと遷移させます。これにより,本サービス・コールの発行から
sta_almまたは
ista_almが発行されるまでの間,対象アラーム・ハンドラは,RI600PXの起動対象から除外されます。
以下に,本サービス・コールの記述例を示します。
 
 
 #include        "kernel.h"              /*標準ヘッダ・ファイルの定義*/
 
 #include        "kernel_id.h"           /*cfg600pxが出力するヘッダ・ファイルの定義*/
 
 #pragma task Task1                      /*備考2参照*/
 
 void Task1 ( VP_INT exinf );            /*備考2参照*/
 
 void Task1 ( VP_INT exinf )
 
 {
         ID      almid = 1;              /*変数の宣言,初期化*/
 
 
         ............
         ............
 
 
         stp_alm ( almid );              /*周期ハンドラの動作停止*/
 
 
         ............
         ............
 }
 
 | 
 
 備考1	 本サービス・コールでは,停止要求のキューイングが行われません。このため,すでに本サービス・コールが発行され,対象アラーム・ハンドラの動作状態が停止状態(STP状態)へと遷移していた場合には,何も処理は行わず,エラーとしても扱いません。
 
 備考2	 システム・コンフィギュレーション・ファイルで生成したタスクについては,これらのステートメントはcfg600pxがkernel_id.hに出力するため,記述不要です。
 
 アラーム・ハンドラ詳細情報の参照は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。
 
 -	 
ref_alm,
iref_alm
パラメータ
almidで指定されたアラーム・ハンドラの周期ハンドラ詳細情報(現在状態,残り時間)をパラメータ
pk_ralmで指定された領域に格納します。
以下に,本サービス・コールの記述例を示します。
 
 
 #include        "kernel.h"              /*標準ヘッダ・ファイルの定義*/
 
 #include        "kernel_id.h"           /*cfg600pxが出力するヘッダ・ファイルの定義*/
 
 #pragma task Task1                      /*備考2参照*/
 
 void Task1 ( VP_INT exinf );            /*備考2参照*/
 
 void Task1 ( VP_INT exinf )
 
 {
         ID      almid = 1;              /*変数の宣言,初期化*/
         T_RALM  pk_ralm;                /*データ構造体の宣言*/
         STAT    almstat;                /*変数の宣言*/
         RELTIM  lefttim;                /*変数の宣言*/
 
 
         ............
         ............
 
 
         ref_alm ( almid, &pk_ralm );    /*周期ハンドラ詳細情報の参照*/
 
 
         almstat = pk_ralm.almstat;      /*現在状態の獲得*/
         lefttim = pk_ralm.lefttim;      /*残り時間の獲得*/
 
 
         ............
         ............
 }
 
 | 
 
 備考2	 システム・コンフィギュレーション・ファイルで生成したタスクについては,これらのステートメントはcfg600pxがkernel_id.hに出力するため,記述不要です。
 
 システム時刻の設定は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。
 
 なお,システム時刻を変更しても,それ以前に行われた時間管理要求(タスクのタイムアウト,dly_tsk によるタスクの遅延,周期ハンドラ,およびアラーム・ハンドラ)が発生する実時刻は変化しません。
 
 -	 
set_tim,
iset_tim
RI600PXのシステム時刻(単位:ミリ秒)をパラメータ
p_systimで指定された時間に変更します。
以下に,本サービス・コールの記述例を示します。
 
 
 #include        "kernel.h"              /*標準ヘッダ・ファイルの定義*/
 
 #include        "kernel_id.h"           /*cfg600pxが出力するヘッダ・ファイルの定義*/
 
 #pragma task Task1                      /*備考2参照*/
 
 void Task1 ( VP_INT exinf );            /*備考2参照*/
 
 void Task1 ( VP_INT exinf )
 
 {
         SYSTIM  p_systim;               /*データ構造体の宣言*/
 
 
         p_systim.ltime = 3600;          /*データ構造体の初期化*/
         p_systim.utime = 0;             /*データ構造体の初期化*/
 
 
         ............
         ............
 
 
         set_tim ( &p_systim );          /*システム時刻の設定*/
 
 
         ............
         ............
 }
 
 | 
 
 備考2	 システム・コンフィギュレーション・ファイルで生成したタスクについては,これらのステートメントはcfg600pxがkernel_id.hに出力するため,記述不要です。
 
 システム時刻の参照は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。
 
 -	 
get_tim,
iget_tim
RI600PXのシステム時刻(単位:ミリ秒)をパラメータ
p_systimで指定された領域に格納します。
以下に,本サービス・コールの記述例を示します。
 
 
 #include        "kernel.h"              /*標準ヘッダ・ファイルの定義*/
 
 #include        "kernel_id.h"           /*cfg600pxが出力するヘッダ・ファイルの定義*/
 
 #pragma task Task1                      /*備考2参照*/
 
 void Task1 ( VP_INT exinf );            /*備考2参照*/
 
 void Task1 ( VP_INT exinf )
 
 {
         SYSTIM  p_systim;               /*データ構造体の宣言*/
         UW      ltime;                  /*変数の宣言*/
         UH      utime;                  /*変数の宣言*/
 
 
         ............
         ............
 
 
         get_tim ( &p_systim );          /*システム時刻の参照*/
 
 
         ltime = p_systim.ltime;         /*システム時刻(下位32ビット)の獲得*/
         utime = p_systim.utime;         /*システム時刻(上位16ビット)の獲得*/
 
 
         ............
         ............
 }
 
 | 
 
 備考2	 システム・コンフィギュレーション・ファイルで生成したタスクについては,これらのステートメントはcfg600pxがkernel_id.hに出力するため,記述不要です。
 
 10.9	 基本クロック用タイマ初期化ルーチン(_RI_init_cmt_knl( ))
 
 基本クロック用タイマ初期化ルーチンは,ユーザ・オウン・コーディング部として実装する必要があります。
 
 備考	 RI600PXで提供するサンプルの基本クロック用タイマ初期化ルーチンのソース・ファイルは“init_cmt.c”です。
 
 -	 基本クロック用タイマ初期化ルーチンの基本型
以下に,基本クロック用タイマ初期化ルーチンの基本型を示します。
 #include        "kernel.h"              /*標準ヘッダ・ファイルの定義*/
 
 #include        "kernel_id.h"           /*cfg600pxが出力するヘッダ・ファイルの定義*/
 
 
 
 #if (((_RI_CLOCK_TIMER) >=0) && ((_RI_CLOCK_TIMER) <= 3))
 
 #include    "ri_cmt.h"
 
 #endif
 
 
 
 ////////////////////////////////////////////////////////////
 
 // Timer initialize call-back
 
 ////////////////////////////////////////////////////////////
 
 void _RI_init_cmt_knl(void);
 
 void _RI_init_cmt_knl(void)
 
 {
 #if (((_RI_CLOCK_TIMER) >=0) && ((_RI_CLOCK_TIMER) <= 3))
 
     _RI_init_cmt();
 #endif
 
 }
 
 | 
 
 備考	 基本クロック用タイマ初期化ルーチンの関数名は“_RI_init_cmt_knl”です。
 
 clock.timerに“CMT0”,“CMT1”,“CMT2”,または“CMT3”を指定した場合,cfg600pxはri_cmt.hに基本タイマ用初期化用のインライン関数“void _RI_init_cmt(void)”を出力するので,_RI_init_cmt_knl()はこれを呼び出すように実装してください。
 
 cllock.timerに“OTHER”を指定した場合は,アプリケーションで_RI_init_cmt_knl()を実装してください。
 
 clock.timerに“NOTIMER”を指定した場合は,_RI_init_cmt_knl()は何もせずに終了するように実装してください。
 
 -	 スタック
基本クロック用タイマ初期化ルーチンは,システム・スタックを使用します。
 
 -	 サービス・コールの発行
基本クロック用タイマ初期化ルーチンでは,“発行有効範囲”が“非タスク”のサービスコールを発行可能です。
 
 表10−3  基本クロック用タイマ初期化ルーチン処理開始時のPSW