2015-01-29 2 views
2

커널 기반 Linux 버전 2.6.12.3-a9-17을 사용하는 uclinux를 실행하는 arm-cpu 기반 보드를 사용하여 UDP 프로토콜을 사용하여 양쪽 네트워크로 PC에서 데이터를 수신합니다. .Linux : UDP 수신 메시지가 전송되는 속도보다 느림

내 문제는 보드에서 모든 메시지를받을 수 있지만 (손실되지는 않음) 수신 메시지 간의 시간 간격은 최대 20ms로 제한됩니다. 즉, 30ms마다 메시지를 보내면 모든 것이 정상입니다. 그러나 매 10ms마다 메시지를 보내면 보드에 20 밀리 초마다 수신되는 UDP 패키지가 표시됩니다 (따라서 모든 메시지를 수신하는 데 PC가 사용하는 시간의 두 배가 걸립니다).

나는이 수신 메시지 사이의 시간 간격을 측정하려면 다음 코드를 사용하고 있습니다 : 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 

:

여기

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 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, 

이 간격은 리눅스 시스템에서 뭔가 정의되어야한다고 생각합니다. 어떻게 해결할 수 있습니까?

, BTW 보드 쇼 (EXT = eth0를)의 iptables에 :

iptables -A INPUT -i $EXT -p udp -d 0/0 --dport 1024:65535 -j ACCEPT 

대단히 감사합니다.

+0

[TCP] (http://en.wikipedia.org/wiki/Transmission_Control_Protocol)에서 [sliding windows] (http://en.wikipedia.org/wiki/)와 동일한 문제를 어떻게 처리하는지 읽을 수 있습니다. Sliding_window_protocol). –

+0

그냥 추측하십시오. 수신 프로세스 우선 순위를 높이려고 시도 했습니까? RT 우선 순위를 시도하십시오. – Marian

+0

보드가 printf 문자열을 출력하는 데 얼마나 걸리나요? 빠른 비디오 컨트롤러 또는 느린 직렬 링크가 있습니까? –

답변

0

친절한 답변을 부탁드립니다. 나는 문제가 usleep (10)과 while의 끝으로 인한 것임을 알았다. 보드에서 usleep (10)은 정확히 20ms 걸리지 만 다른 PC에서는 usms가 걸립니다.