第11章 サービス・コール管理機能
拡張サービス・コール・ルーチンは,ユーザ定義の関数をRI850V4に登録したものであり,RI850V4が提供するサービス・コール(cal_svc,またはical_svc)を使用して明示的に呼び出さない限り実行されることのない処理プログラムです。
また,RI850V4では,拡張サービス・コール・ルーチンを管理するに当たり,拡張サービス・コール・ルーチンと一対一に対応した管理オブジェクト(拡張サービス・コール・ルーチン管理ブロック)を用いることにより,拡張サービス・コール・ルーチン自体の管理を行っています。
RI850V4では,呼び出し要求を発行した処理プログラムから拡張サービス・コール・ルーチンに制御を移す際,独自の拡張サービス・コール・ルーチン前処理を行っています。また,拡張サービス・コール・ルーチンから呼び出し要求を発行した処理プログラムに制御を戻す際にも,独自の拡張サービス・コール・ルーチン後処理を行っています。このため,拡張サービス・コール・ルーチンを記述する際には,以下に示す注意点があります。
- 記述方法
C言語,またはアセンブリ言語で記述します。
C言語で記述するときは通常の関数と同様に記述することができます。
アセンブリ言語で記述するときは使用するコンパイラの呼び出し規約にのっとって作成してください。
C言語,またはアセンブリ言語で記述します。
C言語で記述するときは通常の関数と同様に記述することができます。
アセンブリ言語で記述するときは使用するコンパイラの呼び出し規約にのっとって作成してください。
- スタックの切り替え
RI850V4では,拡張サービス・コール・ルーチンを“拡張サービス・コール・ルーチンを呼び出した処理プログラムの延長線”として位置づけています。したがって,拡張サービス・コール・ルーチンに制御を移す際,スタックの切り替え処理は行われません。
RI850V4では,拡張サービス・コール・ルーチンを“拡張サービス・コール・ルーチンを呼び出した処理プログラムの延長線”として位置づけています。したがって,拡張サービス・コール・ルーチンに制御を移す際,スタックの切り替え処理は行われません。
- サービス・コールの発行
RI850V4では,拡張サービス・コール・ルーチンを“拡張サービス・コール・ルーチンを呼び出した処理プログラムの延長線”として位置づけています。したがって,拡張サービス・コール・ルーチン内で発行可能なサービス・コールは,拡張サービス・コール・ルーチンを呼び出した処理プログラムの種類(タスク,非タスク)に依存します。
RI850V4では,拡張サービス・コール・ルーチンを“拡張サービス・コール・ルーチンを呼び出した処理プログラムの延長線”として位置づけています。したがって,拡張サービス・コール・ルーチン内で発行可能なサービス・コールは,拡張サービス・コール・ルーチンを呼び出した処理プログラムの種類(タスク,非タスク)に依存します。
- EIレベル・マスカブル割り込みの受け付け状態
RI850V4では,拡張サービス・コール・ルーチンを“拡張サービス・コール・ルーチンを呼び出した処理プログラムの延長戦”として位置づけています。したがって,拡張サービス・コール・ルーチンに制御を移す際,EIレベル・マスカブル割り込みの受け付けに関する操作(プライオリティ・マスク・レジスタPMRのPMnビットに対する操作,およびプログラム・ステータス・ワードPSWのIDビットに対する操作)は行われません。
RI850V4では,拡張サービス・コール・ルーチンを“拡張サービス・コール・ルーチンを呼び出した処理プログラムの延長戦”として位置づけています。したがって,拡張サービス・コール・ルーチンに制御を移す際,EIレベル・マスカブル割り込みの受け付けに関する操作(プライオリティ・マスク・レジスタPMRのPMnビットに対する操作,およびプログラム・ステータス・ワードPSWのIDビットに対する操作)は行われません。
#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 ) { ............ /*正常終了処理*/ ............ } ............ ............ } |