質問: ### 前提・実現したいこと 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
回答: ユーザプログラム実行中に割り込み/例外が発生すると、レジスタ内容がスタックにpushされるので、そのような症状になると思います。 問題が発生した時、スタックポインタはどのへんのアドレスを指していますか? また、スタックポインタ初期値をずらした場合、問題が発生するアドレスも変化しませんか?