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 in freertos.c: const osThreadAttr_t defaultTask_attributes = { .name = "defaultTask", .stack_size = 512 * 4, .priority = (osPriority_t) osPriorityNormal, }; von 128 auf 512. Ob 512 wirklich nötig sind habe ich nicht getestet, müsste man mit FreeRTOS Stackanalyse prüfen.
:
Bearbeitet durch User
Markus schrieb: > ich habe im Schrank noch ein NUCLEO-144 Board gefunden und dachte mir, > ich könnte "mal eben" einen Webserver zusammenklicken. Versuch doch mal CycloneTCP, das ist für den Privatgebrauch kostenlos. Für HTTPS gibts ein fixfertiges Beispiel. https://www.oryx-embedded.com/products/CycloneTCP.html
J. S. schrieb: > 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? Markus
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
Markus schrieb: > Wo finde ich die Einstellung für den Interrupt Stack? ich hatte meinen Beitrag nochmal bearbeitet und die Änderungen beschrieben
J. S. schrieb: > genauer: > in Ethernetif.c: > #define INTERFACE_THREAD_STACK_SIZE ( 512 ) > > und in freertos.c: > const osThreadAttr_t defaultTask_attributes = { > .name = "defaultTask", > .stack_size = 512 * 4, > .priority = (osPriority_t) osPriorityNormal, > }; Die Einträge stehen jetzt beide auf 1024. BZW, den defaultTask gibts bei mir nicht mehr, aber alle angelegten Threads hben 1024 * 4 als stack_size. Konkret habe ich gar keinen Task angelegt, der das TCPIP-Handling macht. Scheinbar wird das von "tcpip_thread" in tcpip.c erledigt.
1 | * The main lwIP thread. This thread has exclusive access to lwIP core functions |
2 | * (unless access to them is not locked). Other threads communicate with this |
3 | * thread using message boxes. |
4 | *
|
5 | * It also starts all the timers to make sure they are running in the right |
6 | * thread context. |
7 | *
|
8 | * @param arg unused argument |
9 | */
|
10 | static void |
11 | tcpip_thread(void *arg) |
12 | {
|
13 | struct tcpip_msg *msg; |
14 | LWIP_UNUSED_ARG(arg); |
15 | |
16 | LWIP_MARK_TCPIP_THREAD(); |
17 | .
|
18 | .
|
19 | .
|
Markus
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.
Wenn ich TCP/UDP wieder aktiviere, klappt ICMP wieder nicht mehr. Zumindest bleibt aber nichts mehr hängen bzw. es kommt kein IRQ0 mehr. Ich denke, ich werde mir die nächsten Tage mal den Sample_Web_Server ansehen, der bei LwIP dabei ist und das Ding von STM ignorieren. Markus
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...). Markus
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.
Vielleicht kurz zur Erklärung: Embedded Studio ist eigentlich nur die IDE, die den SEGGER Compiler, SEGGER Linker, SEGGER Runtime Library, etc. enthält: https://www.segger.com/products/development-tools/embedded-studio/ Wir haben aber auch verschiedene Embedded Software wie RTOS, TCP/IP Stack, Webserver, USB, File System, etc.: https://www.segger.com/products/rtos-embedded-software/ Diese sind als Libraries im Embedded Studio Pro enthalten. D.h. ich kann aus Embedded Studio heraus diese Komponenten auswählen und im Projekt benutzen. https://www.segger.com/products/development-tools/embedded-studio/editions/pro-cortex-m/ 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/ Dann gibt es noch die Board Support Packages in den jeweiligen embOS Ports wenn man nur ein RTOS benutzen möchte: https://www.segger.com/products/rtos/embos/ Und alles kann man unter der SEGGER's Friendly License benutzen: https://www.segger.com/purchase/licensing/license-sfl/
Gerhard W. schrieb: > Wenn auch nicht wirklich hilfreich, LWIP ist mit abstand der langsamste > Stack den ich bisher einsetzte. Der Quellcode ist ein Chaos erster > Klasse. Nur wenn man Ihn nicht versteht und keine Ahnung hat was man tut. Mir reicht ne 100MHz Cortex-M4 um damit ca. 50MBit/s zu schaffen.
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.