Everything

第11章  サービス・コール管理機能


本章では,RI850V4が提供しているサービス・コール管理機能について解説しています。
11.1 概  要
RI850V4におけるサービス・コール管理機能では,拡張サービス・コール・ルーチンの登録/呼び出しなどといった拡張サービス・コール・ルーチンの状態を操作する機能を提供しています。
11.2 拡張サービス・コール・ルーチン
拡張サービス・コール・ルーチンは,ユーザ定義の関数をRI850V4に登録したものであり,RI850V4が提供するサービス・コール(cal_svc,またはical_svc)を使用して明示的に呼び出さない限り実行されることのない処理プログラムです。
なお,RI850V4では,拡張サービス・コール・ルーチンを“拡張サービス・コール・ルーチンを呼び出した処理プログラムの延長線”として位置づけています。
また,RI850V4では,拡張サービス・コール・ルーチンを管理するに当たり,拡張サービス・コール・ルーチンと一対一に対応した管理オブジェクト(拡張サービス・コール・ルーチン管理ブロック)を用いることにより,拡張サービス・コール・ルーチン自体の管理を行っています。
11.2.1 拡張サービス・コール・ルーチンの基本型
拡張サービス・コール・ルーチンを記述する場合,VP_INT型の引き数を3つ持ったER_UINT型の関数として記述します。
なお,引き数par1par2par3には“呼び出し要求(cal_svc,またはical_svc)の発行時に指定された引き継ぎデータ”が設定されます。
以下に,拡張サービス・コール・ルーチンをC言語で記述する場合の基本型を示します。
 #include        <kernel.h>              /*標準ヘッダ・ファイルの定義*/
 #include        <kernel_id.h>           /*システム情報ヘッダ・ファイルの定義*/
 
 ER_UINT
 svcrtn ( VP_INT par1, VP_INT par2, VP_INT par3 )
 {
         ............
         ............
 
         return ( ER_UINT ercd );        /*拡張サービス・コール・ルーチンの終了*/
 }

11.2.2 拡張サービス・コール・ルーチン内での処理
RI850V4では,呼び出し要求を発行した処理プログラムから拡張サービス・コール・ルーチンに制御を移す際,独自の拡張サービス・コール・ルーチン前処理を行っています。また,拡張サービス・コール・ルーチンから呼び出し要求を発行した処理プログラムに制御を戻す際にも,独自の拡張サービス・コール・ルーチン後処理を行っています。このため,拡張サービス・コール・ルーチンを記述する際には,以下に示す注意点があります。
- 記述方法
C言語,またはアセンブリ言語で記述します。
C言語で記述するときは通常の関数と同様に記述することができます。
アセンブリ言語で記述するときは使用するコンパイラの呼び出し規約にのっとって作成してください。
- スタックの切り替え
RI850V4では,拡張サービス・コール・ルーチンを“拡張サービス・コール・ルーチンを呼び出した処理プログラムの延長線”として位置づけています。したがって,拡張サービス・コール・ルーチンに制御を移す際,スタックの切り替え処理は行われません。
- サービス・コールの発行
RI850V4では,拡張サービス・コール・ルーチンを“拡張サービス・コール・ルーチンを呼び出した処理プログラムの延長線”として位置づけています。したがって,拡張サービス・コール・ルーチン内で発行可能なサービス・コールは,拡張サービス・コール・ルーチンを呼び出した処理プログラムの種類(タスク,非タスク)に依存します。
備考 各サービス・コールの発行有効範囲についての詳細は,表16-1表16-12を参照してください。
- EIレベル・マスカブル割り込みの受け付け状態
RI850V4では,拡張サービス・コール・ルーチンを“拡張サービス・コール・ルーチンを呼び出した処理プログラムの延長戦”として位置づけています。したがって,拡張サービス・コール・ルーチンに制御を移す際,EIレベル・マスカブル割り込みの受け付けに関する操作(プライオリティ・マスク・レジスタPMRのPMnビットに対する操作,およびプログラム・ステータス・ワードPSWのIDビットに対する操作)は行われません。
11.3 拡張サービス・コール・ルーチンの登録
RI850V4では,拡張サービス・コール・ルーチンの静的な登録のみサポートしています。処理プログラムからサービス・コールを発行して動的に登録することはできません。
拡張サービス・コール・ルーチンの静的登録とは,システム・コンフィギュレーション・ファイルで静的API“DEF_SVC”を使用して拡張サービス・コール・ルーチンを定義することをいいます。
静的API“DEF_SVC”の詳細は,「17.5.11 拡張サービス・コール・ルーチン情報」を参照してください。
11.4 拡張サービス・コール・ルーチンの呼び出し
拡張サービス・コール・ルーチンの呼び出しは,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。
- cal_svcical_svc
パラメータfncdで指定された拡張サービス・コール・ルーチンを呼び出します。
以下に,本サービス・コールの記述例を示します。
 #include        <kernel.h>              /*標準ヘッダ・ファイルの定義*/
 #include        <kernel_id.h>           /*システム情報ヘッダ・ファイルの定義*/
 
 void
 task ( VP_INT exinf )
 {
         ER_UINT ercd;                   /*変数の宣言*/
         FN      fncd = 1;               /*変数の宣言,初期化*/
         VP_INT  par1 = 123;             /*変数の宣言,初期化*/
         VP_INT  par2 = 456;             /*変数の宣言,初期化*/
         VP_INT  par3 = 789;             /*変数の宣言,初期化*/
 
         ............
         ............
 
                                         /*拡張サービス・コール・ルーチンの呼び出し*/
         ercd = cal_svc ( fncd, par1, par2, par3 );
 
         if ( ercd != E_RSFN ) {
                 ............            /*正常終了処理*/
                 ............
         }
 
         ............
         ............
 }

備考 本サービス・コールを使用して呼び出すことができる拡張サービス・コール・ルーチンは,総引き継ぎデータ数が4つ未満のものに限られます。