我正在使用基于arm-cpu的板,使用内核Linux版本2.6.12.3-a9-17运行uclinux,以使用UDP协议通过任一网络从PC接收数据。
我的问题是,虽然我可以接收所有消息(没有丢失),但是传入消息之间的时间间隔最多限制为20毫秒。也就是说,如果我每隔30ms发出一次消息,一切都OK。但是,如果我每隔10ms发送一次消息,则该板每20ms显示一次传入的UDP包(因此,它将花费两倍于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);
}
结果如下:
在PC上:
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
非常感谢。
答案 0 :(得分:0)
谢谢你的回复。我发现问题是由于usleep(10)和while结束。在主板上,usleep(10)需要20ms,而在另一台PC上需要0.1ms。