投機的ロードとデバッグ

図を見てください。これはTOPPERS/JSPの割り込みハンドラのエントリー部です。ステップ実行でこの位置に来たときに出力ウインドウに次のメッセージが現れました。

Dag0 Prot Violation !32 bit access

DAG0で保護違反が発生しています。32ビット・アクセスにからむ違反のようです。改めてプログラムを見直しましたが間違いがあるようには思えません。いったいどうしたことでしょう。

実はこの保護違反はまだ実行していない命令はずのが引き起こすものです。このエラーを起こしているのは3ステップ先の16ビットロード命令です。この命令はIPENDレジスタからロードを行うのですが、IPENDが32ビットであるにもかかわらず16ビットロード命令を使っています。これが保護違反を引き起こします。問題はなぜ未来の違反が今報告されているかということです。

これはBlackfinの投機ロードによるものです。Blackfinはロード命令と演算の間の依存性によるストールを避けるために、ロード命令は実際の命令がパイプラインの実行ステージに到達するより早く、パイプラインの中ほどで実行してしまいます。しかしながら条件分岐命令がパイプラインをフラッシュする可能性があるため、ロード結果が反映されるのは実際に命令が実行ステージに到達してからになります。このように条件分岐命令の実行が確定する前に行うロード動作を投機的ロードと呼びます。

投機的ロードの結果、保護違反は実際に命令が実行される前に発生します。これが出力ウインドウに表示されるメッセージです。この段階では違反は起きていますが、ロード命令がまだ投機状態であり実行されるかどうかはわかりません。そのため例外も保留され、命令の実行を待って発生します。

ステップ実行しながらデバッグを進めるとこのメッセージには非常に混乱させられます。注意してください。

Blackfin空挺団 | プログラム | EZ-KIT | コア&ペリフェラル | TOPPERS/JSP | こぼれ話 | DSP掲示板