Martin schrieb:
kein UDP, sondern TCP
Sendet nur der Microcontroller Richtung PC oder antwortet der PC drauf? Es gibt in TCP jede Menge Gemeinheiten, die die Datenrate bei einseitigem Datentransfer einbrechen lassen. Ein paar Ideen:
Die Daten in möglichst großen Paketen versenden, am besten die MTU komplett ausreizen. Ansonsten wird dich gerade Windows als Empfänger mit "Delayed Ack" ärgern. (Windows wartet eine gewisse Zeit bevor es den ACK sendet, fall noch Daten mitkommen sollen, Linux auch, das merkt aber irgendwann, das der PC nix senden will) Der lwIP wartet möglicherweise auf das ACK bevor er das nächste Packet versendet.
Unter Linux kann man delayed ack auch per setsockopt abschalten.
Ich weis nicht, welche API Du verwendet, wenn du auf der raw api bist, dann hilft eventuell ein "tcp_output(pcb)" nachdem du die Daten geschrieben hast. Der lwip wird dann alle noch Ausstehenden daten versenden, egal ob noch ACKs ausstehen. MEMP_NUM_TCP_SEG muss dann aber groß genug sein.
Es gibt bei der lwip api die möglichkeit den zusätzlichen Kopiervorgang der Daten von "Applikation" -> "LwIP" zu unterbinden. Mann muss sich dann Gedanken über die Speicherverwaltung machen, spart sich aber einen Kopiervorgang.
So als Zahlen, wir haben ein System wo der lwIP auf dem Mikrocontroller läuft und ein externes System die Daten per Parallelschnittstelle an liefert. Das ganze in einem RTOS mit diversen Tasken, also noch gut Overhead durch Task-Kontextwechsel sowie die Kommunikation mit dem externen System. Unser Mikrocontroller ist ein Cortex-M4 mit 100 MHz:
Ich habe Dir mal ein aktuelles Log von unseren Tests angehangen. Das Thema mit der MTU sieht man sehr gut im "Socket_SendTo_TCP/single packet" dort gibt es einen gehörigen Sprung zwischen 1025 und 1460 Datengröße. Die wesentlich niedrigere Geschwindigkeit auf der "RecvFrom" Seite hängt mit unserem Testaufbau zu sammen.