Forum: Mikrocontroller und Digitale Elektronik ESP32-S2 FreeRTOS implementieren


von Moot S. (mootseeker)


Lesenswert?

Hallo Zusammen,

ich habe heute versucht ein ESP32-S2 in betrieb zu nehmen.
Das hat ohne Probleme Funktioniert. Ich programmiere das ESP in Visual 
Studio Code mit Platform IO und verwende das Arduino Frame Work, da ich 
die Basics testen möchte.

Ich habe mir ein Display angeschlossen und konnte dies auch erfolgreich 
ansteuern. Nun läuft auch LVGL als Grafik Library auf dem ESP.

Nun möchte ich FreeRTOS mit einbinden, damit ich für mein Display einen 
eigenen Task erstellen kann.

Das Problem ist aber, wenn ich versuche einen Task zu erstellen stürzt 
das ganze ab und startet neu. Das ist mein Code:
1
#include <Arduino.h>
2
#include <FreeROTS.h>
3
4
5
void task1 ( void * pvParameters)
6
{
7
    for(;;)
8
    {
9
        Serial.println("Task1"); 
10
        vTaskDelay(1000 / portTICK_RATE_MS); 
11
    }
12
}
13
14
void task2 ( void * pvParameters)
15
{
16
    for(;;)
17
    {
18
        Serial.println("Task2"); 
19
        vTaskDelay(1000 / portTICK_RATE_MS); 
20
    }
21
}
22
23
void setup()
24
{
25
    xTaskCreate(
26
        task1, 
27
        "Task 1", 
28
        1000, 
29
        NULL, 
30
        1, 
31
        NULL
32
    ); 
33
34
    xTaskCreate(
35
        task2, 
36
        "Task 2", 
37
        1000, 
38
        NULL, 
39
        1, 
40
        NULL
41
    ); 
42
}
43
44
void loop()
45
{
46
    
47
}

Nun der Code an sich sollte ja schon korrekt sein. Meine Frage ist 
funktioniert FreeRTOS schon auf dem ESP32-S2?

von Euro (Gast)


Lesenswert?

Also generell läuft das FreeRTOS auf dem S2 schon. Einen generellen 
Fehler sehe ich in Deinen Zeilen auch nicht. Welche Version des 
Arduino-Packages hast Du denn installiert (der S2 wird erst ab 2.0.0 
unterstützt, z.Zt. sind wir bei 2.0.3)?

Was ich nicht weiß: Wie schummelst Du denn die <FreeROTS.h> am Compiler 
vorbei?

von J. S. (jojos)


Lesenswert?

ist das Serial.print denn Thread safe? Was passiert wenn es nur in einer 
Task läuft, und du in der anderen eine LED blinken lässt?

welche Version von lvgl ist in dem Arduinoframework? Ich wollte das mit 
dem IDF machen, da war bisher nur die 7er Version drin. Oder ist das 
auch schon auf die 8er aktualisiert worden?

: Bearbeitet durch User
von Mario M. (thelonging)


Lesenswert?

Moot S. schrieb:
> stürzt das ganze ab und startet neu.

Irgendwelche Fehlermeldungen dabei?

Moot S. schrieb:
> Meine Frage ist funktioniert FreeRTOS schon auf dem ESP32-S2?

Neueste Arduino-Version installiert? Wird beim compilieren ESP32-S2 
angezeigt? Das ist ja die Singlecore-Version, wäre blöd wenn für 
Multicore compiliert würde.

von J. S. (jojos)


Lesenswert?

Stack scheint zu klein zu sein, auf einem ESP32S läuft es auch nicht 
(mit ESP-IDF und nur LOGI Funktion in der Task). Mit 2k Stack läuft es. 
Wobei die Frage ist warum der so groß sein muss.

von Moot S. (mootseeker)


Lesenswert?

Also zuerst zur Lösung des Problems:

War die Stack Grösse. Ich habe jetzt für Task 1 4096 Bytes und beim Task 
2 welchen ich nun auch zum Display Task umfunktioniert habe sogar auf 
16384 Bytes. So funktioniert die implementierung.

Weiss jemand warum das so viel Stack-Speicher benötigt?

Euro schrieb:
> Welche Version des
> Arduino-Packages hast Du denn installiert (der S2 wird erst ab 2.0.0
> unterstützt, z.Zt. sind wir bei 2.0.3)?

Ich verwende die Version 2.0.3

J. S. schrieb:
> welche Version von lvgl ist in dem Arduinoframework? Ich wollte das mit
> dem IDF machen, da war bisher nur die 7er Version drin. Oder ist das
> auch schon auf die 8er aktualisiert worden?

Ich nutze Version 8.3 von Lvgl, ist vor zwei tagen aktualisiert worden.

J. S. schrieb:
> Wobei die Frage ist warum der so groß sein muss.

Ich habe hier einen Interessanten Beitrag auf Reddit gefunden:
https://www.reddit.com/r/embedded/comments/sz2ru9/esp32_freertos_big_stack_size/

: Bearbeitet durch User
von Moot S. (mootseeker)


Lesenswert?

Moot S. schrieb:
> Ich habe hier einen Interessanten Beitrag auf Reddit gefunden:
> https://www.reddit.com/r/embedded/comments/sz2ru9/esp32_freertos_big_stack_size/

Im FreeRTOSconfig.h File steht bei minimal Stack size:
1
 #define configMINIMAL_STACK_SIZE                        (768 + configSTACK_OVERHEAD_TOTAL)

Das ganze ist dann wie folgt aufgebaut:
1
/* Higher stack checker modes cause overhead on each function call */
2
#if CONFIG_STACK_CHECK_ALL || CONFIG_STACK_CHECK_STRONG
3
#define configSTACK_OVERHEAD_CHECKER                    256
4
#else
5
#define configSTACK_OVERHEAD_CHECKER                    0
6
#endif
7
8
/* with optimizations disabled, scheduler uses additional stack */
9
#if CONFIG_COMPILER_OPTIMIZATION_NONE
10
#define configSTACK_OVERHEAD_OPTIMIZATION               320
11
#else
12
#define configSTACK_OVERHEAD_OPTIMIZATION               0
13
#endif
14
15
/* apptrace mdule increases minimum stack usage */
16
#if CONFIG_APPTRACE_ENABLE
17
#define configSTACK_OVERHEAD_APPTRACE                   1280
18
#else
19
#define configSTACK_OVERHEAD_APPTRACE                   0
20
#endif
21
22
/* Stack watchpoint decreases minimum usable stack size by up to 60 bytes.
23
   See FreeRTOS FREERTOS_WATCHPOINT_END_OF_STACK option in Kconfig. */
24
#if CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK
25
#define configSTACK_OVERHEAD_WATCHPOINT                   60
26
#else
27
#define configSTACK_OVERHEAD_WATCHPOINT                   0
28
#endif
29
30
#define configSTACK_OVERHEAD_TOTAL (                                    \
31
                                    configSTACK_OVERHEAD_CHECKER +      \
32
                                    configSTACK_OVERHEAD_OPTIMIZATION + \
33
                                    configSTACK_OVERHEAD_APPTRACE +     \
34
                                    configSTACK_OVERHEAD_WATCHPOINT     \
35
                                                                        )
36
37
#define configMINIMAL_STACK_SIZE                        (768 + configSTACK_OVERHEAD_TOTAL)

Wenn man das nun zusammen rechnet kommt man auf eine minimale Grösse von 
828 Word. Habe ich übrigens oben falsch geschrieben es sind words und 
nicht bytes.

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.