我正在Linux上的串行端口上实现协议。该协议基于请求应答方案,因此吞吐量受将数据包发送到设备并获得应答所花费的时间限制。这些设备主要基于Arm,并且运行Linux> = 3.0。我无法将往返时间缩短到10ms以下(115200波特,8个数据位,无奇偶校验,每条消息7个字节)。
哪些IO接口将为我带来最低的延迟:选择,轮询,epoll或使用ioctl手动轮询?阻塞或非阻塞IO是否会影响延迟?
我尝试用setserial设置low_latency标志。但这似乎没有效果。
我还有其他方法可以尝试减少延迟吗?由于我控制所有设备,因此甚至可以修补内核,但最好不要修补。
-—编辑----
串行控制器使用的是16550A。
与更多的工程师讨论了该主题之后,我得出的结论是,该问题在用户空间中无法解决。由于我们需要跨网桥进入内核领域,因此我们计划实现一个内核模块,该模块讨论我们的协议并提供小于1ms的延迟。
-编辑-
原来我是完全错误的。所需要做的只是增加内核滴答率。默认的100个滴答声增加了10ms的延迟。1000Hz和串行过程的负整数值给了我想要达到的时间特性。