2012/07/18

[os]自作関数を呼ぶと、CPU例外が起きた

TOPPERS/ASP用に、今までC++で作っていたライブラリをCに置き換えた。
ラッパだけ作ろうかと思っていたのだが、ASPでC++が動くかどうかよくわからなかったので、いつかやろうと思っていたこともあり、移植したのだ。

全部じゃないけど、RC-S620/SからACKが返ってきそうなコマンドの実装が終わったので、組み込む。
ライブラリなので、arm-none-eabi-arでまとめて.aファイルにし、リンク。

途中、memcpy()類がないということで怒られ、newlibを入れようかどうしようか迷ってビルドまで通しかけたものの、遅くてもいいや、ということで自前実装した。
NFCIDの生成にrand()も使ってたのだけど、そっちはもう固定値にした。
通ればよかろう、なのだ。


リンクが通ってasp.exeもできたので、TINY-Hを使って焼き、実行。

うん、CPU例外が発生するね。

default_exc_handler()の中でexcnoに例外番号が入る。
これは「例外のタイプ」らしく、私は3になった。

3は、ハードフォールト。英語で書くと、HardFault。
うーむ。

 

こういうときは、逆アセンブル表示させて細かく追おう。
これが、飛ぶ寸前のところ。

image

blx ?
Cortex-M3のことで検索すると、しばしば出てくるような気がする。

http://morizzos-buglife.blogspot.jp/2011/11/gcccortex-m3.html

ああ、blxというのはCortex-M3では使えないらしい。


gccで

  • -mcpu=cortex-m3
  • -mthumb
  • -mthumb-interwork

くらいをつければよさそうだ

 

これがまた、なかなかうまくいかなくてねぇ。

`-mcpu=' is deprecated. Use `-mtune=' or '-march=' instead.
cc1plus: error: bad value (cortex-m3) for -mtune= switch

などといわれるので、ずっとあーだこーどやってた。
しかし、ここで文句を言っているのはcc1plus、コンパイルする前らしい。
そういえば、依存関係のために-MMしてたなあ。

というわけで、-MMのときにはインクルードパスの設定だけ渡して、コンパイル時に-mcpuなんかを渡すようにした。

 

image

blxもなくなった。

実行すると、CPU例外を起こさなくなった。
・・・起こさなくなっただけで、まだまだうごかんねー。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。