2011-09-03 18 views
6

私は小さなマイクロコントローラアプリケーションのためのデバイスドライバI/Oモデルを開発しています。これはPOSIXをインターフェイス設計のガイドラインとして使用しています。 旧式、2008年リストioctl()<stropts.h>:例えば、UARTボーレート、I2Cスレーブアドレス、等ioctl()関数の置き換え

Iが気づく、そのPOSIXのための - Iは、ドライバ/ハードウェアのパラメータを制御する手段としてioctl()を実施しました。デバイスドライバとの通信に推奨される代替メカニズムは何ですか?

答えて

8

POSIXは、ioctl()機能の非常に限定されたサブセット、つまりSTREAMSに関連するサブセットのみを定義しています。 STREAMS機能は陳腐化しているため、POSIXではそのインタフェースも陳腐化しています。

しかし、ioctl()は、「永遠」(Unixの第7版UNIX版では確かにUnixの一部ですが、それでもそれほど新しくはありませんでした。デバイスドライバを開いた後でデバイスドライバを制御するのは、「方法」です。唯一の問題は、そのようなインターフェイスとコントロールが標準化されていないことです。

ターミナルを制御するために書き込まれた一連の関数については、<termios.h>ファイルを参照してください。典型的な実装ではioctl()または他の同様の特殊なメカニズムが使用されることが期待されますが、インターフェイスは標準化されたときに一般化されました(<termios.h>インターフェイスは以前のインターフェイス、7th EditionまたはSystem IIIまたは他のインターフェイスと同じではありません)。あなたが望むのであれば、ユーザが使う標準的な関数をioctl()のインターフェースの上に書くことができます。これらの関数を実装してioctl()インターフェイスに呼び出します。

だから、ioctl()は遠ざかりません。デバイスドライバを制御する正しい方法です。 POSIXの議題は若干異なります。

+4

これを拡張するために、POSIXの 'ioctl'の段階的な廃止は、' ioctl'の使用を避けるべきではなく、POSIXがハードウェアデバイスの動作方法を指定するのではなく、 'ioctl'はSTREAMSでも使われていたので、POSIXは' ioctl'のアスペクト*だけを指定していましたが、STREAMSは陳腐化しています。 –

+0

ありがとうございます - はい、それはまさに私が意味していたものです。 –

+3

ioctl()は戻ってきます...個人的に私は1980年代にそれを使用しました。 1983年のSystem Vのマニュアルではまだioctl()を記述していますが、実際の使用方法は.hファイルとテクニカルマニュアルにあります。デバイスの.hファイルにあなたのioctlsのすべての詳細を記述して、開発者がいつでも利用できるようにすることを強くお勧めします。 – Gilbert