この open() と fopen() の誤解は、ARM 上の Linux 2.6.14 カーネルのバグのある I2C ドライバーに起因することが判明しました。動作中のビット バッシュ ドライバーをバックポートすることで、ここで対処しようとしていた問題の根本原因が解決されました。
Linux (I2C) のシリアル デバイス ドライバーの問題を解決しようとしています。デバイスの書き込みと読み取りの間に時間指定された OS 一時停止 (スリープ) を追加することで、動作が (はるかに) 良くなったようです。
余談: I2C の性質は、マスターによって読み書きされる各バイトが、ワイヤーの反対側 (スレーブ) のデバイスによって認識されることです。バスの仕組みに納得がいかない。とにかく...
(固定期間の一時停止を使用するのではなく) 確実に書き込みをフラッシュするか、書き込み/読み取りトランザクションがマルチスレッドに適した方法で 完了したことを何らかの形でテストしたいと思います。
使用に関する問題fflush(fd);
は、「fd」がストリームポインター(ファイル記述子ではない)である必要があることです。
FILE * fd = fopen("filename","r+");
... // do read and writes
fflush(fd);
私の問題はioctl()
、ストリーム ポインターを使用しない を使用する必要があることです。すなわち
int fd = open("filename",O_RDWR);
ioctl(fd,...);
提案?