Linuxとcygwinの双方でnanosleep関数があるので、精度の高い時間待ちに
この関数が利用できると思うのは甘い!
Linuxではjiffiesは10mS単位なので、nanosleepで小さな時間を
指定してもまずそんな時間では動かないのであった。
たとえば、通信モジュールで250uSの待ち時間が必要な部分があるのだが、
こんな小さな時間を指定しても、Linuxでは20mS近くの待ちが入る。
cygwinでは時間粒度は少しだけ細かいが、これは
WindowsXPのタイマ粒度がLinuxよりも細かいようだ(1mS?)。
とはいっても、XPでも時々とんでもなく長い時間の待ちになることが
あるので、スケジューラの都合など色々条件があるのだろう。
それと、不思議なことにcygwinで時間をRDTSCとgettimeofdayの2通りで計ってみたら、
この二つの値が大きく違う。(rdtsc計測は0.4倍。)
不思議だ~。cygwinの問題なのか、windowsXPの問題なのかは分からない。
VisualC++にはgettimeofdayがないので、timeGetTimeも合わせて計測したら
こちらはcygwinのgettimeofdayに近いようだ。RDTSCのカウンタ値がPentiumMでは
おかしいのかな?別のマシンでも確認要だね。
Linuxでは、10mS以上の大きな待ち時間を設定した場合には、+10mSの
遅れ(これはschedule tickによるのだろう)がある以外はほとんど
ぴったりの待ち時間が計上されるので、粒度は荒いが納得はできる。
いずれにせよ、通信モジュールの待ち時間は最低限を規定しているだけなので、
250uSが20mSでも困ることはないのでどうでもいいようなものだが、
関数の説明だけ読んでそのとおり動くと信じる人がいるんだろうね。
実は、この精度のテストをしていて、rdtsc命令を使っていたのだが、
2月のセミナの時に使ったプログラムの時間の表示が誤っていたことに
気がついた(あらら~)
参加者に連絡したほうがいいかも・・・
この関数が利用できると思うのは甘い!
Linuxではjiffiesは10mS単位なので、nanosleepで小さな時間を
指定してもまずそんな時間では動かないのであった。
たとえば、通信モジュールで250uSの待ち時間が必要な部分があるのだが、
こんな小さな時間を指定しても、Linuxでは20mS近くの待ちが入る。
cygwinでは時間粒度は少しだけ細かいが、これは
WindowsXPのタイマ粒度がLinuxよりも細かいようだ(1mS?)。
とはいっても、XPでも時々とんでもなく長い時間の待ちになることが
あるので、スケジューラの都合など色々条件があるのだろう。
それと、不思議なことにcygwinで時間をRDTSCとgettimeofdayの2通りで計ってみたら、
この二つの値が大きく違う。(rdtsc計測は0.4倍。)
不思議だ~。cygwinの問題なのか、windowsXPの問題なのかは分からない。
VisualC++にはgettimeofdayがないので、timeGetTimeも合わせて計測したら
こちらはcygwinのgettimeofdayに近いようだ。RDTSCのカウンタ値がPentiumMでは
おかしいのかな?別のマシンでも確認要だね。
Linuxでは、10mS以上の大きな待ち時間を設定した場合には、+10mSの
遅れ(これはschedule tickによるのだろう)がある以外はほとんど
ぴったりの待ち時間が計上されるので、粒度は荒いが納得はできる。
いずれにせよ、通信モジュールの待ち時間は最低限を規定しているだけなので、
250uSが20mSでも困ることはないのでどうでもいいようなものだが、
関数の説明だけ読んでそのとおり動くと信じる人がいるんだろうね。
実は、この精度のテストをしていて、rdtsc命令を使っていたのだが、
2月のセミナの時に使ったプログラムの時間の表示が誤っていたことに
気がついた(あらら~)
参加者に連絡したほうがいいかも・・・