IWIP + RTOS - so vermeiden Sie netconn block der thread für immer?
Wenn die Iwip netconn_accept()
oder netconn_recv()
Funktion wird aufgerufen, wenn wir mit einem RTOS, blockiert der thread und wartet auf eine Verbindung bis zum timeout oder für immer, hängt von der Einstellung der LWIP_SO_RCVTIME0
. Die Dauer der Zeitüberschreitung ist gleich der SYS_ARCH_TIMEOUT
.
Den SYS_ARCH_TIMEOUT
ist definiert als 0xffffffff im Kern beinhalten einen Teil des Iwip-stack, so dass ich denke, dass es nicht zu erwarten ist, geändert werden.
Eigentlich möchte ich es, um zu überprüfen, ob eine Verbindung hergestellt wird, wenn es dann nicht weiterhin den thread. Jedoch, wenn ich den Anruf netconn_accept()
ist, wird es nur den thread blockiert und wartet dort ewig (oder sehr lange)...ich will nicht einfach nur ändern Sie den Wert definieren von SYS_ARCH_TIMEOUT
da brauche ich verschiedene timeout in verschiedenen Situationen...
Was ist der gute Weg, das zu tun? Danke.
- Ich weiß nicht, die Besonderheiten des iwip, aber muss es ein Konzept der non-blocking-sockets oder ein
select
-like-Funktion? - Die BSD-sockets-Implementierung in iwip wirklich extra Raum, die OP möglicherweise nicht in der Lage zu leisten. 64 Kb RAM ist das nicht ein großer Raum für alles.
- Wie Sie wissen, ich habe nur 64kb RAM?? Weiß ich, du...?
- Ich bezweifle, dass Sie einfach genug hatte von FreeRTOS mich :)))
Du musst angemeldet sein, um einen Kommentar abzugeben.
Polling-Verfahren für die TCP-Verbindung (oder die Akzeptanz) ist in der Regel eine schlechte Praxis ist. Betrachten Sie erzeugt einen neuen thread, der ausschließlich der Sperrung netconn_accept () - Aufruf.
Verstehe ich die Einschränkungen bei der Verwendung RTOSes, aber laichen nur ein Helfer-thread mit minimalem stack-Speicher sollte nicht ein großes problem sein.
Ich glaube, dass die Implementierung einer Lösung, um die klassische Erzeuger-Verbraucher-problem ist nicht schwer.
Wenn Sie sprechen über die FreeRTOS, es hat alle Werkzeuge, die Sie - Semaphoren und threads.
Nicht die Blockierung API überhaupt. Die iwip-stack bietet eine native, non-blocking, event-driven-API, die ist effizienter als blockiert und nicht erfordern eine Sperrung RTOS. Ein YouTube-video zeigt (bei http://youtu.be/MBk5wJ_8jEc) zeigt, wie diese API wurde in ein Echtzeit-system auf der Basis der QP state machine framework.
Machen einen neuen thread versucht, die Verbindung herstellen. Aslong als es nicht angeschlossen ist, legen Sie den Faden im Schlaf für einige Zeit so der RTOS kann ein context-switch! (wechseln Sie zu einer anderen Aufgabe)
Können Sie die
netconn_set_recvtimeout
Funktion zum festlegen der timeout auf der listen-socket, um etwas kleines, zB 1ms.ZB. (Fehlerbehandlung Links aus neuen, binden, Zuhören, für die Einfachheit)
Dann Anrufe annehmen, die zu Verzögerung von maximal 1ms: