Moin, bin grade dabei, LWIP einzurichten, damit ich den auf meinem LPC2468 Board laufen lassen kann. Im Moment bin ich schon mal soweit, dass das Ding in IAR EWARM sich compilieren lässt, bis auf einen einzigen Error: "MEMP_NUM_SYS_TIMEOUT is too low to accomodate all required timeouts" was muss ich da noch ändern? Ausserdem finde ich, ist dieser memory pool manager nicht notwendig. Ich habe auf meinem System ein funktionierendes malloc selber geschrieben, man könnte doch das verwenden, oder nicht? Dann weiter: ich verwende kein OS. Was muss ich da noch alles einstellen? Was muss ich für funktionen aufrufen, um den LWIP zu starten und wo verbinde ich das mit dem EMAC driver? Einen solchen habe ich bereits geschrieben (LPC2468 + Micrel KSZ8001 Phy), welcher auch funktioniert. Doch wie füge ich das nun zusammen? Alles in allem noch ein paar Fragezeichen, ich hoffe ihr könnt mir ein paar Tipps geben, die Doku von LWIP lässt ein bisschen zu wünschen übrig...
Da mir keiner geantwortet hat, hole ich den Thread jetzt nochmal nach oben. Ich habe nun nach langem herumpröbeln und dank eines Beispielprojekts, das ich im Internet gefunden habe, herausgefunden, wie man den lwip einrichtet. Er lässt sich jetzt ohne Fehler compilieren. Ich bin jetzt auch schon so weit, dass DHCP und so weiter funktioniert - ich kann mein LPC2468 Board erfolgreich im heimischen LAN anpingen. Nun möchte ich aber noch, dass sich das Board via Hostnamen ansprechen lässt. Wie kann ich dies erreichen? anstatt ping 192.168.1.22 möchte ich lieber ping lwip schreiben können. Der TCP-Stack soll dann den Hostnamen selber auflösen können. Ich gehe mal davon aus, dass man dazu DNS benötigt. Der lwip unterstützt DNS ja. Nur, wie richte ich es ein, dass er sich über einen von mir definierten Hostnamen ansprechen lässt? es gibt ja die Option LWIP_NETIF_HOSTNAME in der lwipopts.h, jedoch bewirkt diese Option nichts. Wofür ist die da? Und wo kann ich meinen eigenen Hostnamen definieren?
Hi LWIP kann als DNS Client arbeiten. Du brauchst aber einen DNS Server oder einen Eintrag in der hosts-Datei deines Betriebssystems wenn dein Board auf einer festen IP sitzt. Matthias
Tobias Plüss schrieb: > Ich habe nun nach langem herumpröbeln und dank eines Beispielprojekts, > das ich im Internet gefunden habe, herausgefunden, wie man den lwip > einrichtet. Kannst Du uns daran teilhaben lassen? Eventuell das BSP Projekt (also die wichtigen Teile) anhängen? THX
Muss wirklich ein DNS-Server implementiert werden, um ein Gerät via Hostnamen anzusprechen? Ich kann mir das fast nicht vorstellen, denn jeder beliebige poplige Windows-PC lässt sich über seinen Hostnamen ansprechen. Pinge ich im heimischen LAN meinen Desktop-PC vom Notebook aus an, dann kann dieser jedenfalls den Namen auflösen. Und da ist doch sicher kein DNS-Server eingerichtet, oder doch? Kann man selber sowas implementieren? Andere Frage. Wie sieht es mit Telnet aus? Gibt es da fertige Implementierungen? Ich möchte mit meinem Mikrocontroller gerne via Telnet "reden", indem ich z.B. Hyperterminal benutze oder den telnet-Befehl in der Konsole. Geht sowas auch?
op, ja kann ich schon machen. Oder ich kann ein kleines Tutorial basteln. Das wäre vllt. nützlicher. Ich habe zum Glück alles dokumentiert, was ich gemacht habe, dann lässt sich das ganze auch später wieder nachvollziehen.
Tobias Plüss schrieb: > op, > ja kann ich schon machen. Oder ich kann ein kleines Tutorial basteln. > Das wäre vllt. nützlicher. Ich habe zum Glück alles dokumentiert, was > ich gemacht habe, dann lässt sich das ganze auch später wieder > nachvollziehen. Das wäre supi. ADs lwip kullert ja einem permanent vor den Füßen rum (AVR32, Xilinx etc).
Nun ja, mit AVR32 und Xilinx habe ich aber gar nichts am Hut. Ich bin vielmehr auf der NXP ARM-Schiene, "meinen" lwip habe ich ja auch auf dem NXP LPC2468 laufen. Das meiste ist zum Glück wirklich hardwareunabhängig. Bist du denn zur Zeit an einem konkreten Projekt? wo haperts denn mit dem lwip? mittlerweile, nachdem ich mich durch die ganzen Headerfiles durchgelesen habe, weiss ich schon das eine oder andere. Vielleicht kann ich dir ja einen Tipp geben?
Ne, ein konkretes Projekt habe ich nicht. Wir sind vielmehr an allem interessiert (Uni). Und da hilft ein Paper, welches eventuelle Fratzenfallen aufzeigt, ungemein. Ohne weitere Recherche bzw. eigenem Brain kommt man ja bei konkreten Projekten nie weiter. Also beim AVR ist mir der lwip bei dem RTOS Example aufgefallen. Bezüglich Xilinx ist lwip eine Option beim SDK (ich glaub, das war auch ein Standalone Echo Server Example). Ansonsten ist ja lwip recht gutmütig (und gut dokumentiert), nur die entsprechenden Ports an die MAC Layer können recht tricky sein ;-).
Also ich benutze lwip hier ohne Betriebssystem. Das funktioniert ganz gut, und eigentlich auch sehr zuverlässig - bei meinem Dauertest, welcher nun schon seit einem ganzen Tag Pakete hin- und her schickt in meinem LAN, ist bisher kein einziges Paket verloren gegangen. Einzig ein Fehler triff auf, nämlich wenn man ein Ping-Paket verschickt, das grösser als 256 Bytes ist - dann stürzt der Rechner nach ca. 8 Paketen ab, und ich weiss bis jetzt noch nicht, wieso. Aber das ist ein anderes Thema :-) Bisher sind 300000 Pakete erfolgreich übertragen worden. Also scheint die Sache ansich zu funktionieren. Zur Doku von lwip - naja, ich finde, die lässt ziemlich zu wünschen übrig. Das pdf, welches man auf der Site von Adam Dunkels runterladen kann, ist ja nicht aktuell, und die ganze Doku, welche im lwip-Source enthalten ist, sind etwa 3 Textfiles, welche für meinen Geschmack ziemlich dürftig sind. Alles, was ich über lwip weiss, habe ich durch try and error rausgefunden, aus Beispielcodes aus dem Internet extrahiert, und einen Teil habe ich auch noch von einem Arbeitskollegen, da der lwip in einem Produkt von uns zum Einsatz kommt.
Tobias Plüss schrieb: > Muss wirklich ein DNS-Server implementiert werden, um ein Gerät via > Hostnamen anzusprechen? Oder über die hosts Datei deines OS. > Ich kann mir das fast nicht vorstellen, denn jeder beliebige poplige > Windows-PC lässt sich über seinen Hostnamen ansprechen. Pinge ich im > heimischen LAN meinen Desktop-PC vom Notebook aus an, dann kann dieser > jedenfalls den Namen auflösen. Und da ist doch sicher kein DNS-Server > eingerichtet, oder doch? Die Namensauflösung wird vermutlich irgendwie über SMB erledigt. Keine Ahnung wie Windows das macht. Standard ist nunmal DNS. > Kann man selber sowas implementieren? Sicher. Aber auf der LWIP Seite brauchst du ja keinen DNS Server. Du kannst z.B. auch einen kleinen DHCP-Server unter Windows verwenden der auch als DNS arbeitet -> http://ruttkamp.gmxhome.de/dhcpsrv/dhcpsrv.htm > Andere Frage. > Wie sieht es mit Telnet aus? Gibt es da fertige Implementierungen? Ich > möchte mit meinem Mikrocontroller gerne via Telnet "reden", indem ich > z.B. Hyperterminal benutze oder den telnet-Befehl in der Konsole. > Geht sowas auch? Telnet ist doch primitiv. Einfach auf der LWIP Seite einen Serversocket einrichten und dann auf eine Verbindung warten. Die ankommenden Kommandos von deinem Telnetclient musst du dann nur noch passend interpretieren. Matthias
Μαtthias W. schrieb: >> Ich kann mir das fast nicht vorstellen, denn jeder beliebige poplige >> Windows-PC lässt sich über seinen Hostnamen ansprechen. Pinge ich im >> heimischen LAN meinen Desktop-PC vom Notebook aus an, dann kann dieser >> jedenfalls den Namen auflösen. Und da ist doch sicher kein DNS-Server >> eingerichtet, oder doch? > > Die Namensauflösung wird vermutlich irgendwie über SMB erledigt. Keine > Ahnung wie Windows das macht. Standard ist nunmal DNS. Hallo, unter Windows wird zunächst versucht, den Namen über NBNS aufzulösen, bevor ein DNS-Server befragt wird. Ich hatte unter http://www.mail-archive.com/lwip-users@nongnu.org/msg04904.html eine Implementierung des Protokolls für LWIP gefunden und es dann erweitert, dass auch Namen zu einer IP-Adresse aufgelöst werden. Im Anhang sind die Dateien.
dj999, wow - das funktioniert!!!! SUPER :-) jetzt geht auch ping lwip anstatt ping 192.168.1.22 super Sache. Und wirklich sehr einfach - ich musste nur die beiden Dateien zum Projekt hinzufügen und in main() die Funktion nbns_init aufrufen, fertig. Cool! Jetzt habe ich nur noch eine Frage zum DNS. Ich habe den DNS-Code vom lwip studiert, und dort wird ein ganz bestimmter DNS-Server verwendet:
1 | #define DNS_SERVER_ADDRESS(ipaddr) (ip4_addr_set_u32(ipaddr, ipaddr_addr("208.67.222.222"))) /* resolver1.opendns.com */ |
das mag ganz gut funktionieren, doch es ist nicht wirklich zweckmässig. Ich betreibe ja mein Board in einem LAN, wo per DHCP unter Umständen ein DNS-Server zugewiesen wird. Wie kann ich lwip verklickern, dass er anstatt diesem opendns den per DHCP vorgegebenen DNS-Server benutzen soll? Und erst wenn kein solcher verfügbar ist, soll dieser opendns benutzt werden. Denn für solche Zwecke ist ja dieser DNS-Server da, den man über DHCP bekommt!
Μαtthias W. schrieb: > Tobias Plüss schrieb: >> Muss wirklich ein DNS-Server implementiert werden, um ein Gerät via >> Hostnamen anzusprechen? > > Oder über die hosts Datei deines OS. Oder MDNS verwenden.
Tobias Plüss schrieb: > Ich betreibe ja mein Board in einem LAN, wo per DHCP unter Umständen ein > DNS-Server zugewiesen wird. Wie kann ich lwip verklickern, dass er > anstatt diesem opendns den per DHCP vorgegebenen DNS-Server benutzen > soll? > Und erst wenn kein solcher verfügbar ist, soll dieser opendns benutzt > werden. > Denn für solche Zwecke ist ja dieser DNS-Server da, den man über DHCP > bekommt! Das ist doch schon im LWIP eingebaut. Der opendns-Server wird als default eingestellt. Falls über DHCP eine DNS-Serveradresse empfangen wird, wird dieser Server zur Liste der DNS-Server über dns_setserver() hinzugefügt (dhcp.c).
Ich versuche grade noch, einen richtig guten, sauberen Treiber für den Ethernet-MAC zu schreiben. Und mir ist dabei folgende Idee gekommen: Ich verwende den lwip ja auch einem LPC2468. Dessen Ethernet MAC kann die ankommenden Ethernet-Frames direkt via DMA ins Memory kopieren - kann ich lwip nicht irgendwie so konfigurieren, dass dieser "weiss", dass die Frames bereits in einem bestimmten Memory sind? Alle Beispiele, dich ich bisher gefunden habe, alloziieren erst einen pbuf und kopieren dann den ganzen Frame da hinein. Das ist doch nicht nötig, wenn der Frame schon als ganzes im Memory liegt! kann man das irgendwie verbessern?
Jetzt habe ich doch noch ein paar Fragen. WIESO läuft mein Programm nicht richtig? Ich versuche es seit Stunden. Ich beobachte folgendes verhalten: - kompiliere ich das Projekt mit den Optionen "Include Debug Information", "Disable Compiler Optimizations" dann läuft es (aus dem internen RAM des LPC2468). DHCP funktioniert, nbns funktioniert, einfach das "lauschen" auf meinen UDP-Port 9999 funktioniert NICHT. Anpingen kann ich das Board zwar, sende ich jedoch ein Ping-Paket, welchess grösser als 256 Bytes ist, stürzt der Rechner ab oder liefert nur noch sporadisch die Echo Replies. Es ist nicht reproduzierbar, wann der Rechner abstürzt. - Der lwip benötigt bei mir 20 MB RAM. Reserviere ich weniger Platz für den CSTACK, dann stürzt das Programm ab. - kompiliere ich das ganze als Release, also "Do not generate debug Information", "Optimize for Speed", dann läuft GAR NICHTS. Ebenso mit den Optionen "Optimize for Size", "Balanced Optimization", "No Optimization". - wenn in der main.c diese paar Zeilen drin sind:
1 | conn = udp_new(); |
2 | udp_connect(conn, IPADDR_ANY, 333); |
3 | udp_bind(conn, NULL, 9999); |
4 | udp_recv(conn, proc, NULL); |
dann funktioniert DHCP nur sporadisch (ungefähr nach jedem 2. Reset), pingen kann ich das Board nicht, weder unter seiner IP noch unter seinem Hostnamen (nbns funktioniert also auch nicht). Kommentiere ich diese paar Zeilen aus oder lösche sie, dann funktioniert alles. (Nur halt wie oben beschrieben). Ich kann somit keine UDP-Pakete empfangen (sobald ich die obigen Zeilen einfüge, funktioniert das Programm ja nicht mehr), TCP konnte ich noch nicht mal testen. Interessant ist: wenn ein UDP-Paket rein kommt, dann kann ich im Single Step Modus die Verarbeitung im lwip genau Verfolgen. Er kommt bis zu dem Punkt, wo er die Liste der geöffneten Ports durchgeht. Dort verheddert er sich irgendwie und stürzt ab (Programm beginnt wieder bei main). Meine Hardware ist ein selber gebautes LPC2468 Board mit 256M SDRAM sowie einem KSZ8001L Phy. Die Hardware ist getestet und funktioniert! Als Compiler dient der IAR. Zum debuggen benutze ich den Segger J-Link. Alle Stacks und Variablen usw. liegen im SDRAM ab Adresse 0xA0000000. CPU-Takt ist 72 MHz. Hab ich was vergessen? Kann mir einer weiter helfen? Im Anhang mein kompletter Sourcecode. Linkerscripte und Mapfiles kann ich auch hochladen, wenn das vonnöten sein sollte. Ich hoffe wirklich, ihr könnt mir weiter helfen, ich bin in den letzten 2 Stunden sicher um 10298309457 Jahre gealtert, weil ich mich so ab dieser Software ärgere :-)
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.