Cortex-Mデバイスの割り込み関数
Cortex-Mは、以前のArmアーキテクチャとは割り込みメカニズムが異なります。つまり、コンパイラにより提供されるプリミティブも異なります。
Cortex-Mの割り込み
Cortex-Mでは、割り込みサービスルーチンの入力とリターンは、通常の関数と同じです。つまり、特殊なキーワードは必要ありません。そのため、キーワード__irq、__fiq、および__nestedは、Cortex-Mのコンパイルには使用できません。
これらの例外関数の名前は、cstartup_M.cとcstartup_M.sに定義されています。これらは、ライブラリ例外ベクタコードによって参照されます。
NMI_Handler HardFault_Handler MemManage_Handler BusFault_Handler UsageFault_Handler SVC_Handler DebugMon_Handler PendSV_Handler SysTick_Handler
ベクタテーブルは配列として実装されます。C-SPYデバッガはベクタテーブルを配置する場所を決めるときにシンボルを検索するので、__vector_tableという名前は常にあるべきです。
定義済みの例外関数は、weakシンボルとして定義されます。weakシンボルは、重複するシンボルがない限り、リンカにより使用されます。別のシンボルが同じ名前で定義されている場合、これが優先されます。そのためアプリケーションは、上記の一覧から正しい名前を使用するだけで、独自の例外関数を定義できます。他の割り込みまたは他の例外ハンドラが必要な場合には、cstartup_M.cまたはcstartup_M.sファイルのコピーを作成し、ベクタテーブルに正しく追加する必要があります。
組み込み関数__get_CPSRと__set_CPSRは、Cortex-Mのコンパイルには使用できません。レジスタまたは他のレジスタの値を取得または設定する必要がある場合、インラインアセンブラを使用できます。詳細については、Cおよびアセンブラオブジェクト間での値の受渡しを参照してください。
FPUを備えたCortex-Mの割り込み
FPUを備えたCortex-Mコアの場合、システムレジスタビットFPCCR.ASPENを1に設定して浮動小数点レジスタ(S0–S15および FPSCR)の自動状態保持を有効にする必要があります。これにより、浮動小数点レジスタを使用している場合でも通常の関数と同じ方法で、割り込みサービスルーチンにエンターし、リターンします。
浮動小数点コンテキスト保存手順(FPCCR.ASPEN=0)は、次の場合省略することができます。
1 つのアプリケーションタスクのみがFPUを使用し、割り込みハンドラはFPUを使用しない。または
アプリケーションタスクはFPUを使用せず、割り込みハンドラのみで、FPU を使用する。
オペレーティングシステムなしで実行されているアプリケーションは、単一のアプリケーションタスクと見なされます。SVC_Handlerを含むすべてのハンドラは影響を受け、ソフトウェア割り込み関数(__svcキーワードで宣言済みの関数)も影響を受けます。