一尘不染

Linux上的低延迟串行通信

linux

我正在Linux上的串行端口上实现协议。该协议基于请求应答方案,因此吞吐量受将数据包发送到设备并获得应答所花费的时间限制。这些设备主要基于Arm,并且运行Linux>
= 3.0。我无法将往返时间缩短到10ms以下(115200波特,8个数据位,无奇偶校验,每条消息7个字节)。

哪些IO接口将为我带来最低的延迟:选择,轮询,epoll或使用ioctl手动轮询?阻塞或非阻塞IO是否会影响延迟?

我尝试用setserial设置low_latency标志。但这似乎没有效果。

我还有其他方法可以尝试减少延迟吗?由于我控制所有设备,因此甚至可以修补内核,但最好不要修补。

-—编辑----

串行控制器使用的是16550A。


阅读 253

收藏
2020-06-03

共1个答案

一尘不染

与更多的工程师讨论了该主题之后,我得出的结论是,该问题在用户空间中无法解决。由于我们需要跨网桥进入内核领域,因此我们计划实现一个内核模块,该模块讨论我们的协议并提供小于1ms的延迟。

-编辑-

原来我是完全错误的。所需要做的只是增加内核滴答率。默认的100个滴答声增加了10ms的延迟。1000Hz和串行过程的负整数值给了我想要达到的时间特性。

2020-06-03