Forum: Mikrocontroller und Digitale Elektronik STM32 LwIP + HTTPD


von Markus (Gast)


Lesenswert?

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

von J. S. (jojos)


Lesenswert?

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
von Johnny B. (johnnyb)


Lesenswert?

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

von Markus (Gast)


Lesenswert?

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

von Markus W. (naggusm)


Lesenswert?

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

von J. S. (jojos)


Lesenswert?

Markus schrieb:
> Wo finde ich die Einstellung für den Interrupt Stack?

ich hatte meinen Beitrag nochmal bearbeitet und die Änderungen 
beschrieben

von Markus (Gast)


Lesenswert?

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

von J. S. (jojos)


Lesenswert?

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.

von Markus (Gast)


Lesenswert?

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

von Markus (Gast)


Angehängte Dateien:

Lesenswert?

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

von Gerhard W. (dd4da) Flattr this


Lesenswert?

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.

von Til S. (Firma: SEGGER) (til_s)


Lesenswert?

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/

von Andreas M. (amesser)


Lesenswert?

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