我正在 Linux 上通过串行端口实现协议。该协议基于请求应答方案,因此吞吐量受限于将数据包发送到设备并获得应答所需的时间。这些设备大多基于 arm 并运行 Linux >= 3.0。我在将往返时间减少到 10 毫秒以下时遇到了麻烦(115200 波特,8 个数据位,无奇偶校验,每条消息 7 个字节)。
哪些 IO 接口会给我最低的延迟:select、poll、epoll 或使用 ioctl 手动轮询?阻塞或非阻塞 IO 会影响延迟吗?
我尝试使用 setserial 设置 low_latency 标志。但是好像没什么效果。
我还有什么可以尝试减少延迟的方法吗?由于我控制所有设备,因此甚至可以修补内核,但最好不要。
- - 编辑 - -
串行控制器使用的是 16550A。
原文由 JustMaximumPower 发布,翻译遵循 CC BY-SA 4.0 许可协议
在与更多工程师讨论这个话题后,我得出的结论是,这个问题在用户空间中是无法解决的。由于我们需要跨过桥进入内核领域,我们计划实现一个内核模块,它与我们的协议对话并给我们提供 < 1ms 的延迟。
- - 编辑 - -
事实证明我完全错了。所需要的只是增加内核滴答率。默认的 100 个滴答声增加了 10 毫秒的延迟。 1000Hz 和串行过程的负值给了我想要达到的时间行为。