8

デバッグ中に、次のエラー メッセージが表示されました。

Alignment trap: my_main (29858) PC=0x00170ad8 Instr=0xe5960008 Address=0x00f28daa FSR 0x0f3

少し調べてみたところ、この(リンク切れ) リアルタイム埋め込み Web サイトに関する多くの情報が見つかりました。これで、 and が何PCを参照しているかはわかりましたが、 andの部分Instrについてはまだ何も見つかりませんでした。AddressFSR

とはFSR? はどのアドレスAddressを参照していますか? proc/xxxx/mapsその住所によると、私のプログラムの範囲外ですらあります。最後の 2 つの項目の意味を知っている人はいますか? このアライメントの問題を解決するには、これらに関する情報が必要です。

MAP出力

00008000-001fe000 r-xp 00000000 03:02 16204      /home/myuser/my_main
00205000-00248000 rw-p 001f5000 03:02 16204      /home/myuser/my_main
00248000-00299000 rwxp 00248000 00:00 0
40000000-40018000 r-xp 00000000 03:01 2095       /lib/ld-2.3.3.so
40018000-4001b000 rw-p 40018000 00:00 0
4001f000-40020000 r--p 00017000 03:01 2095       /lib/ld-2.3.3.so
40020000-40021000 rw-p 00018000 03:01 2095       /lib/ld-2.3.3.so
40021000-40023000 r-xp 00000000 03:01 15724      /usr/lib/libem7.so.1.0.1
40023000-40029000 ---p 00002000 03:01 15724      /usr/lib/libem7.so.1.0.1
40029000-4002b000 rw-p 00000000 03:01 15724      /usr/lib/libem7.so.1.0.1
4002b000-40031000 r-xp 00000000 03:01 2057       /lib/tls/librt-2.3.3.so
40031000-40033000 ---p 00006000 03:01 2057       /lib/tls/librt-2.3.3.so
40033000-40038000 rw-p 00000000 03:01 2057       /lib/tls/librt-2.3.3.so
40038000-40039000 r--p 00005000 03:01 2057       /lib/tls/librt-2.3.3.so
40039000-4003a000 rw-p 00006000 03:01 2057       /lib/tls/librt-2.3.3.so
4003a000-4004a000 r-xp 00000000 03:01 2060       /lib/tls/libpthread-2.3.3.so
4004a000-40051000 rw-p 00008000 03:01 2060       /lib/tls/libpthread-2.3.3.so
40051000-40052000 r--p 0000f000 03:01 2060       /lib/tls/libpthread-2.3.3.so
40052000-40053000 rw-p 00010000 03:01 2060       /lib/tls/libpthread-2.3.3.so
40053000-40055000 rw-p 40053000 00:00 0
40055000-4010e000 r-xp 00000000 03:01 15703      /usr/lib/libstdc++.so.6.0.3
4010e000-40115000 ---p 000b9000 03:01 15703      /usr/lib/libstdc++.so.6.0.3
40115000-40119000 rw-p 000b8000 03:01 15703      /usr/lib/libstdc++.so.6.0.3
40119000-4011f000 rw-p 40119000 00:00 0
4011f000-401b7000 r-xp 00000000 03:01 2076       /lib/tls/libm-2.3.3.so
401b7000-401be000 rw-p 00090000 03:01 2076       /lib/tls/libm-2.3.3.so
401be000-401bf000 r--p 00097000 03:01 2076       /lib/tls/libm-2.3.3.so
401bf000-401c0000 rw-p 00098000 03:01 2076       /lib/tls/libm-2.3.3.so
401c0000-401c8000 r-xp 00000000 03:01 2005       /lib/libgcc_s.so.1
401c8000-401c9000 rw-p 00008000 03:01 2005       /lib/libgcc_s.so.1
401c9000-402cb000 r-xp 00000000 03:01 2078       /lib/tls/libc-2.3.3.so
402cb000-402d1000 ---p 00102000 03:01 2078       /lib/tls/libc-2.3.3.so
402d1000-402d2000 rw-p 00100000 03:01 2078       /lib/tls/libc-2.3.3.so
402d2000-402d4000 r--p 00101000 03:01 2078       /lib/tls/libc-2.3.3.so
402d4000-402d6000 rw-p 00103000 03:01 2078       /lib/tls/libc-2.3.3.so
402d6000-402d8000 rw-p 402d6000 00:00 0
402d8000-402e5000 rw-s 00000000 00:07 0          /SYSV12345678 (deleted)
402e5000-402e6000 ---p 402e5000 00:00 0
402e6000-402f5000 rwxp 402e6000 00:00 0
403c1000-4049d000 rw-p 403c1000 00:00 0
7efeb000-7f000000 rwxp 7efeb000 00:00 0
4

2 に答える 2

17
PC=0x00170ad8

これは、プログラム カウンターの現在の値を示しており、プログラム内のどの命令がトラップを引き起こしているかを判断するために使用できます。私が思うように ARM を使用している場合、これは実際には現在の命令に 8 を加えたものなので、トラップの原因となっている命令は にあり0x00170ad0ます。

Instr=0xe5960008

これは、フォルト命令のエンコーディングです。これがARM上にある場合、その命令はldr r0, [r6, #8]

Address=0x00f28daa

これは、プログラムがロードしようとしたアドレスを示しているため、エラーが発生しています。ここまでの他のすべてが正しいと仮定すると、これはr6 + 8であるため、障害時にr6保持されます。0x00f28da2

FSR 0xf3

これはフォルト ステータス レジスタに保持されている値です。どのような障害が発生したかを示します。この特定の値は、アライメント エラーの古いエンコーディング (ARMv7 より前) です。

于 2013-04-10T10:47:16.227 に答える
1

ほとんどの場合、お使いの CPU は、位置合わせされていないアドレスでの値のメモリからの読み取り/メモリへの書き込みをサポートしていません。4 バイトの変数にアクセスしている場合、明らかに Address=0x00f28daa は 4 の倍数ではありません。任意にアラインされたアドレスで読み書きできるのは 1 バイトだけです。

その記事はそれをよく説明しています。

于 2013-04-10T10:11:05.887 に答える