ベアメタルのMicroBlazeを用いたデザインの実装中に、QSPIメモリにアクセスするとソフトがフリーズしてしまう現象に遭遇した。 詳しく解析してみると、どうやら外部スイッチの割り込みの処理中にQSPIメモリへアクセスすると確定で再現するようであった。 QSPIメモリへのアクセス時には割り込み処理が発生することから割り込みのネストあたりが原因だろうと検討をつけて調べたところ、 割り込みのネストを行うために必要な設定がされていなかったことがわかった。
MicroBalzeで割り込みのネストを行うためには、下記2つの設定を行う必要があるようだ。
1. 2回目に発生する割り込み信号の優先度を上げておく。
割り込み信号は下位bitの方が優先度が高く、割り込みをネストする際はより優先度の高い割り込みを行う必要がある。 動作確認した系では割り込み信号の[0]をQSPIの割り込み信号、[2]を外部スイッチの割り込み信号としている。
2. AXI Interrupt ContorollerのInterrupt Level Registerを有効化する。
IPの設定を開いてAdvancedタブを見るとデフォルトではEnable Interrupt Level Registerのチェックが外れているため、このチェックを入れる。
上記2点をちゃんと設定して再度動作確認したところ、QSPIアクセス時のフリーズが発生しなくなった。