割込みを無効にしないで割込み処理ルーチン内でdelay_XX()を使用出来ますか?

まず最初に割込み処理ルーチン内でdelay_XX()を使用することはお勧めできません。割込み処理ルーチンは余計な時間がかからないようにプログラムを設計してください。

次ぎにFAQ 何故'Interrupts disabled to prevent re-entrancy'の警告が出るのですか?"をご覧下さい。


RS232やdelay_XX()等のCCSコンパイラの内部関数はユーザ定義関数のように複製を作成することができません。
しかし、下記例のように#use delay(clock=XXXXX)を2回定義することで、2つのdelay_XX()関数を作成することができます。この場合は割込み処理中で使用されるdelay_XX()関数と、割込み処理外で使用されるdelay_XX()関数は別々に作成されますので再帰問題は発生しません:


(これは2つのシリアル・ポートを作成することと同じです)
#include <18F452.h>
#fuses HS,NOWDT,NOLVP,NODEBUG,NOPUT,NOBROWNOUT
#use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7)

#use delay(clock=20000000)

#int_YOURINTERRUPT
void isr(void) {
      /*
        YOUR CODE HERE
      */
      delay_ms(10);
}

#use delay(clock=20000000)

void main(void) {
   enable_interrupts(int_YOURINTERRUPT);
   enable_interrupts(GLOBAL);

   while(TRUE) {
      delay_ms(100);
      /*
          YOUR CODE HERE
       */
   }
}