codesourcery の GNU Toolchain for ARM Lite Edition でプログラムしていて、ちょっとはまった点。
void foo(void) { u8 buffer[4] = {0,0,0,0}; }
といった、初期化を伴うローカル変数の配列を使ったら、そこで暴走した。
アセンブラソースを出力させて見たら、 この初期化のために memcpy() が呼ばれていた(そうなるとは思っていなかった)。
私は標準ライブラリは使う気がなかったので、標準ライブラリに対するケアを忘れていた。標準ライブラリがリンクされてるとすら思ってなかったが、当然のことながら .map ファイルを見るとリンクされてた。
codesourcery の GNU Toolchain for ARM で、デフォルトでリンクされる標準ライブラリは ARM命令のライブラリであり、Cortex-M3は、Thumb-2命令しか扱えないので、暴走するようだ。
codesourcery の GNU Toolchain for ARM には、Thumb-2命令で作られた標準ライブラリも用意されているので、そっちをリンクしたらちゃんと動いた。
ということでした。
コメント
この記事に書いてあることがヒントとなり、STM32のデバッグでハマっていた問題を解消することができました。
ありがとうございました!