MPLAB C32 割り込み処理の記述


【レジスタの退避、復旧】

割り込み処理で必要なレジスタ退避と復旧は、割り込みハンドラと
して関数を定義すれば自動的に行われます。
また割り込みレベルが7の場合には、シャドーレジスタを使って
レジスタ退避、復旧が行われますので高速となります。

【割り込みハンドラの生成】

関数を割り込みハンドラとするための、アトリビュートとPragmaが
用意されています。

《基本の記述》
@ 複数ベクタ割り込みの場合
 #pragma interrupt function-name iplx [vector [@]number [ ,number-list]]
 
   function-name:割り込みハンドラとする関数名
   x:割り込みレベル(0〜7) (ipl記述はiplかIPL)

A 単一ベクタ割り込みの場合
 #pragma interrupt function-name single [vector [@]0]

《記述例》
  #pragma interrupt foo ipl4 vector @54, 34
    fooという関数を割り込みレベル4で、割り込みベクタ54と34の
    割り込みハンドラとする。 @がある場合には、foo関数を割り込み
    ベクタ54の領域に直接配置する。ベクタ34にはディスパッチ命令のみ

  #pragma interrupt bar ipl5 vector 23
    barという関数を割り込みレベル5で、割り込みベクタ23の
    割り込みハンドラとする。bar関数は、汎用のプログラム領域に
    配置する
 

【マクロを使った記述】

割り込み処理ハンドラの作成には__ISRというマクロが用意されて
いますからこれで作成すると簡単です。

《基本の記述形式》
  void __ISR(vector, iplx) XXXName(void)
     ハンドラの処理
     mXXXClearIntFlag();
  }

   この記述で、XXXの割り込みハンドラをXXXnameという名称の
   関数で生成し、ベクタ番号はvector、割り込みレベルはxとする
   ベクタにはハンドラへのジャンプ命令を自動で配置する。
   ClearIntFlagで割り込み要因XXXの割り込みフラグビットをクリアする。

《記述例》

    void __ISR(7, ipl3) INT1Handler(void) {
       −−−−−−
       mINT1ClearIntFlag();
    }

ここでINT1などの割り込み要因の名称XXXと割り込みベクタ番号はあらかじめ
決まっていて、下表のようになっています。
 
   【XXXの名称】(最初の-より前の文字列)                   【ベクタ番号】