Renesas Synergy™

FAQ 1007142 : 割り込み処理について、どのような動作で、注意点は何になりますか。

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

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

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


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

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

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

なお、割り込み要因をDMAの起動要因として使用する場合には上記の割り込み要求フラグとは別の要求フラグが使用されます。
DMA転送の場合にも上記の割り込み要求フラグはセットされてしまいますので、このときには不要な割り込み処理を行わないようにマスクをセットしておく必要があります。



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

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

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

UART送信処理例

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

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

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

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



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

マスクして無効に設定された割り込み要求フラグは以降の動作で無視されます。
ただし、要求フラグ自体がクリアされる訳ではないので、 マスクを解除したらその段階で割り込み要求は有効になってしまいます。
特にDMAの起動要因として使用していた場合には、割り込み要求フラグはセットされていますので、DMA完了後にはクリアする必要があります。

マスクされなかった割り込み要求はスタンバイの制御回路に送られ、 スタンバイの解除に使用されます。

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

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

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


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

このため、ISPRレジスタにCPUが実行している割り込みの状態を記憶しています。
割り込み処理を完了して、RETI命令を実行すると、ISPRレジスタの最も優先度の高い割り込みに対応したビットをクリアして、処理中の割り込みの完了となります。
なお、ISPRレジスタはプログラムにより書き込みを行うことはできません。
V850/Sでは、CPUが割り込み禁止状態のときには優先度比較回路の動作は停止しており、割り込み禁止状態から割り込み許可にしても直ぐにはCPUに対する割り込み信号は発生せず、優先度の比較が完了してからCPUへの割り込み要求信号が発生します。
このため割り込み許可期間が7クロック以下では割り込みは受け付けられません。

注意
割り込み優先度や割り込みマスクは割り込み要求フラグと同じレジスタに配置されています。
そのため、割り込みマスクを操作する場合にビット操作命令を使用しないと、セットされた割り込み要求フラグがマスク操作によりクリアされることがあります。
割り込み優先度を操作する場合に同様です。
この件については以下のFAQも参照してください。

割り込み制御レジスタの操作と割り込み [V850共通](FAQ:1007133)(FAQ:1007134)

<CPU部>
CPUが割り込み許可状態であれば、優先度が最も高い割り込み(これは割り込み制御回路で決定)を受付け、PCやPSWの値をEIPCやEIPSWレジスタに保存して、割り込みハンドラに分岐します。
このときに(該当する割り込み要求フラグはクリアされ)、CPUは割り込み禁止状態になります。
なお、EIPCやEIPSWレジスタは1組しかありませんので、多重割り込みを行わせたい場合には割り込みを許可する前にEIPCとEIPSWレジスタの内容をスタック等に保存しておきます。
また、割り込み処理から復帰する前に多重割り込みの受け付けを禁止して、スタック等に保存したEIPCやEIPSWの値を元に戻しておく必要があります。

また、CPUが割り込みを受け付けて、ハンドラに分岐するタイミングは命令の実行状況により異なり、いつも同じタイミングにはなりません。
割り込みを保留する命令や、特に割り込み禁止期間があると大きく変動します。
このため、細かなタイミングが問題になる場合には割り込み処理ではなく、タイマの出力機能やリアルタイム出力機能等のハードウエア機能を使用するようにして下さい。
割り込み処理が完了したら、RETI命令で元の処理に戻ります。
このとき、PSWには前もってEIPSWに保存した割り込み受付け前の値に書き戻されますので、RETI命令の直前にEI命令は実行する必要はありません。

 

適用製品

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