STM32 (Cortex-M3) GCCでちょっとはまった(変数初期化に memcpy()が使われる場合があるので…)

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命令で作られた標準ライブラリも用意されているので、そっちをリンクしたらちゃんと動いた。

ということでした。

コメント

  1. さとぅー より:

    この記事に書いてあることがヒントとなり、STM32のデバッグでハマっていた問題を解消することができました。
    ありがとうございました!

タイトルとURLをコピーしました