我正在编写一个与特定串行设备接口的程序。串行设备有两个通道,每个通道都有一个硬件 rx 和 tx 缓冲区。基本上,在任何给定时间,您都可以读取/写入设备上的任一通道。
我正在尝试从通道读取数据,对其进行验证(并可能使用一些数据),然后传输它。读取是通过对设备的 iotctl 调用来完成的,而写入是通过调用 write() 系统调用来完成的。
我遇到的主要问题是数据吞吐量。我希望有一个单独的线程处理每个通道的读取和写入(即,两个通道中的每一个都有一个读取线程和一个写入线程)。然而,我遇到了一个障碍。从 Linux 的角度来看,设备上的所有内容都是通过一个设备访问的,我不确定 Linux 是否注意到该设备具有多个通道。
因此,目前我向设备打开单个文件描述符并串行执行读取和写入。我想采用线程方法,但我想知道并发 ioctl() 和 write() 调用是否会导致问题。我知道 read() 和 write() 不是线程安全的,但我想知道是否有任何解决方法(可能调用 open() 两次,一次具有读取权限,一次具有写入权限)。
谢谢你的帮助。另外,我想避免编写自己的驱动程序,但这可能是一个不可避免的结论......
另外,作为旁注,我特别担心该设备的硬件缓冲区非常小。有没有办法确定操作系统为数据的软件缓冲区使用了多少空间?也就是说,我能否确定操作系统是否有自己的缓冲区,用于防止硬件缓冲区溢出?有问题的设备是 I2C UART 桥接器。