mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LWIP-Stack:Ist dieses Verhalten Normal?


Autor: Nador Rif (rifman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe einen Lwip-Stack auf dem LPC2468 Board heruntergeladen, an sich
läuft alles gut, was mich aber ärgert, das der Prozessor ca.25 Sekunden
braucht, bis er in die Main-Routine springt.Ich weiss nicht vielleicht
ist das eine normale Verzögerung, die die Bearbeitung des Startup-Codes
und die Initialisierung einiger Modulen braucht, bis er dazu kommt meine
LED zu steueren. Vielleicht aber auch nicht, was meint ihr denn?

Autor: let (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf einem MCB2300 (LPC2368) dauert es gefühlte 2s mit und 3s
ohne angeschlossenem Netzwerkkabel bis die Initialisierung ab-
geschlossen ist. uIP und LwIP verhalten sich da gleich. Ich vermute
das es die PHY (DP83848) ist die diese Zeit benötigt.
Ohne Netzwerkcode läuft main() praktisch sofort los. Wird bei
dir vielleicht nicht auf den Quarz+PLL umgeschaltet? Dann läuft
der Chip mit dem internen RC-Oszillator. Ich meine der arbeitet mit
4MHz.

Autor: Nador Rif (rifman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst du vielleicht deinen Startup-Code hochladen, das wäre super.
Danke.

Autor: Jörn Kaipf (joern)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nador Rif wrote:

> ich habe einen Lwip-Stack auf dem LPC2468 Board heruntergeladen, an sich
> läuft alles gut, was mich aber ärgert, das der Prozessor ca.25 Sekunden
> braucht, bis er in die Main-Routine springt.Ich weiss nicht vielleicht
> ist das eine normale Verzögerung, die die Bearbeitung des Startup-Codes
> und die Initialisierung einiger Modulen braucht, bis er dazu kommt meine
> LED zu steueren. Vielleicht aber auch nicht, was meint ihr denn?

Ist bei dir DHCP aktiv? Hört sich an, als ob der der Stack probiert eine 
IP zu bekommt und anschließend mit Timeout abbricht.

Gruß Jörn

Autor: Nador Rif (rifman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im opt.h ist folgendes über DHCP zu finden:
/* ---------- DHCP options ---------- */

#ifndef LWIP_DHCP
#define LWIP_DHCP                       0
#endif

/* 1 if you want to do an ARP check on the offered address
   (recommended). */
#ifndef DHCP_DOES_ARP_CHECK
#define DHCP_DOES_ARP_CHECK             1
#endif
Muss ich vielleicht DHCP_DOES_ARP_CHECK auf null setzen?

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

die 2-3s kann ich bestätigen bei aktiviertem DHCP, angeschlossenem 
Netzwerkkabel und eigenem Low-Layer Ethernettreiber auf einem SMSC 
Netzwerkchip. Die Zeit braucht einfach die Autonegotiation bis das 
Interface oben ist.

Matthias

Autor: Nador Rif (rifman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Muss ich vielleicht DHCP_DOES_ARP_CHECK auf null setzen?
Nee, hat leider nichts gebracht.

>die 2-3s kann ich bestätigen bei aktiviertem DHCP, angeschlossenem
>Netzwerkkabel und eigenem Low-Layer Ethernettreiber auf einem SMSC
>Netzwerkchip. Die Zeit braucht einfach die Autonegotiation bis das
>Interface oben ist.
Und wo vergeht bei mir die ganze Zeit?

Autor: Christian T. (shuzz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nador Rif wrote:
>>Muss ich vielleicht DHCP_DOES_ARP_CHECK auf null setzen?
> Nee, hat leider nichts gebracht.
>
>>die 2-3s kann ich bestätigen bei aktiviertem DHCP, angeschlossenem
>>Netzwerkkabel und eigenem Low-Layer Ethernettreiber auf einem SMSC
>>Netzwerkchip. Die Zeit braucht einfach die Autonegotiation bis das
>>Interface oben ist.
> Und wo vergeht bei mir die ganze Zeit?

Vllt. wartet Dein Code ja auf einen nicht antwortenden DHCP-Server?
25s klingt eigentlich nach so was...

Autor: let (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal ein LwIP Beispiel ohne RTOS. Ich glaube das habe ich
aus der LPC2000 Gruppe von Yahoo.

Ich habe die EMAC Initialisierung für den 2368 Rev. B angepaßt.
Das Projekt läßt sich mit einem installierten Yagarto einfach
mit 'make' übersetzen.

Autor: Nador Rif (rifman)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
let wrote:
> Hier mal ein LwIP Beispiel ohne RTOS. Ich glaube das habe ich
> aus der LPC2000 Gruppe von Yahoo.
>
> Ich habe die EMAC Initialisierung für den 2368 Rev. B angepaßt.
> Das Projekt läßt sich mit einem installierten Yagarto einfach
> mit 'make' übersetzen.

Danke dir, das ist aber der LWIP-Stack, den ich benutze.
Ich glaube, ich weiss jetzt woran es liegt, ich habe den Stack auf den 
LPC2468-Embedded Artists Board portiert, der benutzte Ethernet 
Controller da ist KSZ8001, deswegen musste ich den  EMAC.c dafür 
anpassen.Ich glaube irgendetwas stimmt da nicht, es wäre echt Klasse 
wenn jemand, der sich damit auskennt einen Blick dareinzuwerfen(siehe 
Anhang) , vilelen vielen Dank!

Autor: Nador Rif (rifman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe auch noch was gemerkt, wenn ich 30 UDP-Pakete sende maht der uC 
dicht, ich komme langsam zur Verzweiflung!

Autor: let (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zu deiner PHY kann ich leider nichts sagen. Naja, zur Dallas PHY
eigentlich auch nicht, die Funktioniert mit dem Code einfach ;).
Wobei sich da sicher noch das eine oder andere optimieren läßt.

Aber wie verschickst du denn UDP Pakete? Gibst du den verwendeten pbuf
jedesmal wieder frei?

Autor: Nador Rif (rifman)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Du findest im Anhang die Initialisierung und die Send-Routine.

Autor: let (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich mache das mit einem udp_connect()/udp_send() und beim pbuf_alloc()
gebe ich PBUF_RAM als Typ an.
IP4_ADDR(&ip, sGlblArgCmdSetIP.iServerIP_0, sGlblArgCmdSetIP.iServerIP_1, sGlblArgCmdSetIP.iServerIP_2, sGlblArgCmdSetIP.iServerIP_3);
udp_connect(conn, &ip, 333);

...

buf = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct ServerData), PBUF_RAM);
memcpy(buf->payload, (void*) &cmd, sizeof(struct ServerData));
udp_send(conn, buf);
pbuf_free(buf);

Dein Code sollte so aber auch funktionieren. Ich habe die Geräte
hier nicht aufgebaut, sodaß ich deine Variante im Moment nicht
ausprobieren kann.
Ist die PBUF_POOL_BUFSIZE bei dir groß genug für ein Paket?

Autor: Nador Rif (rifman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das größte UDP-Paket ist 6Byte groß und  PBUF_POOL_BUFSIZE ist 128.
Wenn ich jetzt PBUF_RAM als Typ angebe, nach 31 UDP-Pakete bekomme ich 
keine Antworten vom uC, kann man irgendwo die Größe von PBUF_RAM 
bestimmen?

Autor: Nador Rif (rifman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Echt Schade, dass mir keiner weiterhelfen kann, :-(

Autor: Nador Rif (rifman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muss man eigentlich der empfangene Puffer auch freigeben?

Autor: let (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sobald man die empfangenen Daten verarbeitet hat muß auch
der PBUF freigegeben werden. Bis dahin gehört der Puffer dir.

Ich bin zeitlich etwas eingeschränkt aber vielleicht komme
ich heute Abend dazu mal ein Projekt für das MCB2300 zu bauen
das fleißig UDP Pakete sendet.

Autor: Nador Rif (rifman)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Kannst du mal bitte in der Receive-Routine reinschauen und mir Bescheid 
sagen, ob dir etwas einfällt, Danke.

Autor: let (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So, an deinem Receive fällt mir nichts auf. Ich habe mal ein
Projekt erstellt das alle 500ms ein UDP-Paket raussschickt.
Vielleicht hilft dir das weiter. Die Zieladresse muß noch
angepaßt werden, sonst gibt es nichts außer ARP-Requests.

Autor: rifman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.