ColdFire V1 で多重割り込みを禁止するには [ColdFire (ColdeFire) V1]
68000は、本質的に多重割り込みが出来るように設計されているのですが、 プログラムを書くほうは対応する心づもりがありません。 MCF51QE128の場合、RAM容量が少ないので、 多重割り込みでスタックの予定容量を超えてしまったら即暴走と言う事態になりかねません。 さて、どうやって、多重割り込みを防ごうか。
多重割り込みを禁止する方法は、MCF51QExxのリファレンスマニュアルの Chapter 8 Interrupt Controller にある 8.6.1 Emulation of the HCS08's 1-Level IRQ Handling に書いてあります。
- ISRの最初の命令として、 STLDSR #$2700 を実行せよ。
- ISRの最初の命令として、 MOVE.w #$2700,SR を実行せよ。
ColdFireは、割り込みサービス・ルーチン (Interrupt Service Routine : ISR) の 最初の命令だけは、割り込みを受け付けない仕様だそうです。 そのため、最初の命令で割り込みマスクレベルを7に設定すれば, マスク不可割り込み (Non-Maskable Interrupt : NMI) 以外の割り込みが 発生することはありません。 とはいっても、 Status Register (SR) の割り込みマスクだけを 7 に設定する 気の利いた命令は ColdFire V1 には、ありません。 そこで、 SR 全体に定数を書き込むことになります。
STLDSR 命令は、 SR をスタックに積んでから定数を設定しますので、 例外発生前の CCR の部分を取り戻すこともできます。 でも、よく考えたら、例外発生前の SR の値は元々スタックフレームに入っているから、 いくらでも取り戻せるんですよね。
多重割り込みを起こさせないためには、もう一つ効果的な方法があります。
- CPUCR レジスタの IME ビットをアサートせよ。
このビットをアサート(セット)すると、 割り込みが発生したときに割り込みマスクに 7 を入れてくれるので、 NMI 以外の割り込みは発生しません。 しかも、 ISR に妙な命令を入れなくて済みます。 なんだ、これでいいじゃん。
コメント 0