math.hの件ですが、解決しました。なんともありがちなスタックのオーバーフローが原因だったようです。結局、自前でsqrt,atanなどの関数を用意してデバッグをはじめていたのですが、挙動がおかしいのです。グローバル変数が動かしているうちにどんどん破壊されていきます。グローバル変数をどのファイルにおくかといった配置によって同じ変数でも破壊されたりされなかったりします。グローバル変数でvolatileをつけていない部分もありvolatileを片っ端からつけていきましたがやはりグローバルデータが一部破壊されていきます。これがスタックがオーバーフローしている可能性が高いと思った理由です。
具体的にはどうしたかというとC:\EZ-ARM\_commonにあるlpc2138.ldというファイルの
/* Memory Definitions */
MEMORY
{
CODE (rx) : ORIGIN = 0x00000000, LENGTH = 0x00080000
DATA (rw) : ORIGIN = 0x40003000, LENGTH = 0x00001000
}
を
/* Memory Definitions */
MEMORY
{
CODE (rx) : ORIGIN = 0x00000000, LENGTH = 0x00080000
DATA (rw) : ORIGIN = 0x40005000, LENGTH = 0x00001000
}
のようにしました。
LPC2138のRAM領域は0x40000000から始まっていますので0x3000(12kB)をスタックに割り当てていたことになっていたと思うのですが、これを0x5000(20kB)にまで増やしました。解釈は間違っているのかもしれませんが、とにかくこれでグローバルデータの破壊の問題もmath.hにある関数を使うとまともなバイナリができない問題も解決しました。スタックってこんなに積みあがるのかなあ?といった疑問もありますが結果として動作するようになったのでたぶんそういうことなんでしょう。贅沢ですねRAMが32kBもあるって。SISOさんやshin1さんをはじめH8/Tinyで計算歩行をしている方々はかなり苦労されているのではないかと推測します。
アドバイスをくれた森 秀樹さん、ぐ~たらパパ・おかださん、ありがとうございました。森さんからアドバイスをいただいたsoft-floatのオプション設定もやってみましたが挙動は変わりませんでした。LPC2138にFPUはありませんがデフォルトではFPUを使う命令は出力されないようです。
とりあえずこれで計算モーションが動きはじめました。でも、まだ考え違いがあるようで足の振り上げ方がおかしいです。でも俄然やる気になってきました。
最近のコメント