、マイクロコントローラは、アトメルAVR32あります。 LWIPで受信したUDPパケットはLwIPスタックに入れられていますか?私は<strong>FreeRTOS埋め込みデバイスのための</strong>と<strong>LWIP</strong>を用い<strong>C</strong>プログラムを書いてい
は、UDPudp_recv()
でコールバック関数を受信を設定した後、私はUDPデータグラムを受信すると、コールバック関数が呼び出されることを知っています。それから私はprocess_udp_packet()
のような何かをコールバック関数の中で行うことができます。ただし、コールバック関数が終了する前に別のUDPパケットが受信された場合、この2番目のパケットはバッファに入れられますか?または、最初のコールバック関数が終了していなくても、コールバック関数がすぐに再び呼び出されますか?
ありがとうございました。
ありがとうございます。実際には、コールバック入力パラメータが私にはあまり適していないので、コールバックの中であまりにも多くのことをするのは適切ではないことが分かります。だから今はパケットを格納するためのバッファを割り当てただけです(実パケットがpbuf構造のリンクに格納され、pbufのヘッダが実データではないことがわかっているので)。しかし、そうすることで、パケットが受信されたかどうかを確認するためにポーリングする必要があります。実際には私はRTPサポート付きのVoIPプロジェクトをやっているので、これはうまくいかないと心配しています。リアルタイムが重要です。助言してもらえますか? – eepty
また、構造体pbufの** len **フィールドがペイロードの長さかpbuf全体の長さを表すかどうかを確認したいと思いますか?コードのコメントは、前者に言いました。しかし、** pbuf_header()**関数をチェックすると、* len *はpbuf全体の長さを表しているようです..... @werewindle – eepty
@eepty、リアルタイムVoIPプロジェクトを作成しているなら、 RTタスク担当者(Keil RTOS、FreeRTOSなど)を使用することをお勧めします。これにより、リアルタイム環境で多くのスレッドを持つことができます。あなたのケースでは、新しいパケットを待つスレッドはそれをポーリングしません。セマフォでブロックされます。新しいパケットが到着すると、コールバックはそれをバッファに保存し、セマフォに信号を送ります。これにより、処理スレッドのロックが解除されます。新しいパケットがない場合、デバイスはユーザーとのやりとりのような他の優先度の低いスレッドを実行できます。 – werewindle