Cortex-Mのハードフォルトのデバッグ
テクニカル・ノート 23721
アーキテクチャ:
ARM
コンポーネント:
debugger
更新日:
2017/11/07 4:25
はじめに
このテクニカルノートは、IAR Embedded Workbench for Arm を使用して ハードフォルト エラーのデバッグを行う方法を説明します。
用語ハードフォルトについて
ハードフォルトは、他の例外処理のメカニズムで処理できないフォルトです。一般的に回復不能なエラー処理に用いられます。
解説
以下の例で、さまざまなフォルトの事例を説明します。
例 1: オーバークロックのチップ
この例では Cortex-M3 ボードのクロックが非常に高い周波数に設定されています。
そのため、通常の速度では問題ないプログラムでも、不特定の場所で ハードフォルト例外が発生します。
コールスタックウィンドウでは、ハードフォルトが発生したときに実行されたコード行を確認できます。
レジスタウィンドウのNVIC:CFSR (コンフュギュラブル・フォルト・ステータス・レジスタ) でIMPRECISERR=1 を確認することができ、不正確なデータアクセスエラーが発生したことがわかります。(バスフォルト ステータスレジスタ, BFSR).
エラーは不正確であるため、問題のあるデータアクセスのアドレスを特定することはできません。 このケースでは、CPUが不適切な周波数で動作しているため、問題の実際の原因を見つけるのは非常に困難です。以下のスクリーンショットを参照してください。
例2: 0による割り算
この例では、CCRレジスタのDIV_0_TRPビットを有効にして、0による割り算のエラーを検出する方法を示しています。コールスタックウィンドウで、無効な割り算を行ったソースコード行を確認することができます。レジスタウィンドウでは、 NVICのCFSRレジスタのDIVBYZEROがセットされているのを確認できます。以下のスクリーンショットを参照してください。
例3: 不正なアドレスへのアクセス
この例では、不正なアドレスがアクセスされています。コールスタックウィンドウで、どこで不正なアクセスが発生したかが分かります。レジスタウィンドウで、 NVICのCFSRレジスタのフラグがPRECISERRを示しています。データアクセスエラーが発生し、プロセッサがBFARレジスタに間違ったアドレスを書き込んでいます。下のスクリーンショットを参照してください。
例4: コードが実装されていない場所にブランチ
この例では、不正な関数ポインタが呼ばれています。レジスタウィンドウで、NVIC.CFSRのフラグUNDEFINSTR=1 すなわちプロセッサが、未定義の命令を実行しようとしたことを示しています。
コールスタックウィンドウで、どこから不正な命令が呼ばれたかが分かります。
引き続き、いくつかのデバッグ方法があります。
1. 不正な命令にブレークポイントを設定し、もう一度プログラムを走らせます。ブレークポイントに到達したら、コールスタックウィンドウを使用し、呼び出した関数を特定します。
2. レジスタウィンドウを使用し、 CPU:LR レジスタを調べると、前回呼び出したところがどこか分かります。逆アセンブルウィンドウのLRレジスタのアドレスを使用し、そのアドレスに "Go to"します。これは、前回呼び出した場所です。下のスクリーンショットを参照してください。
デバッグツール
アプリケーションで発生したハードフォルトの種類を簡単に特定するために、ARM用IAR Embedded Workbench for ARMの最新バージョンで使用できる表示 > 障害例外ビューア ウィンドウがあります。
レガシーバージョンでは、デバッガマクロファイルがあります。 マクロファイルは、下記インストールディレクトリにあります。
arm\config\debugger\ARM\vector_catch.mac
表示 > マクロ > マクロ登録 を選択して、マクロをロードすることができます。 ハードフォルトがトリガされると、マクロはデバッグログウィンドウで有用な出力を生成します。 以下のスクリーンショットを参照してください。
注記
注 1)
レジスタウィンドウの情報は、使用する Cortex-Mデバイスの種類により、上のスクリーンショットと異なる場合があります。Cortec-M0は他のCortex-Mデバイスで使用可能なフォルトステータスレジスタをすべて備えていません。
注 2)
フォルトハンドラに複雑なコードがある場合は、ハンドラの早い段階でブレークポイントを設定することをお勧めします。これにより、実行が続行されるときにレジスタやバッファが重要な情報を失わないようにします。 ブレークポイントをハンドラの早い段階に設定することで、フォルトハンドラが呼び出されるとすぐに実行が停止します。
注 3)
上記の情報は、Traceを使用して問題をデバッグする方法については説明していません。
www.iar.com の Resources セクションの、トレースの記事を参照してください。
まとめ
ハードフォルトをデバッグはIAR Embedded Workbench for Armでいくつかの方法とウィンドウを使用して、行うことができます。
ハードフォルトの原因を簡単に見つけるために Fault exception viewer デバッガマクロファイルも利用できます。 フォルトの詳細については " Cortex-M3 Devices Generic User Guide" の “Fault types”章をご参照ください。
全ての製品名は、それぞれの所有者の商標または登録商標です