何故'Interrupts disabled to prevent re-entrancy'の警告が出るのですか?

PICはハードウェアスタック領域が少ないのでCCSコンパイラは関数を再帰呼び出しすることが出来ない様になっています。
割込み処理以外で割り込み処理で使用する関数を呼び出す場合に関数の再帰呼び出しが発生する可能性があります。
このためコンパイラは割込み処理以外で割込み処理で使用する関数を呼び出そうとする場合に警告メッセージを表示します。
再帰呼び出しを防ぐために、コンパイラはその割込み処理以外で関数を呼び出す場合に、関数内での割り込みを無効にします。


次のコードを見て下さい:
Review the following code:
#int_rdavoid ISR_RDA(void){
StuffByte();
}
void SomeFunc(void){
StuffByte();
}
上記サンプルでは StuffByte() は割込み処理中、そしてSomeFunc()で呼び出されます。
もし、StuffByte()の実行中に割込みが発生するとStuffByte()で修正される全ての一時変数やレジスタはSomeFunc()から戻る時に全て不正なもとなってしまいます。

ここにいくつかの回避策を示します:
  • #inline プリ-プロセッサ・コマンドを使ってStuffByte()をインライン展開する
  • StuffByte()の複製しStuffByteISR()とし、割り込み処理ルーチンではこの関数を呼び出す これら2つの例では、StuffByte()のコードを別々に2つ作成するので、StuffByte()中で割り込みが発生しても同じコードを呼び出すことは無いため関数の再帰呼び出しを防ぎます。