【发布时间】:2012-10-19 00:48:32
【问题描述】:
我正在 Linux 上通过串行端口实现协议。该协议基于请求应答方案,因此吞吐量受限于将数据包发送到设备并获得应答所需的时间。这些设备大多基于 arm 并运行 Linux >= 3.0。我在将往返时间减少到 10 毫秒以下时遇到了麻烦(115200 波特,8 个数据位,无奇偶校验,每条消息 7 个字节)。
哪些 IO 接口的延迟最低:select、poll、epoll 或使用 ioctl 手动轮询?阻塞或非阻塞 IO 会影响延迟吗?
我尝试使用 setserial 设置 low_latency 标志。不过好像没什么效果。
还有什么我可以尝试减少延迟的方法吗?由于我控制所有设备,因此甚至可以修补内核,但最好不要。
---- 编辑----
串行控制器使用的是 16550A。
【问题讨论】:
-
你用的是什么类型的串口? USB/串行接口可能有点慢。
-
您需要检查这 10 毫秒的花费,因为如果它们被其他设备丢失,您将无法进行更多优化。
-
请求和应答消息的大小是多少?如果两者都超过 100 字节,那么您无法获得
-
115200 非常慢,因此只需移动字节就可以保证很大的延迟。最好的选择是将波特率提高到 921600 之类的值。或者更好的是,切换到千兆以太网。
-
@OttavioCampana 目前正在等待输入。我一直在轮询,直到 ioctl 告诉我输入可用并且我读取它为止。
标签: c++ linux serial-port low-latency throughput