2017-02-26 4 views
0

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の回避策を避けてください。

+0

'ldmia'がスタックからロードされ、スタック上に何が表示されていないかを示します。スタック上のデータが破損していると、命令が正しく動作している可能性があります。 – Jester

+0

サム命令はその多くのレジスタを許可しませんが、thumb2(armv7m)拡張命令はそのレジスタを許可します。テキストが元のものであると仮定した逆アセンブラは、そうでない場合はすべてのレジスタを表示しませんでした。そしてあなたが指摘したように、PCは悪いので、ldmiaはPCを変更しています。そして、Jesterが指摘しているように、PCはおそらくスタックに悪いです。命令の前にスタックをダンプし、スタックに含まれているものを確認します。 –

+0

命令の前には 'sp 0x7ffe0'だけが重要です。他のレジスタをなぜ投稿したのかは不明です。あなたは代わりに '' Stmia'を積み重ねることをしたくなかったのですか?もしそうでなければ、これより先のコードはすでに十分な値をスタックに入れておかなければなりません。 – Ped7g

答えて

2

命令(およびその効果)は絶対に正しいです。しかしspの前にこの命令は絶対に間違っています。あなたのチップはそのアドレスにRAMメモリを持っていません。実際には、このアドレスにはおそらくメモリが全くありません。マニュアルの32ページ(メモリマップを参照)を参照してください。

http://www.atmel.com/Images/Atmel-6430-32-bit-Cortex-M3-Microcontroller-SAM3U4-SAM3U2-SAM3U1_Datasheet.pdf

あなたspは、SRAM内のどこかでなければなりません0x20000000上記のようにします。あなたが持っている値は - 0x7ffe0で、 "Boot memory"のどこかにあります。問題を見つけるには、なぜspに無効な値があるのか​​を調べます。

関連する問題