2012-04-10 12 views
2

、マイクロコントローラは、アトメルAVR32あります。 LWIP受信したUDPパケットはLwIPスタックに入れられていますか?私は<strong>FreeRTOS埋め込みデバイスのための</strong>と<strong>LWIP</strong>を用い<strong>C</strong>プログラムを書いてい

は、UDPudp_recv()でコールバック関数を受信を設定した後、私はUDPデータグラムを受信すると、コールバック関数が呼び出されることを知っています。それから私はprocess_udp_packet()のような何かをコールバック関数の中で行うことができます。ただし、コールバック関数が終了する前に別のUDPパケットが受信された場合、この2番目のパケットはバッファに入れられますか?または、最初のコールバック関数が終了していなくても、コールバック関数がすぐに再び呼び出されますか?

ありがとうございました。

答えて

4

コールバックは、LwIP自体のコンテキストで呼び出されます。コールバックを終了するまで、LwIPはブロックされます。新しいパケットはまったく処理されません。 新しいデータが到着する場合、インターフェイスドライバはLwIPがブロックされなくなるまで、モデムのようなインターフェイスからインターフェイスドライバを読み取ったり、独自のバッファに保存したりするべきではありません。

したがって、通常のLwIPワークフローに干渉しないように、できるだけ早くコールバックを終了する必要があります。 このようなコールバック関数のプログラミングでは、新しいパケットをアプリケーションキューに読み込んですぐにコールバックから戻すことが最善の方法です。その場合、独自のコンテキストでアプリケーションは新しいデータを処理できます。

しかし、データ処理が本当に速く行われた場合は、コールバック関数で処理できます。

+0

ありがとうございます。実際には、コールバック入力パラメータが私にはあまり適していないので、コールバックの中であまりにも多くのことをするのは適切ではないことが分かります。だから今はパケットを格納するためのバッファを割り当てただけです(実パケットがpbuf構造のリンクに格納され、pbufのヘッダが実データではないことがわかっているので)。しかし、そうすることで、パケットが受信されたかどうかを確認するためにポーリングする必要があります。実際には私はRTPサポート付きのVoIPプロジェクトをやっているので、これはうまくいかないと心配しています。リアルタイムが重要です。助言してもらえますか? – eepty

+0

また、構造体pbufの** len **フィールドがペイロードの長さかpbuf全体の長さを表すかどうかを確認したいと思いますか?コードのコメントは、前者に言いました。しかし、** pbuf_header()**関数をチェックすると、* len *はpbuf全体の長さを表しているようです..... @werewindle – eepty

+0

@eepty、リアルタイムVoIPプロジェクトを作成しているなら、 RTタスク担当者(Keil RTOS、FreeRTOSなど)を使用することをお勧めします。これにより、リアルタイム環境で多くのスレッドを持つことができます。あなたのケースでは、新しいパケットを待つスレッドはそれをポーリングしません。セマフォでブロックされます。新しいパケットが到着すると、コールバックはそれをバッファに保存し、セマフォに信号を送ります。これにより、処理スレッドのロックが解除されます。新しいパケットがない場合、デバイスはユーザーとのやりとりのような他の優先度の低いスレッドを実行できます。 – werewindle

関連する問題

 関連する問題