(toppers-users 2280) Re: 雑談:割り算と条件分岐

Seiichi Miyagawa miyagawa @ sanritz.co.jp
2006年 2月 1日 (水) 14:17:36 JST


こんなときしか出てこない 宮川です。

 //---[(toppers-users 2276) 雑談:割り算と条件分岐]
//----[2006/01/31 From:酔漢]

|> JSP 1.4.2 カーネルのソースを眺めていて面白いコードを見つけたので、皆さん
|> の息抜きになればと思い投稿しました。忙しい方は飛ばしてください。すみません。

こんなの好きです。

|> next_subtime += ( TIC_NUME % TIC_DENO );
|> next_time = current_time + ( TIC_NUME / TIC_DENO )
         :
|> といったコードもご検討ください。コンパイラがきちんとしていれば、割り算を
|> 使わないコードを生成してくれます。

確かに、コンパイル時点で定数にしてしまいますね。
TOPPERSの利用システムは小さいの多いですから効果は有りそうですね。


---- 以下は更に暇な人用 ----

しかし、1/n分周の端数が出るような仕様の場合、
時刻と周期の関係を正しく理解していない利用者がプログラム書くと危ないですね。

まあ、大抵のパソコンでは多少周期誤差が有るのだけれど(^_^;;
誤差で済ませるか、補正をかけるかは良いとこと悪いとこが有りますね。

以下の内容は、jspのソースを細かく追ったわけではないので
間違っているかもしれませんが(^_^;; クロックの誤差の話は無しです。

例えば32768/秒のクロックから1msのticでの時刻を作るとすると
TIC_NUME = TIC_DENO = 1で、ハードの分周数 n=32768/1000 = 32 と設定すると
32768/32 = 1024回/秒の割込みが入り、
1秒が1024msとなり約2.4%早く時刻が変化しますね。

   こんな[時刻]の誤差だと許せない(^_^;;
   ということで、

同じ分周数設定でTIC_NUME = 1000, TIC_DENO = 1024、
約分して TIC_NUME = 125, TIC_DENO = 128 と設定すると
補正されて1024回の割込みでtic=1000と成るわけですよね。

これだと割込み128回単位で[時刻]は正確な時刻に戻ってくれますね。

しかし、128/3 = 約42.6回に一回、定周期割り込みが入っても時刻が進まない。
例えば4ms周期を指定した場合、jspのタイムイベント管理は時刻駆動なので
42.6/4=10だから 約11回に一回は間隔が5msに成ってしまう。

つまり[周期]は25%の変動 (^_^)/"" に成っちゃいますなぁ。
1ms周期だと100%。欠落だな。

この辺りの功罪をしっかりと設計者に伝えないといけませんね。
これだと周期 0で指定して、
自分で周期の制御やるようにした方が[周期]は正確になりますね。

制御が主だとシステム[時刻]の正確さを諦めて、
1回の[周期]の誤差を2.4%と認めてしまい、
時計の石を別に置いて、システム時刻と実世界時刻は別物に扱い、
実世界時刻は時計の石を参照するとかしたほうが良いかもしれませんね。

まあ、1番簡単なのは、使用者の時間の常識をひっくり返して、
1秒1024msということにしてしまうという事でも良いのですが。
これだとトータルticをシフトするだけで秒が出るという利点も有りますしね。

で、結局言いたかった事は ( オイオイ枕が長すぎるな )
TIC_NUME = TIC_DENO = 1 以外で使っているシステムって
どれくらい有るのだろうって事です。

//--------------------------------------------------------------------
// サンリツオートメイション(株)  宮川誠一
//--------------------------------------------------------------------