ARM Cortex-M3ベアメタル上でコンパイルしたプログラムを実行しようとしています。システムがアプリケーションコードに到達する前に、奇妙なエラーがプログラムカウンタを吹き飛ばし、エラーを出します。命令の前LDMIA命令の結果、レジスタデータが破損する
は、レジスタがあることが観察された:爆発
0x829c <__call_exitprocs+112>: ldmia.w sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc}
およびレジスタが読まれている:
r0 0x0 0
r1 0x1 1
r2 0x0 0
r3 0x2 2
r4 0x18564 99684
r5 0x18418 99352
r6 0x0 0
r7 0x0 0
r8 0x8311 33553
r9 0x0 0
r10 0x0 0
r11 0x0 0
r12 0xc84404 13124612
sp 0x7ffe0 0x7ffe0
lr 0x80df 32991
pc 0x8380 0x8380
次の命令が名目実行されます。また、プログラムカウンタをオフにして、プログラムを効果的に終了させます。
...
r3 0x2 2
r4 0xffffffff 4294967295
r5 0xffffffff 4294967295
r6 0xffffffff 4294967295
r7 0xffffffff 4294967295
r8 0xffffffff 4294967295
r9 0xffffffff 4294967295
r10 0xffffffff 4294967295
r11 0x0 0
...
pc 0xfffffffe 0xfffffffe
私はa similar issue on stack overfflowを読んだが、私がここに直面しています直接の問題ではないようです。 The ATMEL documentation for this boardでは、一目で一度に読み込まれる内部レジスタの数に制限はありません。
問題を考えて、可能であれば、gccの回避策を避けてください。
'ldmia'がスタックからロードされ、スタック上に何が表示されていないかを示します。スタック上のデータが破損していると、命令が正しく動作している可能性があります。 – Jester
サム命令はその多くのレジスタを許可しませんが、thumb2(armv7m)拡張命令はそのレジスタを許可します。テキストが元のものであると仮定した逆アセンブラは、そうでない場合はすべてのレジスタを表示しませんでした。そしてあなたが指摘したように、PCは悪いので、ldmiaはPCを変更しています。そして、Jesterが指摘しているように、PCはおそらくスタックに悪いです。命令の前にスタックをダンプし、スタックに含まれているものを確認します。 –
命令の前には 'sp 0x7ffe0'だけが重要です。他のレジスタをなぜ投稿したのかは不明です。あなたは代わりに '' Stmia'を積み重ねることをしたくなかったのですか?もしそうでなければ、これより先のコードはすでに十分な値をスタックに入れておかなければなりません。 – Ped7g