###前提・実現したいこと
Cortex-M3マイコンでRAMの動作チェックのために、RAMの全アドレスについて、値を書き込んでから読み取りそれらが一致するか確認する、ということを繰り返すコードを書いています。
###発生している問題・エラーメッセージ
デバッガで実行し途中までは問題なく進むのですが、RAMアドレス0x20002dec
まで進むと、なぜか汎用レジスタの値?がRAMメモリに書き込まれており、そのせいで値が一致せずNGになります。
例えば下記ram_test_3
において、r2
の値をRAMに書き込んでいるのでそのアドレスの値は0x00000000
になるはずですが、いつの間にかr0
の中身らしき0x20000000
という値が書き込まれており、そのせいでRAMから読み出したr3
の値が0x20000000
になってしまい、r2
と一致せずNGになります。
なお、いつの間にか書き込まれているのはr0
だけではなく、アドレス0x20002dec
から、値0x55555555
やr0
、r1
、r4
(lr?
)、PC?
などの中身が続けて書き込まれています。
ステップ実行だとそのようなことは起こらず、一気に実行すると上記のことが発生します。
このように、レジスタの値らしきものが勝手にRAMメモリに書き込まれている現象について、なにかご存知の方はいらっしゃいますでしょうか。
###該当のソースコード
ldr r0, =0x20000000 ldr r1, =0x20007fff mv r4, lr //リンクアドレス退避 mv r6, r0 //開始アドレス mv r7, r1 //終了アドレス ram_test_1 ldr r2, =0x55555555 //書き込み値の格納 str r2, [r6] //RAMメモリに書き込み ldr r3, [r6] //RAMメモリから読み込み cmp r2, r3 //値の比較 beq ram_test_2 //値が等しければ問題ないので次へ b . //値が異なれば無限ループに入りここで停止 ram_test_2 ldr r2, =0xaaaaaaaa //同じことを別の書き込み値で繰り返す str r2, [r6] ldr r3, [r6] cmp r2, r3 beq ram_test_3 b . ram_test_3 ldr r2, =0x00000000 //同じことを別の書き込み値で繰り返す str r2, [r6] ldr r3, [r6] cmp r2, r3 beq ram_test_ok b . ram_test_ok add r6, r6, #4 //アドレスを進める cmp r6, r7 //現在のアドレスと終了アドレスを比較 bcs ram_test_exit //終了アドレスまで到達していれば終了 b ram_test_1 //まだなら次のアドレスで同じことを繰り返す ram_test_exit //終了 END
###補足情報(言語/FW/ツール等のバージョンなど)
マイコン:TMPM370シリーズ
開発環境:IAR EWARM
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/16 11:47
2017/09/19 10:38