3

我正在编写一个与特定串行设备接口的程序。串行设备有两个通道,每个通道都有一个硬件 rx 和 tx 缓冲区。基本上,在任何给定时间,您都可以读取/写入设备上的任一通道。

我正在尝试从通道读取数据,对其进行验证(并可能使用一些数据),然后传输它。读取是通过对设备的 iotctl 调用来完成的,而写入是通过调用 write() 系统调用来完成的。

我遇到的主要问题是数据吞吐量。我希望有一个单独的线程处理每个通道的读取和写入(即,两个通道中的每一个都有一个读取线程和一个写入线程)。然而,我遇到了一个障碍。从 Linux 的角度来看,设备上的所有内容都是通过一个设备访问的,我不确定 Linux 是否注意到该设备具有多个通道。

因此,目前我向设备打开单个文件描述符并串行执行读取和写入。我想采用线程方法,但我想知道并发 ioctl() 和 write() 调用是否会导致问题。我知道 read() 和 write() 不是线程安全的,但我想知道是否有任何解决方法(可能调用 open() 两次,一次具有读取权限,一次具有写入权限)。

谢谢你的帮助。另外,我想避免编写自己的驱动程序,但这可能是一个不可避免的结论......

另外,作为旁注,我特别担心该设备的硬件缓冲区非常小。有没有办法确定操作系统为数据的软件缓冲区使用了多少空间?也就是说,我能否确定操作系统是否有自己的缓冲区,用于防止硬件缓冲区溢出?有问题的设备是 I2C UART 桥接器。

4

1 回答 1

1

您可以使用信号量在读/写线程之间进行互斥

sem_t sync_rw;

/*init semaphore */
err=sem_init(&sync_rw,0,1); /* shared between thread and initialized with 1 */
if( err != 0 )
{
    perror("cannot init semaphore \n");
    return -1;
}

在线程写入函数中你这样做:

sem_wait(&sync_rw);
write(...)
sem_post(&sync_rw);

线程阅读器相同:

sem_wait(&sync_rw);
iotctl(...)
sem_post(&sync_rw);

最后 :

sem_destroy(&sync_rw);
于 2014-01-27T17:16:12.847 回答