Armadilloフォーラム

UDP受信の最低間隔が20msまでにしか下らない

lockandfire

2015年1月29日 17時51分

いつもお世話になっております。

表題の件について、UDP protocol通信プルグラムの中、受信側のArmadillo-210の受信間隔が、最低20ms以下に下らないのことです。

例として:

送信側                                       受信側
メッセージ1                             メッセージ1
10ms                                        20ms
メッセージ2                            メッセージ2
10ms                                        20ms
メッセージ3                            メッセージ3
10ms                                        20ms
メッセージ4                             メッセージ4

となっています。wiresharkで見ると、送信側の間隔は確かに10msです。

だが、送信側の間隔は20msより大きいの場合には、問題がない。同じ問題をstackoverflowへ投稿したので、詳しいことをそちに参考してください。

http://stackoverflow.com/questions/28209767/linux-udp-receive-message-s…

そういうことで、受信間隔を10msまでに下る方法を教えでください。

以上です。宜しくお願い致します。

コメント

y.nakamura

2015年1月30日 10時11分

中村です。

> 表題の件について、UDP protocol通信プルグラムの中、受信側のArmadillo-210の受信間隔が、最低20ms以下に下らないのことです。

長時間実行した場合、どうなりますか?
たとえば、10msec間隔で1000個送信すると10秒かかります。
受信側は1000個受信できますか?stackoverflowではno lostと書かれてますが。
その場合、1000個受信するのには20秒かかりますか?
10000個(送信に100秒)ではどうでしょうか?

> だが、送信側の間隔は20msより大きいの場合には、問題がない。

逆に、10msecより短い間隔、たとえば、1msecで1000個
送信するのには1秒ですが、この場合はどうなりますか?

それから、10msecと20msecの間、たとえば、15msec間隔で
送信するとどうなりますか?

220なら持っているので、時間があれば試してみたいところですが、
今のところ、自分で試せる時間はありません。

--
なかむら

lockandfire

2015年1月30日 21時00分

中村様

お世話になりました。本トピックについて、原因が発見しました。問題は、udpのrecvfromループの最後のusleep(100)でした。

while(1) {
  recvlen = recvfrom(   );
  ...
  usleep(100);
}

armadillo210-baseのuClinuxは、tick clockは100Hz(10ms)ですので、usleep/nanosleep/setitimerなどSIGALRMに基づき関数は、最低20msの間隔をしか得ない。ですので、今の課題はtick clockをへんこうしてカーナルを再コンパイルの方法を見つかるに変更しました。

以上です。

> 中村です。
>
> > 表題の件について、UDP protocol通信プルグラムの中、受信側のArmadillo-210の受信間隔が、最低20ms以下に下らないのことです。
>
> 長時間実行した場合、どうなりますか?
> たとえば、10msec間隔で1000個送信すると10秒かかります。
> 受信側は1000個受信できますか?stackoverflowではno lostと書かれてますが。
> その場合、1000個受信するのには20秒かかりますか?
> 10000個(送信に100秒)ではどうでしょうか?
>
> > だが、送信側の間隔は20msより大きいの場合には、問題がない。
>
> 逆に、10msecより短い間隔、たとえば、1msecで1000個
> 送信するのには1秒ですが、この場合はどうなりますか?
>
> それから、10msecと20msecの間、たとえば、15msec間隔で
> 送信するとどうなりますか?
>
> 220なら持っているので、時間があれば試してみたいところですが、
> 今のところ、自分で試せる時間はありません。
>
> --
> なかむら
>

y.nakamura

2015年1月30日 23時59分

中村です。

> お世話になりました。本トピックについて、原因が発見しました。問題は、udpのrecvfromループの最後のusleep(100)でした。

stackoverflowに書いてあったコード、
よく見ると、while(1) { に対する閉じカッコがないので、
その閉じカッコの前に、実は
> usleep(100);
> }
のようにusleep()あった、ということかと思います。

stackoverflowで突然
I found out the problem is due to a usleep(10) and the end of while.
と出てきたので、どこのことを言っているのかなぁ?と思ってました。

> armadillo210-baseのuClinuxは、tick clockは100Hz(10ms)ですので、usleep/nanosleep/setitimerなどSIGALRMに基づき関数は、最低20msの間隔をしか得ない。ですので、今の課題はtick clockをへんこうしてカーナルを再コンパイルの方法を見つかるに変更しました。

はい。usleep()とnanosleep()は20msec間隔になってしまうようですね。
setitimerは、intervalに9999usecまでの値をを与えれば
20msecではなくて10msec間隔になります。
参考
http://lists.atmark-techno.com/pipermail/armadillo/2009-March/004098.ht…

--
なかむら