Hallo,
ich habe im Schrank noch ein NUCLEO-144 Board gefunden und dachte mir, ich könnte "mal eben" einen Webserver zusammenklicken.
Ich nutze STM32CubeIDE und habe dort im ersten Anlauf LwIP ohne OS aktiviert. Damit bekomme ich ICMP zum laufen, sobald ich aber TCP und/oder UDP mit reinnehme, funktioniert ICMP nicht mehr (TCP und UDP vermutlich auch nicht).
Ich konfiguriere alles mit dem in der IDE integrierten STMCubeMX.
Ich denke, TCP braucht zum funktionieren ein OS. Wenn ich allerdings FreeRTOS zusammen mit LwIP aktiviere, hängt die SW irgendwo beim Start (Hardfault, IRQ0). FreeRTOS mit deaktiviertem LwIP kriege ich zum Laufen.
Ich dachte, ich kann einfach den HTTPD im STMCubeMX aktivieren und bekomme dann ein lauffähiges Grundgerüst. War wohl falsch gedacht :-(
Gibt es irgendwo ein aktuelles Tutorial oder ein aktuelles Beispielprojekt für diesen Anwendungsfall ? Oder kann mir Jemand ein paar Tips geben, welche Optionen aktiviert/deaktiviert werden müssen (da sind ja einige Optionen bei LwIP).
Vielen Dank,
Markus
Setze mal den Stack für den Interrupthandler hoch, default müsste in Cube 350 Worte drin stehen, ist zuwenig. Und der auch der Stack für den Rtos Task ist zu knapp bemessen, vor allem im Debug Build.
genauer:
in Ethernetif.c:
#define INTERFACE_THREAD_STACK_SIZE ( 512 )
Und der auch der Stack für den
Rtos Task ist zu knapp bemessen,
OK, ich habe jetzt unter "FreeRTOS->Config parameters->Kernel settings" den PArameter "MINIMAL HEAP SIZE" von 128 auf 1024 WORDS hochgesetzt. Jetzt kann ich zumindest schon mal ICMP mit RTOS machen.
Wo finde ich die Einstellung für den Interrupt Stack?
TCP funktioniert bei lwIP auch bare-metal (ohne OS). Allerdings nur die "RAW" API. Socket & NetConn API gibt's dann nur mit einem OS drunter.
lwIP hat normalerweise ein paar demo-apps mit an Board, die man einfach starten kann. Darunter auch ein Webserver mit rudimentärem CGI-Interpreter und mini ROM-FS für Mediendateien
https://lwip.fandom.com/wiki/Sample_Web_Server
ja tcp_thread wird durch Packetempfang geweckt und reicht dann die Daten in den Stack. Bei generiertem Code für einen F7 war das der Fehler. STM hat diesen Code in Mbed übernommen mit gleicher Stackgröße, daher kenne ich den Fehler. Ist beim Debug Build aufgefallen, dann war der Stack zu klein.
Ob der Code beim F4 jetzt genauso ist weiß ich nicht, hätte ich jetzt aber angenommen.
Ein kurzes Update:
Der Webserver funktioniert jetzt. Es fehlte der Aufruf zum Starten des Webservers "httpd_init();".
Geholfen hat mir neben den Antworten in diesem Thread das angehängte PDF.
In der Konfiguration habe ich nur ICMP und HTTPD aktiviert.
Die Option LWIP_TCP habe ich manuell in lwipopts.h aktiviert. Beim Aktivieren mittels CubeMX verschwindet die Option aus dem File (vlt. fehlen da noch irgendwelche Abhängigkeiten...).
Wenn auch nicht wirklich hilfreich, LWIP ist mit abstand der langsamste Stack den ich bisher einsetzte. Der Quellcode ist ein Chaos erster Klasse.
Debuggen lässt sich kaum - jedenfalls nicht ohne sündhaft Werkzeug.
Manche Optionen sind nicht vollständig implementiert. OK, für einen einfachen Webserver oder etwas IoT, mag dies alles reichen. Ich brauchte schnelleres und eine Option zum Debuggen, ohne gleich ein Vermögen investieren zu müssen.
Ich probierte den Keil Stack und der war erheblich besser - leider aber nicht kostenlos nutzbar.
Am Ende bin ich bei "Segger Embedded Studio" gelandet, die es mir für non-Commercial Projekte möglich macht, auch die Professional Tools nutzen zu dürfen.
Der Stack ist wirklich sehr gut und die Umgebung gut dokumentiert. Alles was man sich wünscht, ist vorhanden und vollständig implementiert.
Will man also mal schnell was bauen und dies nicht kommerziell verwerten, ist Segger und ihr SES sagenhaft gut.
Natürlich kann man auch freies einsetzen und oft genug reicht LWIP aus. Wer daran Spaß daran hat, gern.
Alternativ haben wir für die Evaluierung Softwarepakete, die spezifisch für ein Board sind und verschiedene Embedded Software enthalten. Diese heißen SEGGER Eval Software:
https://www.segger.com/evaluate-our-software/