データ アボート例外の分析方法
適用先: ARM 開発ツール
回答
この記事に含まれている情報の適用先:
- ARM の全バージョン
質問
シミュレータ、または JTAG デバッガ(ULINK)を使用して実行すると、プログラム カウンタ(R15)がラベル DAbt_Handler?A にジャンプしています。これは何を意味しているのでしょうか? アプリケーションの問題が発生している場所を見つける方法を教えてください。
回答
これは初期設定によるデータ アボート例外ハンドラです。アプリケーションは不正なメモリ位置の読み出しまたは書き込みを試行しています。不正なメモリ位置は R14(リンカ レジスタ)の値から 8 を差し引くことによって計算できます。8 を差し引くことで命令キューが調整され、この例外の原因になった命令のアドレスが得られます。
以下に例を示します。
- R14 の値を 0x0000021e とします。
- 0x0000021e - 8 = 0x00000216。例外の原因になった命令はアドレス 0x00000216 にあります。
- Unassemble デバッグ コマンドを使用して、この命令を逆アセンブルします。この例の場合、[Output] ウィンドウ→[Command] タブで U 0x00000216 と入力します。
- 逆アセンブリ ウィンドウには、R1=0x000001bc を持つこのアドレスの命令 STRB R3,[R1,#0x00] が表示されます。R1 の値はオンチップ フラッシュ領域(Philips LPC2000) を示し、書き込むことはできません。アセンブリ ウィンドウで、この行を右クリックし、[Show Source Code for current Address] を選択してソース コードを表示します。ポインタに間違ったアドレスが読み込まれたものと考えられます。
詳細
- Getting Started User's Guide for ARM Powered Microcontrollers
- µVision User's Guide を参照してください。
関連項目
- CARM: PERIPHERAL REGISTER ACCESS CALLS DABT_HANDLER
- GENERAL: PRE-FETCH ABORT