Resulta todo este malentendido de los tallos open() versus fopen() de un controlador I2C defectuoso en el núcleo de Linux 2.6.14 en un ARM. Backporting un controlador de bits de trabajo resuelto resolvió la causa raíz del problema que estaba tratando de abordar aquí.¿Cómo se puede vaciar una escritura usando un descriptor de archivo?
Estoy tratando de resolver un problema con un controlador de dispositivo serie en Linux (I2C). Parece que al agregar pausas del sistema operativo temporizado (duerme) entre escrituras y lecturas en el dispositivo las cosas funcionan ... (mucho) mejor.
Aparte: La naturaleza de I2C es que cada byte leído o escrito por el maestro es reconocido por el dispositivo en el otro extremo del cable (esclavo) - las pausas mejorar las cosas me animan a pensar en el controlador como trabajar de forma asíncrona, algo que no puedo conciliar con el funcionamiento del autobús. Anyhoo ...
que había ya sea como a ras la escritura para estar seguro (en lugar de utilizar la pausa de duración fija), o alguna prueba que la escritura/lectura de transacciones ha completado en una manera amistosa multi-threaded.
El problema con el uso de fflush(fd);
es que requiere 'fd' para ser puntero de secuencia (no es un descriptor de archivo), es decir
FILE * fd = fopen("filename","r+");
... // do read and writes
fflush(fd);
Mi problema es que no requiere el uso de la ioctl()
, que no lo hace usa un puntero de flujo es decir,
int fd = open("filename",O_RDWR);
ioctl(fd,...);
Sugerencias?
En el código de usuario-tierra, la función de escritura() no se almacena automáticamente en el búfer. No necesita enjuagarlo; es autolavado. De hecho, a menos que use llamadas especiales al sistema, también es síncrono con el controlador del dispositivo. –
Si está escribiendo un módulo de nivel kernel, las reglas pueden ser algo diferentes, pero probablemente debería estar utilizando el descriptor de archivo i/o no estándar (puntero de archivo) i/o. –