■ 割り込みルーチン内でuart_write関数やLCD関連の関数は記述できないのですか?
※本件はmikroC PRO for PIC Ver.6.0.1では暫定的に回避されています。
割り込みルーチン内で記述できる関数は限られています。これはプログラムのリエントラントの問題です。 http://e-words.jp/w/E383AAE382A8E383B3E38388E383A9E383B3E38388.html
uart_write関数やLcd関連の関数はリエントラントではありません。 これらの関数は実行にある程度の時間がかかります。C言語のプログラム上ではたった1行ですが、実際には数多くのアセンブラ命令がバックグラウンドで生成されており、これらの1関数を実行開始し、実行完了するまでにはある程度の時間がかかります。(正しい表現としては、ある程度のクロックを要します。)
割り込み関数の場合、割り込みはいつ発生するかわかりません。TMR0による割り込み、シリアル通信受信割り込み、そのほかPORTBからの割り込みなど割り込みの種類は多彩です。時間のかかるライブラリを実行している最中に割り込みが入った場合、そのライブラリの実行はどうなるでしょうか。そのライブラリの完了は保証されません。たとえば、uart1_write関数を実行している最中に割り込みが入ったら、そのuart1_writeライブラリはその役目を果たす前に割り込みによって処理を中断せざるを得なくなります。
すなわち、uart1_writeライブラリを割り込みルーチン内で記述することは、ライブラリの完全実行を保証できない、リエントラントではない、ため記述することはできないのです。
ライブラリにはリエントラント可能なものと、そうでないものがあります。 より1つの処理に時間がかかりそうなライブラリはほとんどがリエントラント不能であり、割り込みルーチン内では記述できません。
そういったプログラムをつくる場合には、main関数内で記述しても実行できるようプログラムを工夫する必要があります。シングルタスクのマイコンの場合には避けられない仕様です。
※本件は、mikroC PRO for PIC Ver.6.0.1では暫定的に回避されており、割り込みルーチン内でも記述することができます。ただし、例えばTMR0割り込みが1マイクロ秒毎に発生しているとして、その割り込みルーチン内で10マイクロ秒の時間がかかるライブラリを実行した場合、割り込みを禁止している場合には、その間割り込みが発生しなくなり時間カウントがずれることになります。また割り込みを禁止しなかった場合、10マイクロ秒時間のかかる関数は処理を完了する前に次の割り込みが発生し、処理を完了しきれない状態となり、ライブラリの安全性は確保されません。リエントラント不可のライブラリがあることは、一見不便なよう見えますが、ライブラリの安全性から見ると必要な仕組みであることが分かります。
|