2012-04-10 13 views
2

Ich bin ein C Programm lwIP mit FreeRTOS für ein Embedded-Gerät zu schreiben, der Mikrocontroller ist Atmel AVR32.Erhalten empfangene UDP-Pakete in LwIP-Stack?

In lwIP, nachdem die udp Einrichtung erhalten Callback-Funktion von udp_recv(), ich weiß, dass die Callback-Funktion, sobald ein UDP Datagramm empfangen wird, aufgerufen werden. Dann kann ich etwas wie process_udp_packet() innerhalb der Callback-Funktion tun. Wenn jedoch ein weiteres UDP Paket empfangen wird, bevor die Rückruffunktion beendet ist, wird dieses zweite Paket in einen Puffer eingereiht? Oder die Callback-Funktion wird sofort wieder aufgerufen, auch wenn die erste Callback-Funktion nicht beendet ist?

Vielen Dank.

Antwort

4

Callback wird im Zusammenhang mit LwIP selbst aufgerufen. Bis zum Beenden des Rückrufs wird LwIP blockiert. Es werden überhaupt keine neuen Pakete verarbeitet. Wenn neue Daten ankommen, sollte der Schnittstellentreiber sie nicht von der Schnittstelle lesen (wie Modem) oder in einem eigenen Puffer speichern, bis LwIP entsperrt wird.

Daher sollte der Rückruf so schnell wie möglich beendet werden, um den normalen LwIP-Workflow nicht zu beeinträchtigen. Die beste Vorgehensweise beim Programmieren solcher Rückruffunktionen besteht darin, ein neues Paket in die App-Warteschlange einzulesen und sofort vom Rückruf zurückzukommen. Dann kann die App in ihrem eigenen Kontext neue Daten verarbeiten.

Aber, wenn Datenverarbeitung wirklich schnell erfolgt, können Sie es innerhalb der Rückruffunktion tun.

+0

Danke. Tatsächlich finde ich auch, dass es nicht geeignet ist, innerhalb des Callbacks zu viele Dinge zu tun, da die Callback-Eingabeparameter für mich nicht wirklich geeignet sind. So habe ich jetzt einen Puffer reserviert, um das Paket zu speichern (weil ich weiß, dass ein reales Paket in einer Verbindung der pbuf-Struktur gespeichert werden kann und der Header des PBUF keine echten Daten sind). Auf diese Weise muss ich abfragen, um zu überprüfen, ob ein Paket empfangen wurde. Ist es korrekt? Ich mache mir Sorgen, dass das nicht gut ist, weil ich eigentlich ein VoIP-Projekt mit RTP-Unterstützung mache, also ist Echtzeit wichtig. Könnten Sie beraten? – eepty

+0

Außerdem möchte ich fragen, ob das ** len ** Feld in der Struktur pbuf die Länge der Nutzlast oder die Länge eines ganzen Pbuf darstellt? Der Kommentar im Code sagte ersteres. Aber wenn ich die Funktion ** pbuf_header() ** überprüfe, scheint es, dass * len * die Länge des ganzen pbuf darstellen ..... danke @werewindle – eepty

+0

@eepty, Wenn Sie erstellen Echtzeit-VoIP-Projekt, ich Ich empfehle Ihnen, einen RT-Tasker zu verwenden (zB Keil RTOS oder FreeRTOS). Dadurch können Sie viele Threads in einer Echtzeitumgebung haben. In Ihrem Fall werden Threads, die auf ein neues Paket warten, diese nicht abfragen. Es wird nur auf Semaphor blockiert. Wenn ein neues Paket eintrifft, speichert es der Rückruf in einem Puffer und signalisiert dies dem Semaphor. Dadurch wird der Verarbeitungsthread freigegeben. In der Zwischenzeit (wenn keine neuen Pakete vorhanden sind) kann Ihr Gerät andere Threads mit niedriger Priorität ausführen, wie die Interaktion mit dem Benutzer. – werewindle