【发布时间】:2015-03-28 09:17:00
【问题描述】:
我正在使用基于 arm-cpu 的板,运行带有内核 Linux 版本 2.6.12.3-a9-17 的 uclinux,以使用 UDP 协议通过任一网络从 PC 接收数据。
我的问题是,在板子上,虽然我可以接收到所有的消息(没有丢失),但传入消息之间的时间间隔最多限制在 20 毫秒。也就是说,如果我每 30 毫秒发送一次消息,则一切正常。但是,如果我每 10 毫秒发送一次消息,则板子每 20 毫秒显示一次传入的 UDP 包(因此 PC 接收所有消息所需的时间是 PC 的两倍)。
我正在使用这些代码来测量两个传入消息之间的时间间隔:
struct timeval tnew, told, dt;
gettimeofday(&tnew,0);
told = tnew;
while (1) {
memset(buf, 100, 0);
int recvlen = recvfrom(fd, buf, 100 , 0,
(struct sockaddr *)&addr_recv, &addr_len);
if (recvlen>0) {
gettimeofday(&tnew ,0);
timersub(&tnew,&told,&dt);
told = tnew;
printf("UDP intput: %fms, string:%s\n", (float)dt.tv_usec / 1000.0,buf);
}
结果如下:
在电脑上:
UDP output: 10.019000ms, string: 353:ABCDEFG
UDP output: 10.067000ms, string: 354:ABCDEFG
UDP output: 10.068000ms, string: 355:ABCDEFG
UDP output: 10.068000ms, string: 356:ABCDEFG
UDP output: 10.004000ms, string: 357:ABCDEFG
UDP output: 10.120000ms, string: 358:ABCDEFG
在船上:
UDP intput: 20.000000ms, string: 353:ABCDEFG,
UDP intput: 20.002000ms, string: 354:ABCDEFG,
UDP intput: 19.998000ms, string: 355:ABCDEFG,
UDP intput: 20.051000ms, string: 356:ABCDEFG,
UDP intput: 19.953000ms, string: 357:ABCDEFG,
UDP intput: 19.996000ms, string: 358:ABCDEFG,
我认为这个间隔应该由linux系统中的某些东西定义。我该如何解决?
顺便说一句,板子的iptables显示(EXT = eth0):
iptables -A INPUT -i $EXT -p udp -d 0/0 --dport 1024:65535 -j ACCEPT
非常感谢。
【问题讨论】:
-
你可以阅读TCP如何处理同样的问题,sliding windows。
-
只是猜测。您是否尝试过提高接收进程的优先级?试试 RT 优先。
-
板子输出printf字符串需要多长时间?它有快速视频控制器还是慢速串行链路?
-
@MartinJames:通过 ssh,printf 使用 0.4ms,通过串口,我将输出重定向到一个文件,printf 使用 0.17ms。
-
@Marian 我试着把它改成 -20 但问题仍然存在