何故、HIGH又は、FAST割り込みが動作しないのですか?(FASTは保存/復帰レジスター、 又は HIGH/FASTでない割り込みが、優先度の高いサービスを提供)

PIC MCUでは、FAST 又は、HIGHは別の割り込みを中断することが出来る割り込みです。 これはその割り込みの優先ビットを設定することによって実現されます。 殆どの割り込みは割り込みのための3つのビットがあります:有効、フラグ/ステータス及び優先順位です。 割り込みの優先ビットをセットすると、割り込みソースは高い優先順位に設定されます、 即ちセットされない場合は低い優先順位の割り込みである事を意味しています。

CCSでは優先度の高い割り込みを使用した2つの方法を提供しています - FASTとHIGHの方法です。 ここで外部トリガ割り込みを使用する例を以下に示します:

#int_ext FAST
優先度の高い割り込み。コンパイラはキー・レジスタの保存/復帰を行いません。 この割り込みは進行中の通常の割り込みが中断されます。 只1つのみプログラムで許可されます。

#int_ext HIGH
優先度の高い割り込み。コンパイラはキーレジスタの保存/復帰を行います。 この割り込みは進行中の通常の割り込みを中断します。

しかし、PIC MCUでの優先度の高い割り込みに関する1つの落とし穴があります:すべての割り込みソース が優先順位の設定ビットを持ってるとは限らないことです。 例えば、PIC18F452のEXT0は優先順位の設定ビットを持っていません。 もしPIC MCUが優先度の高い割り込みを使用するように設定されている場合、優先順位の設定ビット を持っていない如何なる割り込みもPIC MCUにより、高い優先度としてサービスされます。 (即ち、EXT0割り込みソースはFAST、又は、HIGHを指定していなくても優先度の高い割り込みベクタへ飛びます)

CCS Cコンパイラではこの落とし穴によって、いくつかの望ましくない状況が現れる場合があります:

  • もし、優先度の高い割り込みを使用している場合、ユーザーが有効にした任意の割り込みで 優先順位の設定ビットを持っていない場合は、優先度の高い割り込みによって処理されます。 これは割り込みをFAST、又は、HIGHに指定しない場合でも同様です。

  • もし、優先度の高い割り込みを使用している場合で、優先順位の設定ビットを持っていない 割り込みを使用しようとする場合、 FAST方法で指定していてもHIGH方法で 全て高い優先割り込みによって処理されます。 つまり、FAST方法を使用していてもステータス・レジスタは優先度の高い割り込みによって 保存/復帰されることを意味します。