Renesas Synergy™

FAQ 1006736 : 割り込み処理について、どのような動作になり、どのような点に注意すればよいのか?

<はじめに>
割り込み処理の基本的な動作は大きく4つの部分に分けて考えることができます。

最初の部分は 割り込みの要因を発生させる部分で、 2つ目が割り込み要求フラグ、 3つ目の部分が割り込みの制御を行う割り込みコントローラ部、 最後が実際に割り込みを処理するCPU部です。 割り込みはこれら4つの部分を通って処理されます。

[割り込みの流れ](4Kbytes)


<割り込みの要因発生部>
割り込みの要因を発生させる部分としては、タイマ部やシリアル部、 外部信号のエッジ検出回路等 (個々のデバイスで要因は異なります) があります。
これらの部分では、タイマの一致やシリアル・データの受信完了など割り込み発生の条件が満足されると、 対応した割り込み要求フラグをセットします。

[割り込み受け付け第1段階](6Kbytes)

割り込みの第1段階は各周辺機能部において指定された条件が満足されることです。
タイマ部ではコンペア・レジスタとの一致等で、シリアル部では通信完了等で、 外部割り込みではエッジ検出により、各々対応した割り込み要求フラグをセットします。
また、プログラムにより割り込み要求フラグをセットすることもできます。



<割り込み要求フラグ>
このように、各割り込み要因は対応した割り込み要求フラグをセットするだけで、 割り込みの要因を発生させる部分と割り込みコントローラ部の動作は独立した動きになります。
この間を結ぶのが割り込み要求フラグです。

なお、各割り込み要因に対応した割り込み要求フラグは1つ(1ビット)しかありません。
従って、割り込みが受け付けられる前に同じ割り込み要求が複数回発生しても、 それは1回としか認識できませんので、注意が必要です。

また、割り込み要求フラグはプログラムによりセットしたりクリアしたりすることもできます。
この機能を使うと、UARTでの送信処理を、最初のデータを含めて、 全て割り込みで実行させることができます。
ただし、この場合には必ず、ビット操作命令を用いて、 1命令で割り込み要求フラグをセットする必要があります。

UART送信処理例

複数バイトのデータを送信する場合、 通常はメイン・プログラムが出力データの1バイト目をUARTに書き込むとともに、 2バイト目以降のデータの情報を割り込み処理プログラムに引き渡します。
割り込み処理プログラムはメイン・プログラムから渡された情報を元にして 2バイト目以降のデータをUARTに書き込みます。
このように1バイト目と2バイト目以降では処理が異なってきます。

[UART送信処理例1](4Kbytes)
[UART送信処理例2](3Kbytes)

メイン・プログラムは割り込み処理プログラムに送信データの情報を渡し、 割り込み要求フラグをセットするだけとなります。
実際のUARTへの書き込みは全て割り込み処理プログラムが処理しますので、 全体の処理が見やすくなります。



<割り込みコントローラ部>
割り込み要求フラグ以降が割り込みコントローラ部の動作となります。
割り込みコントローラ部では、割り込み要求フラグは先ず割り込みマスク・レジスタにより有効にする (マスクしない) か無効にする (マスクする) が決められます。

マスクして無効に設定された割り込み要求フラグは以降の動作で無視されます。
ただし、要求フラグ自体がクリアされる訳ではないので、 マスクを解除したらその段階で割り込み要求は有効になってしまいます。

マスクされなかった割り込み要求はスタンバイの制御回路に送られ、 スタンバイの解除に使用されます (78K4のマクロ・サービスの場合を除く)。

また、割り込み優先回路を介してCPUへの割り込み要求となります。
CPUが割り込みを受け付けると、対応した割り込み要求フラグはクリアされます。
CPUが割り込み禁止状態では、割り込みは単にスタンバイ解除に使用されます (スタンバイ状態でない場合には保留されるだけです)。

割り込み許可状態では、スタンバイ解除後、ベクタ割り込み処理を起動します。
なお、78K4のマクロ・サービスの場合にはCPUが割り込み禁止でも受け付けて、 マクロ・サービス処理を行います。

[割り込み要求フラグの使われ方](3Kbytes)

割り込み要求フラグは以下の3つの使い方があります。
  • プログラムでポーリング (読み出し) を行い、割り込み要求元の処理が完了したかを確認します。 この使い方の場合には、割り込みマスクをセットしておき、CPUへの割り込みは発生させません。
  • スタンバイの解除に使用します。
    スタンバイ状態でマスクされていない割り込み要求フラグがセットされると、スタンバイが解除されます。 このとき、CPUが割り込み禁止状態であれば、スタンバイ解除後はベクタ処理をせず、 スタンバイ命令の後から実行を再開します (78K4でマクロ・サービスを実行する場合には、スタンバイは解除されません。)
  • CPUへのベクタ割り込み要求として使用します。 この場合には、割り込み優先回路で他の割り込み要求フラグの状態、 CPUが実行中の割り込みの状態がチェックされ、最も優先度が高ければCPUへの割り込み要求となります。


割り込み優先回路では同時に発生している他の割り込み要求と優先度を比較したり、 現在処理している割り込みとの優先度比較を行います。

このため、CPUが実行している割り込みの状態を監視し、 RETI命令が実行されるまでは割り込み処理中であると判断します。
また、78K4の場合や 78K0でも NMIの実行中には、 たとえCPUが EI命令を実行しても優先度の低い割り込みを受け付けないことになります。


<CPU部>
CPUが割り込み許可状態であれば、優先度がもっとも高い割り込み (これは割り込み制御回路で決定) を受け付け、PCや PSWの値をスタックに保存して、 割り込みベクタに分岐します。
このときに (該当する割り込み要求フラグはクリアされ)、CPUは割り込み禁止状態になります。

なお、CPUが割り込みを受け付けて、ベクタに分岐するタイミングは命令の実行状態により異なり、 いつも同じタイミングにはなりません。
割り込みを保留する命令や、特に割り込み禁止期間があると大きく変動します。
このため、細かなタイミングが問題になる場合には割り込み処理ではなく、 タイマの出力機能やリアルタイム出力機能等のハードウエア機能を使用するようにして下さい。

割り込み処理が完了したら、RETI命令で元の処理に戻ります。
このとき、PSWは割り込み受け付け前の値に書き戻されますので、 RETI命令の直前に EI命令は実行する必要はありません。

適用製品

RL78 ファミリ
78K ファミリ
他にご質問がございましたら、リクエストを送信してください