Ich habe schon wieder ein Problem mit LwIP. Auf dem STM32 möchte ich die Datenrate erhöhen. Ich habe feste Datenpakete von 40 Byte Länge. Immer wenn ich ein tcp_write aufrufe warte ich nun, bis der sent handler aufgerufen wird, was ein ACK vom Empfänger bedeutet, und sende das nächste Paket. Wireshark ergibt, dass auch wirklich immer nur 40byte pro Transfer ankommen. Nun habe ich mir gedacht ich kann ja mehr als einmal tcp_write aufrufen und die Anzahl der noch offenen Transfers festhalten. Immer wenn ich also tcp_write aufrufe erhöhe ich einen counter und im handler verringere ich den. Dann starte ich noch die verbleibenden writes. Das scheint aber nicht zu funktionieren. Ist es garantiert, dass auf jedes tcp_write auch genau einmal der handler aufgerufen wird? Wie kann ich die Senderate generell erhöhen?
Das nennt sich Window-size und ist konfigurierbar. Das kann der TCP Stack vollautomatisch handhaben. Wenn kein ack kommt wird ggf. an der unterbrochenen Stelle wiederholt. Wenn das mehfach fehlschlägt wird die Verbindung geschlossen. Wenn du die Fehler lieber selbst behandeln willst, nimm UDP. Unabhängig davon sind so kleine Pakete suboptimal, weil sie durch fie header Daten mehr als doppelt so groß werden.
Der nagle (s. tcp_nagle_disable) wird ordentliche Verzögerungen reinbringen, wenn er nur kleine Bröckchen sendet. Man kann das ggf durch tcp_output reduzieren (oder gleich abschalten, s.o.). Wenn man bei tcp aber hohen Durchsatz haben will, sendet man so viel man kann und wartet nicht auf Bestätigung für jedes Byte - das ist TCP mit angezogener Handbremse ...
Gustav G. schrieb: > Immer > wenn ich ein tcp_write aufrufe warte ich nun, bis der sent handler > aufgerufen wird, was ein ACK vom Empfänger bedeutet, und sende das > nächste Paket. Gustav G. schrieb: > Wie kann ich die Senderate generell erhöhen? In dem Du das oben zitierte genau nicht machst.
Foobar schrieb: > Der nagle (s. tcp_nagle_disable) wird ordentliche Verzögerungen > reinbringen, wenn er nur kleine Bröckchen sendet. Man kann das ggf > durch tcp_output reduzieren (oder gleich abschalten, s.o.). > > Wenn man bei tcp aber hohen Durchsatz haben will, sendet man so viel man > kann und wartet nicht auf Bestätigung für jedes Byte - das ist TCP mit > angezogener Handbremse ... Die Daten kommen aber vom AD Konverter über die SPI Schnittstelle und die kann ich nicht beliebig zwischenspeichern. Ich mache nach jedem tcp_write direkt ein tcp_output. Senden so viel ich kann ohne einen Handler habe ich zuerst probiert aber das ist alles andere als zuverlässig. Ich kann nicht sicher abschätzen, ob LwIP intern noch genug speicher für das Paket hat, damit ich die Datenrate selbst drosseln kann. Es gibt keinen Befehl, tcp_is_write_possible oder sowas in der Art.
Für kleine Päckchen ist TCP einfach viel zu Overhead-lastig. Versuch es einmal mit UDP und du wirst sehen dass es viel flotter geht und auf das "sichere" Übertragen kann man eventuell leicht verzichten. Bei SPI, I2C, Serial und dergleichen hat man auch kein Handshake im Sinne von Datensicherheit und es funktioniert trotzdem prächtig.
Wenn du wirklich sofort verschicken möchtest, dann nimm UDP. Da wird im Normalfall nichts gepuffert, sondern geht sofort raus. Und wenn du es noch schneller haben möchtest, dann schicke rohe Ethernet Pakete raus. STM bietet dafür die HAL an. In dem Bereich HAL_Eth_... sind _Init() , _Start() und _Send(). Und du kannst in die Pakete schreiben, was du willst (eigenes Protokoll ...) . Die Gegenseite muss nur damit klarkommen. Hat mich 3 Stunden gekostet, bis ich Senden konnte. Also weniger Zeit, als schon in diesem Thread hier verstrichen ist.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.