« A/D変換機能死亡のお知らせ | トップページ | A/D再び死亡 »

計算機初心者

本日は割り込みについて記述していました。

10kHz周期で割り込みルーチンを書いていたんですが…
なぜか順調に動いていたプログラムが1行追加するだけでとまる。
きれいにとまる。

…結論としてはこの問題は解決しましたが、だいぶ悩みました。

----------切り取り-------------

割り込みルーチンに追加したソースは以下のようなコード

-----
YiR = IG * (iR * ADTV - VcoR);        //現在の電流値を算出した
YiL = IG * (iL * ADTV - VcoL);        //現在の電流値を算出した
-----

ただ引き算と乗算を使っているだけである。

しかしただの乗算…なぜ10kHzで動かないのだろうか、と考えていたところ次のことに気がついた。

・変数はすべてdouble型であること。

double型…倍精度浮動小数点数だが、あまり変わったことはない。
CPUにハードウェアで乗算器が実装されていればそれほど時間がかかるものではない。
SH7144では事実データシートに32bit×32bitの乗算を2~4ステートで実行すると書いてある。

それでは32bit×32bitの乗算を行っているか?
答えは否。

SH7144+GDLではdoubleが64bit長、floatが32bit長であった。
これはsizeof演算子をつかって実際に調べたから間違えはないはずである。
doubleの乗算では64bit×64bitの乗算である。

このことから変数をdouble→floatに変えた。
すると割り込みが復活し正常にルーチンが動作し始めた。
しかしそれでも計算時間に以上に時間がかかっている。0.06msぐらいだろうか。
10kHzで駆動するにはあまりにも遅い。

そこでさらに次の事実に気がついた。

・浮動小数点数の乗算はきわめて遅い

ということ。詳細は省くが、とても2~4ステートなんかで実行できるような処理ではない。
(浮動小数点の乗算は仮数部と指数部についてそれぞれ別々に処理をするため)
2~4ステートで計算できるのは整数型(int型)である。

floatをintに変更したところでやっと高速に処理できるようになった。

やっぱりブランクがあるとだめですね。
こんな簡単なミスで数時間無駄にしましたorz

|

« A/D変換機能死亡のお知らせ | トップページ | A/D再び死亡 »

ロボット」カテゴリの記事

コメント

マイコン張替成功したんか??

浮動小数点の計算は遅いから、intで桁落ちが気になる時は、必要な桁落ちの分だけ前もって10倍とか100倍とか掛け算してるwink

投稿: ぺんた | 2009年11月10日 (火) 22時33分

コメありがと
マイコン張替えはQFPの足をカッターでザクザク切り取るという荒業で15分くらいで張替え完了したwwww

掛け算はペンの言う方法を採用したよ。
とにかく早いねw

投稿: さとぅー | 2009年11月13日 (金) 03時49分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1213530/32136404

この記事へのトラックバック一覧です: 計算機初心者:

« A/D変換機能死亡のお知らせ | トップページ | A/D再び死亡 »