4

JTAG コネクタと gdb を使用してベアメタル ARM (v5TE 準拠) でプログラムを実行しています。プログラムはスーパーバイザー モードで一部の SDRAM から実行され、アーム命令のみを使用します。

ある時点で例外が発生します。ctrl+CI で gdb を停止すると、CPSR が未定義の例外モードを示していることを確認できますが、プログラム カウンターはソフトウェア割り込み例外を示しています ( 0xffff0008)。ARM ARM によると、未定義命令例外が発生した場合、 はまたはであるPC_und必要があります。SWI が発生したか、または未定義の命令例外が発生しましたか?0xffff00040x00000004

私の質問をより明確にするために編集してください:

私のプログラムの目的は、カスタム ボードのハードウェアをテストすることです。ハードウェアに問題がある場合、RAM 内のプログラムが破損している可能性があり (以下に示すように)、例外が生成される原因となります。ハードウェアが正常な場合、テスト ソフトウェアは問題なく動作します。RAM アドレスの範囲は 0 から 0x40000000 で、プログラムは 0x1000 から 0x2000 の間にロードされます。スーパーバイザ モードのスタック ポインタは 0xff0 に設定されます。中断ベクトルは、ブレークポイントのみで構成されます。

(gdb) c
Continuing.
^C^C
Program received signal SIGTRAP, Trace/breakpoint trap.
0xffff0008 in ?? ()

未定義の例外モードから登録します。

(gdb) i r 
r0             0x52878  338040
r1             0x2020000    33685504
r2             0x2020000    33685504
r3             0x2020000    33685504
r4             0x2020000    33685504
r5             0x2020000    33685504
r6             0x2020000    33685504
r7             0x2020000    33685504
r8             0x2020000    33685504
r9             0x2020000    33685504
r10            0x2020000    33685504
r11            0x2020000    33685504
r12            0x2020000    33685504
sp             0x2020000    0x2020000
lr             0xffff0008   4294901768
pc             0xffff0008   0xffff0008
fps            0x0  0
cpsr           0x800000db   2147483867

スーパーバイザー モードからの登録:

(gdb) set $cpsr=0xd3
(gdb) i r
r0             0x52878  338040
r1             0x2020000    33685504
r2             0x2020000    33685504
r3             0x2020000    33685504
r4             0x2020000    33685504
r5             0x2020000    33685504
r6             0x2020000    33685504
r7             0x2020000    33685504
r8             0x2020000    33685504
r9             0x2020000    33685504
r10            0x2020000    33685504
r11            0x2020000    33685504
r12            0x2020000    33685504
sp             0xff3ffffe   0xff3ffffe
lr             0x1020   4128
pc             0xffff0008   0xffff0008
fps            0x0  0
cpsr           0xd3 211 

スーパーバイザ リンク レジスタが指すアドレス周辺の RAM 内の (破損した) プログラムを次に示します。

(gdb) x/5i 0x1020-8
0x1018 <_start+24>: bic r0, r0, #135168 ; 0x21000
0x101c <_start+28>: strbcs  r0, [r0], #1025
0x1020 <_start+32>: mcr 15, 0, r0, cr1, cr0, {0}
0x1024 <_start+36>: ldr r1, [pc, #120]  ; 0x10a4 <skip_intreg_reset+100>
0x1028 <_start+40>: ldr r2, [r1, #8]

(gdb) x/4w 0x1018
0x1018 <_start+24>: 0xe3c00a01  
0x101C <_start+28>: 0xfec00401
0x1020 <_start+32>: 0xee010f10  
0x1024 <_start+36>: 0xe59f1078

プログラム オブジェクト ファイルからのダンプ:

  18:   e3c00a01    bic r0, r0, #4096   ; 0x1000
  1c:   e3c00001    bic r0, r0, #1  ; 0x1
  20:   ee010f10    mcr 15, 0, r0, cr1, cr0, {0}
  24:   e59f1078    ldr r1, [pc, #120]  ; a4 <skip_intreg_reset+0x64>
  28:   e5912000    ldr r2, [r1]
4

1 に答える 1

4

これはコミュニティ wikiの回答です。

この問題は、次の 2 つの異なる問題によって引き起こされました。

  • 誤ったベクター テーブルが初期化されていました。ARM には選択可能な高ベクトルと低ベクトルがあり、高0xffff0000がデフォルトでしたが、コードはベクトル テーブルが にあるかのように初期化されました0x00000000。高位ベクトル テーブルには、次の命令が含まれていました (例外の無限ループ)。
0xffff0000: b 0xffff0020 
0xffff0004: b 0xffff0004 
0xffff0008: b 0xffff0008 
0xffff000c: b 0xffff000c 
0xffff0010: b 0xffff0010 
0xffff0014: b 0xffff0014 
0xffff0018: b 0xffff0018 
0xffff001c: b 0xffff001c
  • ボード上の SDRAM の問題により、RAM のプログラム コンテンツが破損し、未定義の例外が生成されました。その後、プログラムは無限ループにあったため応答を停止し、OP は gdb を停止しました。使用されている JTAG デバッガー (peedi) は、gdb が で停止するとctrl+C、実際には次の命令にジャンプします。pc0xffff0008cpsr0xffff0004
于 2013-03-25T02:06:40.577 に答える