__svc
構文
関数で使用される型属性の構文を参照してください。
説明
32ビットモード
__svcキーワードは、ソフトウェア割込み関数を宣言します。関数呼び出しを正しく実行するために必要なSVC (以前のSWI)命令と指定のソフトウェア割り込み番号が挿入されます。__svcにより宣言された関数は、引数を使用し、値を返すことができます。__svcキーワードを使用することにより、特定のソフトウェア割り込み関数に対する正しいリターンシーケンスがコンパイラで生成されます。ソフトウェア割り込み関数は、スタックの使用以外、パラメータおよびリターン値に関して通常の関数と同じ呼び出し規則に従います。
__svcキーワードには、#pragma svc_number=numberディレクティブで指定されるソフトウェア割り込み番号が必要です。svc_numberは、生成されるアセンブラSVC命令への引数として使用されます。また、SVC割込みハンドラ(たとえばSVC_Handler)が複数のソフトウェア割込み関数を含んだシステムで1つのソフトウェア割込み関数を選択するときにも使用できます。
注記
ソフトウェア割り込み番号は、関数宣言のみに指定(通常、割り込み関数を呼び出すソースコードにインクルードするヘッダファイルで指定)する必要があります。関数定義には指定しないでください。
注記
Cortex-Mを除くすべての割り込み関数は、Armモードでコンパイルする必要があります。必要に応じて__armキーワードまたは#pragma type_attribute=__armディレクティブを使用して、デフォルトの動作を変更してください。
64ビットモード:
__svcキーワードは、64ビットモード例外テーブルにある例外ベクタのひとつで関数を使用できるようにします。64ビットモードの例外関数を参照してください。
例
ソフトウェア割り込み関数の宣言は、通常、ヘッダファイルで行い、以下の例のように記述します。
#pragma svc_number=0x23 __svc int svc0x23_function(int a, int b); ...
関数の呼び出し
... int x = svc0x23_function(1, 2); /* Will be replaced by SVC 0x23, hence the linker will never try to locate the svc0x23_function */ ...
アプリケーションのソースコード内でソフトウェア割り込み関数を定義
...
__svc __arm int the_actual_svc0x23_function(int a, int b)
{
...
return 42;
}