マイクロコンピュータで複数の割り込みを使用する場合には割り込みの優先度の制御や多重割り込みの制御が必要になります。これらの制御を間違えると割り込みの優先度が逆転して、余分な割り込みを受け付けたり、受け付ける必要がある割り込みを受け付けなくなったりするといった問題が発生します。
(1)ディフォルト優先度
78K0などで扱う割り込みには割り込み要求の要因ごとにディフォルト優先度が設定されています。このディフォルト優先度は複数の割り込み要求が
同時に発生した場合にどの割り込みを優先するかの判断に利用されるだけです。そのため、
ディフォルト優先度は多重割り込みの制御には用いることはできません。
78K0Sではディフォルト優先度しかないので、78K0Sで考えてみます。ここで以下のような割り込みを扱います(左側ほどディフォルト優先度が高い)。
INTP0 > INTP1 > INTTMH1
INTP1や
INTTMH1ではより優先度の高い割り込みを処理できるように多重割り込みを許可するものとします。
ここで、
INTP1と
INTTMH1が同時に発生したとすると、CPUは割り込み可能になると、ディフォルト優先度の高い
INTP1を受け付けます(@)。この状態で、
INTP0割り込みを受け付けるために割り込みを許可すると、保留された
INTTMH1が受け付けられてしまいます(A)。
このような動作を避けるには、
INTP1割り込み処理の中で割り込みを許可する前に、割り込みを受け付けたくない
INTTMH1をマスクします。また、
INTP1割り込み処理の最後で割り込みを禁止して、
INTTMH1のマスクを解除します。
注意
割り込みの説明の中で「同時」という言葉がよく使用されます。ところが、殆んどの場合に、厳密な意味で「全く同じ時間(タイミング)」を意味してはいません。ここで言っている「同時」はCPUが割り込みを受け付けるタイミングを意味しています。つまり、CPUが割り込み可能であれば、1命令の実行時間が「同時」の対象になりますが、CPUが割り込み禁止状態で動作している場合には、CPUが割り込みを受け付け可能になるまでの期間(数十〜数百命令以上になることもある)が「同時」の対象になります。
|
(2)ソフトウエアによる優先度指定
78K0では2レベル、78K0Rでは4レベルの割り込み優先度(優先順位)の指定ができるようになっています。この優先度指定はディフォルト優先度と異なり、
同時に発生した割り込みの優先度判定以外でも使用されます。
78K0Rを例にして説明します。78K0RではPSWレジスタの2ビットを用いて、4つの割り込みレベル(レベル0〜3)をとり得ます。また、個々の割り込みの(優先)レベルもPRレジスタの2ビットを用いて4つのレベルのどれかに設定できます。これらの関係は以下の表のようになっています。割り込みを受け付けると、そのときのPSWの値はスタックにセーブされ、受け付けた割り込みの優先度レベルに対応した値がISP0、1ビットにセットされます。このISP0、1の値はRETI命令を実行する(または、PSWを書き換える)までは保持され、優先度の低い割り込みの受け付けを禁止します。
ここで注意する必要があるのは、割り込み優先度レベル0の割り込み処理中(CPUの割り込み優先度がレベル0)に割り込み許可にすると、同じ優先度レベル0の割り込みは受け付けてしまうことです。これは、最優先の割り込みを処理中には、それ以上の割り込みは処理する必要がないことから、「割り込み
優先度レベル1の割り込み処理中には多重割り込みを
許可し、割り込み
優先度レベル0の割り込み処理中には多重割り込みを
許可しない」ことでレベル0〜3の割り込みの優先処理が可能です。
参考
V850では8レベルまでの割り込み優先度の制御が可能です。V850ではPSWではなく、8ビットのISPRレジスタ(リード・オンリーのレジスタ)により処理中の割り込み優先度を保持しています。割り込みを受け付けると、割り込み優先度に対応したビットをセットします。RETI命令の実行時にそのときにISPRレジスタのセットされたビットの中で最も優先度の高い割り込みに対応したビットをクリアします。この処理を行うことで、割り込み優先度を制御しています。
|
(3)割り込み優先度とレジスタ・バンク
78K0と78K0Rでは4組のレジスタ・バンクをもっています。これを利用することで割り込み処理を高速化することが可能です。レジスタ・バンクは多重で処理すべき割り込みの優先度に応じて設定してください。ただし、4組ではメイン処理を含めた5つのレベルには不足します。そこで、以下の例に示すように最低優先度の割り込みではレジスタ・バンクは使用しないで、使用するレジスタはプログラムでスタックにセーブします。
| ・メイン処理、レベル3の割り込み | | :レジスタ・バンク0を使用 |
| ・レベル2の割り込み | | :レジスタ・バンク1を使用 |
| ・レベル1の割り込み | | :レジスタ・バンク2を使用 |
| ・レベル0の割り込み | | :レジスタ・バンク3を使用 |
このような使い分けを行えるのは、同じ優先度の割り込みが多重で処理されることがないからです。
(4)多重割り込み
78K0Rでは多重割り込み処理を行うときには、単純に優先度の低い割り込み処理の中で割り込み許可にするだけです。
78K0の割り込み優先度の制御は2つのレベルだけです。優先度の高い割り込みを処理中に低い優先度の割り込みの受け付けを禁止できるだけなので、78K0Rのように簡単には実現できません。78K0では個々の割り込みのマスク機能を使って制御する必要があります。78K0で4レベルの(またはそれ以上の)優先度を使うための一例を以下に示します。
| 優先レベル | ISPの設定 | 割り込み処理でのマスクの制御、他 |
| レベル0(最優先) | 0(高優先) | 制御しない(割り込み禁止のまま) |
| レベル1 | 0(高優先) | レベル1の分のマスクをセット/クリア |
| レベル2 | 1(低優先) | PSWのISPビットをクリアする |
| レベル3(低優先) | 1(低優先) | レベル3の分のマスクをセット/クリア |
例えば、レベル1の割り込み処理では同じレベル1の優先度の割り込み(自分自身を含む)の割り込みマスクビットをセットしてから割り込み許可にし、自身の割り込み処理を行います。割り込み処理が完了したら、割り込み禁止にし、セットした割り込みマスクビットをクリアします。
レベル2の割り込み処理では、PSWのISPビットをクリアして割り込みを許可にし、自身の割り込み処理を継続します。処理が完了したら、RETIを実行します(RETI命令の実行によりPSWは元の値に復帰します)。
レベル3の割り込み処理では、同じレベル3の割り込みをマスクしてから割り込みを許可します(マスクする対象が異なるだけで、処理はレベル1と同じです)。
78K0Sでの多重割り込みの場合には、優先度は割り込みマスクで制御することになります。この場合に、どの割り込みのマスクをセットし、またクリアするかに注意が必要です。このため、多重割り込みを許す割り込み処理では、割り込み処理を開始した時点でのMK0及びMK1レジスタの値を読み出してスタックにセーブしてから書き換えます。その後割り込み許可にして自身の割り込み処理を行います。処理が完了したら、割り込みを禁止し、スタックからセーブしておいたMK0及びMK1の値を元に戻して、割り込みを完了します。
(2007/12)