割込要求をクリアする奨励手順

AVR32のINTC(Interrupt Controller)でドキュメントに

割込要求をクリアする奨励手順は、周辺レジスタを制御するstore命令の後に、同一レジスタからのダミーload命令を続ける。これはパイプライン・ストールを引き起こし、割込要求がクリアされる前に割込マスクがクリアされ割込ハンドラが返るようなケースにおいて、偶然に再度割込が発生することを防止する。

と書いてあるとした。この点についての考察。



問題点は、store命令とrete命令が連続していて、割込をクリア→実際にハードウェアがフラグ・クリアするより早く、割込ハンドラが返ってしまう可能性があることだ。これはパイプラインと関係している。store命令がパイプラインの実行ステージ(EX)にあるとき、rete命令がデコード・ステージ(ID)にいてデコードが完了している可能性が高い。
EXステージが完了する前に、IDステージの命令がEXへ送られることは無いだろうから、割込要因がクリアされてもINTCへ伝達されるまでにかなりの遅延があるのだろう。
一方、rete命令の処理は

  • SR ← RSRCurrent Context
  • PC ← LRCurrent Context
  • SREG[L] ← 0

だけなのでSRレジスタ(の各割込マスク・ビット)が復旧した時点で即割込要求が発生するかもしれない(2009/11/08追記:これはちょっと間違い。AT32UC3B0256はAVR32Aアーキテクチャなので、割込レベル3〜0のときLR,R12〜8レジスタの復旧が挿入される)。
紹介されているクリア奨励手順のように、同一アドレスへアクセスするld命令を実行すると、クリアが実行されるまでld命令がEXステージで待たされる(ストール)ので、各割込マスク・ビットが復旧しても割込要求が発生しない。



これで問題は発生しないが、気になるのはストールした後、無意味なレジスタ読み出しを実行する点だ。割込ハンドラはできるだけ高速化するべきで、当たり前だが余計な命令を実行したくない。
対処方法としては、割込の本体処理に取りかかる前(あるいは出来るだけ早い段階)に割込要求をクリアすればいいはず。レベル・マスクが掛かっていて、同一レベル以下の割込は入らない。
相違があるとすれば、割込要求クリアから割込ハンドラ終了までの時間が拡がるので、再度割込要求フラグが立つ可能性が高まるくらいか。

ドキュメントの奨励方法通りにしなくてもいいよといいたいのだが、改めて読み直してみると、組み込みでは当たり前の話。