3

特定のシリアル デバイスと接続するプログラムを作成しています。シリアル デバイスには 2 つのチャネルがあり、チャネルごとにハードウェアの rx および tx バッファーがあります。基本的に、いつでも、デバイスのいずれかのチャネルに対して読み取り/書き込みを行うことができます。

チャネルからデータを読み取って検証し (そしておそらくデータの一部を使用して)、送信しようとしています。読み取りはデバイスへの iotctl 呼び出しで実行され、書き込みは write() システム コールへの呼び出しで実行されます。

私が抱えている主な問題は、データのスループットです。個々のスレッドが各チャネルの読み取りと書き込みを処理するようにしたいと考えています (つまり、2 つのチャネルのそれぞれに読み取りスレッドと書き込みスレッド)。しかし、私は思わぬ障害にぶつかりました。Linux の観点からは、デバイス上のすべてが 1 つのデバイスを介してアクセスされます。また、デバイスに複数のチャネルがあることを Linux が認識しているかどうかはわかりません。

その結果、現在、デバイスに対して単一のファイル記述子を開き、読み取りと書き込みを連続して実行しています。スレッド化されたアプローチに行きたいのですが、ioctl() と write() の同時呼び出しで問題が発生するかどうか疑問に思っています。read() と write() がスレッドセーフではないことは理解していますが、それを回避する方法があるかどうか疑問に思っていました (おそらく、open() を 2 回呼び出し、1 つは読み取り特権で、もう 1 つは書き込み特権で)。

ご協力いただきありがとうございます。また、自分でドライバーを書かなくても済むようにしたいのですが、それは仕方のない結論かもしれません...

また、補足として、デバイスのハードウェア バッファが非常に小さいことも特に懸念しています。OS がデータ用のソフトウェア バッファに使用するスペースを特定する方法はありますか? つまり、ハードウェア バッファのオーバーフローを防ぐために使用される独自のバッファが OS にあるかどうかを判断できますか? 問題のデバイスは I2C UART ブリッジです。

4

1 に答える 1