4 years, 4 months ago.

HardFault code execution of SDRAM / SDRAMのコード実行でHardFault

This Question is continue of Can I execute code from SDRAM? / SDRAMに配置したコードを実行したい.

I can now execute from SDRAM. But, code execution is unstable .

breakpoint was placed in the assembler level. Then the code is executed as it was intended. I remove the breakpoint. Then HardFault occurs.

I think cause is different from the operating clock of SDRAM(60MHz) and MCU(120MHz). I have aligned them with 72Mhz. But symptoms did not change.

To me it was not possible causes other than the setting of the clock. Please help me.

Can I execute code from SDRAM? / SDRAMに配置したコードを実行したい の続きです。

上記質問のあと、SDRAM上のコードを実行ができるようになりました。 しかし、コードの実行が不安定です。

アセンブラレベルでブレークポイントをおいて逐次実行するとちゃんと動くのですが、 ブレークポイントなくすと HardFault が発生してしまいます。

SDRAMのクロック(60MHz)とMCUのクロック(120MHz)があっていないのが原因かと思い 試しに SDRAMもMCUも72MHzで揃えてみましたが、改善しませんでしたので、的外れだったようです。

とはいえ、他にブレークポイントの有無で挙動が変わる原因が想定できませんでした。 何か心当たりのある方いらっしゃいませんでしょうか。

HardFault しなくなるトリガーがわかりました。ブレークポイントの有無は関係なくて、 デバッガで Disassembly を実行したあとでSDRAMのコードを実行するとちゃんと動いて Disassembly せずに実行すると HardFault するようです…。

SDRAMにロードするコードのサイズを大きくすると Disassembly しても動かないので、これをすれば大丈夫。というわけでもなさそうです。

同クロックにしてもSDRAMがMCUについてこれていない可能性を考慮して SDRAMを最大クロックである80MHzに、MCUを最小クロックである12MHzにしてみましたが、症状は変わりませんでした。

posted by Kazutomo Niwa 23 Jul 2015

1 Answer

4 years, 4 months ago.

こんばんは。

メモリアクセスに関連しているようですので、DMB等のバリア命令を挿入してみては如何でしょうか? http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0321a/BIHBGGHF.html

ありがとうございます。逆アセンブルすれば問題なく実行できるけど 逆アセンブルしない状態で実行するとHardFaultするサイズのプログラムをSDRAMにロードしました。

SDRAMのエントリポイントにジャンプする前にバリア命令をいろいろなパターンで挿入してみましたが、 特に状況に変化はありませんでした。バリア命令は関係なかったのかもしれません。アドバイスいただいたのに申し訳ありません。

posted by Kazutomo Niwa 24 Jul 2015