組み込まれたエンジニア

我輩は石である。名前はまだ無い。

nanosleep関数

2005-03-13 18:38:17 | 組込みシステム
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月のセミナの時に使ったプログラムの時間の表示が誤っていたことに
気がついた(あらら~)
参加者に連絡したほうがいいかも・・・

cygwinでioperm関数

2005-03-13 08:41:08 | 組込みシステム
Linuxとの互換性を狙ってのことだと思うけど、iopermが使えるようになっているんだ。
これはかなり便利で、WindowsXPでも直接IOポートを叩くアプリケーションが
簡単に実現できる。もっとも、ドライバをそのつどインストールしておく必要が
あるんで、忘れやすいけれど。

飛行船の基地局システムはLinuxで行くことにしているのは、IOを叩くだけでなく、
タイマなどで時間管理をするドライバを作る時にWindowsだとDDKを導入したり
大事になってしまうからなので、方針自体は変える必要はないけれど、
日々の簡単な実験ならこれがあれば両互換のプログラムが作れるし、
かなりスムースにできるね。

ただ、私のPCカードパラレルポートはWindowsだと割り当てアドレスが
iopermでは届かないところにアサインされてしまうので、ioplを使う必要がある。
Linuxで使うと普通にLPT2のアドレス(0x278)に割り当ててくれるから
WindowsXPが何かおかしなことをやっているのだろうけれど、不便だ。

PnPのポートでなければ、40:08からポートアドレスが取得できるのだけれど、
PCカードのパラレルポートはLinux/Windowsともに40:08からのテーブルには
格納されないようだ。BIOSが関知しないから当然といえば当然だが・・


備忘録
  • ioperm -i : ドライバインストール
  • ioperm -u : ドライバアンインストール
  • 実行プログラムのコンパイル時にlibiopermのリンクが必要


あ、バイオリンのレッスン前に練習しなくっちゃ~・・・