Forum: Mikrocontroller und Digitale Elektronik uIP doppelte Replys


von tom p. (thomas84)


Lesenswert?

Hallo,

ich habe ein Freertos mit dem Webserver Beispiel für den LPC1768 am 
laufen und es funktioniert auch, jetzt ist mir aber aufgefallen, dass 
wenn ich mir den Ping in Wireshark anschaue ich dopelte Replys bekomme 
(in der eingabeaufforderung sehe ich das nicht, unter Linux schon :-P ). 
Das rührt wohl daher, dass uIP im EMAC_ISR den Reply erneut versendet.
Entferne ich dort die Zeile:

// TX_DESC_PACKET( ( emacTX_DESC_INDEX + 1 ) ) = TX_DESC_PACKET( 
emacTX_DESC_INDEX );

bekomme ich nur einen Reply ABER ich erhalte zwischen REquest und reply 
einen Frame voller 5en.

Das komische ist, dass wenn ich sage das die Länge der Daten nicht mehr 
größer als 0 ist (im Code steht man KANN das dazu benutzen um die Daten 
ein zweites mal  zu senden) erhalte überhaupt keine Replys mehr.....

Kennt sich jemand näher mit uIP aus und kann mir helfen?

von Jojo S. (Gast)


Lesenswert?

das doppelte Senden ist ein bekanntes und auch dokumentiertes Feature 
der uIP Lib. Damit wird der Naggle Algorithmus ausgetrickst der in 
vielen Betriebssystemen läuft und kleinere Pakete erst sammelt bevor sie 
quittiert werden. Durch das doppelte Senden werden die Pakete im TCP 
Stream dann sofort quittiert, ansonsten wird die Quittierung meist 200 
ms zurückgehalten.
Wenn man das in der LPC FreeRTOS/uIP Implementierung auskommentiert muss 
man noch an einer anderen Stelle eingreifen weil da mit zwei Buffern 
gearbeitet wird die immer im Wechsel benutzt werden.

von tom p. (thomas84)


Lesenswert?

Ja genau, aber WO muss ich da einfreifen? bzw WIE?

von Jojo S. (Gast)


Angehängte Dateien:

Lesenswert?

habe die mod. emac.c mal angehängt, in der vSendEmacTxData() habe ich 
etwas verdreht.

Nachtrag:
ich habe das auf dem LPCXpresso mit LPC1769 gemacht, der hat den PHY 
LAN8720. Das musst du evtl. anpassen wenn du einen anderen hast. Die 
Initialisierung war auch nicht ganz richtig, lief glaube ich nicht mit 
10 MBit in den älteren Beispielen.

in emac.h noch hinzufügen:
1
#define DP83848C_DEF_ADR    0x0100      /* Default PHY device address        */
2
#define DP83848C_ID         0x20005C90  /* PHY Identifier                    */
3
#define LAN8720_ID          0x0007C0F0  /* PHY Identifier                    */
4
5
#define PHY_ID         LAN8720_ID

von tom p. (thomas84)


Lesenswert?

Vielen vielen Dank,

Du hast mir gerade den Tag und damit auch das ganze Wochenende gerettet!
Läuft wunderbar. DANKE...............WUHU!!!!

von tom p. (thomas84)


Lesenswert?

Das hatte ich schon alles erledigt, bei mir ist ein LPC1758 drin und ein 
LAN8710i :-)

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
Noch kein Account? Hier anmelden.