C30による割り込み処理の記述


【C30による割り込み処理】

 PIC24Fファミリの割り込みは、内蔵周辺モジュールの動作に関連するイベント
で発生し、特定の割り込みベクタにジャンプします。
 この割り込みベクタを使って対応する割り込み処理ルーチン(これを割り込み
サービスルーチン(ISR)と呼ぶ)にジャンプするようになっています。
 したがって割り込み処理を記述するには、割り込みサービスルーチンの作成と、
割り込みベクタの作成が必要になります。


 この割り込みサービスルーチンを記述する場合に注意すべき点がいくつか
あります。

(1) 割り込みサービスルーチンはパラメータなし戻り値なしとすること
  MPLAB C30では、割り込みサービスルーチンを独立の関数として記述します。
  そしてこの割り込みサービスルーチンは、もともとハードウェアの割り込みで
  呼び出されるわけですので、呼び出し元関数がないわけですから、パラメータや
  戻り値を持つことはできません。

(2) 割り込みサービスルーチンをmain関数から呼んではならない
  割り込みサービスルーチンは通常の関数と異なり、RETURN命令ではなくRETFIE
  命令で戻りますから、main関数などから呼び出すと、その後の割り込みが正常に
  実行されなくなります。

(3) 割り込みサービスルーチンから他の関数を呼ばない方がよい
  割り込みサービスルーチンでは、通常の関数と同じようにローカル変数を持つことも
  できますし、グローバル変数にもアクセスできます。
  しかし、割り込みサービス関数から他の関数をコールすると、その時点のレジスタを
  すべてスタックに保存し、戻るとき復帰させますので処理時間が遅くなります。
  したがって、できるだけ他の関数を呼ばないように記述する方が効率的な処理と
  なります。

(4) 割り込みフラグのクリア記述が必要
  この修飾で生成される割り込みサービスルーチンでは、割り込みフラグのクリアは
  行いませんので、この処理はユーザーが追加記述する必要があります。


【割り込み処理関数の構文】

 MPLAB C30には、関数の修飾のアトリビュートに割り込み処理関数とする修飾が
用意されています。
 この__attribute__を使って関数の属性を指定することで、その関数が割り込みサービス
ルーチンとなります。この属性指定の構文は下記のようになります




 最初の__interrupt__(またはinterrupt)属性で この修飾を付けた関数が割り込み
サービスルーチン関数であることを定義します。
 オプションの__save__(またはsave)はsymbol-listで指定した変数列を割り込み処理で
退避、復旧するよう指定します。変数のシンボルを括弧内にカンマで区切って並べて
指定します。ただし普通は、Wレジスタは自動的に退避、復旧されますので、特別に
保存する場合以外には必要ありません。

 この標準の自動退避、復旧の代わりにシャドーレジスタを使って高速に退避、復旧
するよう指示するには、__shadow__パラメータを使います。

 オプションの__irq__(またはirq)パラメータは、この関数で処理する割り込みベクタを指定し、
()内に割り込みベクタ番号を記述します。
 __altirq__(またはaltirq)は同じように代替割り込みベクタを指定します。
 実際の記述では、__irq__や__altirq__パラメータを指定する代わりに、別途割り込みベクタ
ごとに用意されている「IRQ用既定ラベル」で指定します。
 こうすればこのパラメータを省略することができます。このirqを記述すると、指定したID
の割り込みベクタに、この定義した割り込みサービス関数の開始番地が自動的に設定
されます。

 実際の記述は下記のようにします。




【IRQの既定ラベル一覧】

 上記の例題にある _T1Interrupt とか _ADCInterrupt という記述は、あらかじめ内蔵
モジュールごとに定義されている割り込みベクタテーブルの既定ラベルです。
 この定義されている名称を使えば、irqパラメータを指定したのと同じ効果となり、割り込み
ベクタテーブルが自動的に生成されます。
 PIC24Fファミリ用の割り込みベクタテーブルの既定ラベルを下表に示します。
割り込みベクタテーブルには、主と代替の2つがありますので既定ラベルも両方別々に
定義されています。










   目次ページへ