在尝试为串行 IO 实现一个应该相当简单的例程时,我遇到了一个精神障碍时刻。
情况是我们有一个嵌入式 linux 板(想想 Pi/Beagle),它使用 standard Linux termios code 与 UART 上的另一个设备通信。 .
问题是我们有两个冲突的要求:
在传输方向,我们要在Linux messaging queue 上阻塞msgrcv() 函数直到消息到达我们发送。
在接收方向,我们需要等待/阻止传入消息(对于规范模式操作,它可以具有终止字符)。
Tx 和 Rx 是异步的并且彼此不相关 - 任何一个都可能希望在任何时候发生。
轮询会很痛苦,因为它会导致 CPU 周期开销和响应延迟。
一种方法是将其分成两个线程,一个处理 Tx 并在 msgrcv() 上阻塞,另一个在规范模式下处理 Rx 并在 UART read() 上阻塞——但这会带来设置的痛苦在 Tx 和 Rx 进程之间建立信号量并且都必须重复打开和关闭串行端口,并且 Rx 线程可能最终不得不轮询信号量以防 Tx 需要控制,让我们回到轮询。
我要强调的是,我对所有这些 Linux 东西都比较陌生,所以我完全准备好向大家展示我在这里缺少的明显的解决方案/方法/调用/操作。
有没有什么方法可以在 UART Rx 上阻塞但仍然能够按需传输?
最佳答案
最后我听从了 Martin James 的建议,做了这样的事情:
fd = open(serial_port);
pthread_create(TxThread, fd);
pthread_create(RxThread, fd);
Linux 似乎对此非常满意,两个线程都可以毫无问题地完成工作。
关于c - Linux 串行 IO - 在两个线程之间拆分 Tx 和 Rx?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20885045/