JTAG コネクタと gdb を使用してベアメタル ARM (v5TE 準拠) でプログラムを実行しています。プログラムはスーパーバイザー モードで一部の SDRAM から実行され、アーム命令のみを使用します。
ある時点で例外が発生します。ctrl+CI で gdb を停止すると、CPSR が未定義の例外モードを示していることを確認できますが、プログラム カウンターはソフトウェア割り込み例外を示しています ( 0xffff0008
)。ARM ARM によると、未定義命令例外が発生した場合、 はまたはであるPC_und
必要があります。SWI が発生したか、または未定義の命令例外が発生しましたか?0xffff0004
0x00000004
私の質問をより明確にするために編集してください:
私のプログラムの目的は、カスタム ボードのハードウェアをテストすることです。ハードウェアに問題がある場合、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]