その割り込みのISR内の割り込みを無効にするとどうなりますか?
たとえば、バッファからUSARTを介してデータを送信していて、そのバッファのデータが不足している場合、一時的に送信を停止したいので、バッファの最後のバイトを送信した後、割り込みを無効にします。
(これはPIC18F4580にあります)
PIC18F4580のデータシートには、ISR内で割り込みが無効になっている場合、「異常な動作が発生する可能性がある」と記載されています。
その割り込みのISR内の割り込みを無効にするとどうなりますか?
たとえば、バッファからUSARTを介してデータを送信していて、そのバッファのデータが不足している場合、一時的に送信を停止したいので、バッファの最後のバイトを送信した後、割り込みを無効にします。
(これはPIC18F4580にあります)
PIC18F4580のデータシートには、ISR内で割り込みが無効になっている場合、「異常な動作が発生する可能性がある」と記載されています。
PIC18F4580について具体的にはわかりませんが、原則として、 ISR
中に割り込みを無効にしても問題はありません。
基本的に、これによりISRが再度呼び出されるのを防ぐことができます(つまり、割り込みが何らかの方法で再度有効になるまで)が、ISRのロジックに影響を与えたり、ISRを終了させたり、その他の奇妙なことを引き起こしたりすることはありません。
実際、ISRは通常、最初の割り込みの処理中に割り込みが発生しないように、割り込みを無効にすることから始めます(したがって、イベントが欠落する可能性を犠牲にして、さまざまな再入可能性の問題を回避します)。
もちろん、それがプログラム/ロジックの残りの部分にとって重要である場合は、割り込みをどのように/どこで再度有効にするかを計画する必要があります。
免責事項:ここでのPIC32とdsPICの経験から、PIC18F4580データシートと正誤表(PIC18F4580リファレンス)から読んだものと組み合わせて話します。
PIC18F4580データシートの割り込みセクションによると:
割り込みが有効になっている間は、MOVFF命令を使用して割り込み制御レジスタを変更しないでください。これを行うと、マイクロコントローラの動作が不安定になる可能性があります。
したがって、その未知の動作を取得するには、INTCONxレジスタを変更する必要があります。ハンドラー内のUSARTモジュールの割り込みイネーブルを切り替えるように指定したので、INTCONxではなくPIEを変更するので、その警告について心配する必要はありません。PIEレジスタホールドは、特定のペリフェラル割り込みを有効にすることに注意してください。1回のショットですべてのマスク可能な割り込みをマスクする一般的な割り込みイネーブル(GIE)もあります。これは、ハンドラの開始/終了プロシージャ(レジスタINTCON内)によって自動的に処理される必要があるため、割り込み内でこれをいじりたくないでしょう。
したがって、mjvが言ったように、ハンドラー内でUSARTペリフェラル割り込みをマスクすることは完全に合理的なことです。
割り込みは発生しなくなります。しかし、なぜこれを行うのですか?また、割り込みをいつ再度有効にするかについての計画はありますか?
何もすることがない場合は、ISRに何もさせないでください。