math.hを使うには(解決)

Posted at 06/08/04 Comment(5)»

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を使う命令は出力されないようです。

とりあえずこれで計算モーションが動きはじめました。でも、まだ考え違いがあるようで足の振り上げ方がおかしいです。でも俄然やる気になってきました。

"math.hを使うには(解決)"へのコメント

CommentData » Posted by SISO at 06/08/05

最近はおとなしめのSISOです。こんばんは!

H8/TINYでの実装ですが…SIN、COS、ATAN、平方根を自前で実装しています。超高速でスタック食いません。shin1さんはどうやっているんでしょうねー。

あと、mathライブラリですが、doubleじゃなくてfloatで計算できるライブラリがあったような話をどこかで読んだ記憶が…スピードは格段に速かったと記憶しています。うーん、思い出せません…。

CommentData » Posted by りおーじあ at 06/08/05

SISOさん、おはようございます。
コメントありがとうございます。

>最近はおとなしめのSISOです。こんばんは!

新型機でサプライズ!だったりして(笑)
いろいろ大変なんでしょうけどぼちぼちやってくださいね~。

>H8/TINYでの実装ですが…SIN、COS、ATAN、平方根を自前で実装しています。超高速でスタック食いません。shin1さんはどうやっているんでしょうねー。

この辺みなさんどうやっているのか気になるところです。私も自前バージョンはあるのですが、とりあえずmath.hをつかったバージョンで進めていっています。以前にSISOさんが掲示板かなにかでちらと「計算のやり方、公開しようかなあ」といわれていたのを是非お願いしたい次第です。そのうちお暇ができたらよろしくお願いしまーす(ぺこり)。

>あと、mathライブラリですが、doubleじゃなくてfloatで計算できるライブラリがあったような話をどこかで読んだ記憶が…スピードは格段に速かったと記憶しています。

とりあえず、RAMがどうにもならなくなるまでは贅沢三昧で今回はいってみようかと思います。今のところdoubleを使っているのですがやはりCPUや周辺回路ごとで違うと思いますのでこの辺はfloatにしたり、固定小数点で計算したりするんだろうと思います。

それでは!

CommentData » Posted by shin1 at 06/08/07

こんにちはshin1です。 コメント遅れてしまってすみません。

自分もmath.hを試してみた事在るのですが、三角関数を計算するだけでいっぱいいっぱいで、しかも呆れるほど遅くて「これは使えないな」ってことで関数を自前で作りました。

作ったのは「sin,cos,ATAN、ATAN2、平方根」とSISOさんとほぼ同じです。 でも、以前のHDDトラブルの時に見事に消失してしまったのでこのあたりもこれから復旧させねばなりません(笑)

あとSISOさんのコメントの「double型で計算できるmathライブラリ」って興味津々です。

それではまた。

CommentData » Posted by shin1 at 06/08/07

float型の間違いです。↑

CommentData » Posted by りおーじあ at 06/08/07

shin1さん、こんばんは。
コメントありがとうございます。

>自分もmath.hを試してみた事在るのですが、三角関数を計算するだけでいっぱいいっぱいで、しかも呆れるほど遅くて「これは使えないな」ってことで関数を自前で作りました。

ARM7では劇的に遅いといった風には感じられませんでした。やはりARM7は処理速度が速いのだと思われます。60MIPSですし。

float型のmathライブラリというのはatanfとかsqrtfみたいに後ろにfをつけたもののようです。さらに高速なものとしてfastmath.hというエラーチェックをしないものもあるようです。使ったことはありませんがご参考まで。

それでは~。

"math.hを使うには(解決)"へコメントを投稿

(運営者が承認するまではコメントは表示されません。しばらくお待ちください。)

上の情報を保存する場合はチェック

スポンサードリンク