Forum: Mikrocontroller und Digitale Elektronik Keil RTX5 auf STM32G070 lohnt sich überhaupt?


von Swies (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,
ich möchte den footprint von RTX5 von Keil auf einen STM32G070 
ausprobieren.
Angeblich code-size: ca.5KB (RAM=???). Dafür hab ich ein leeres Projekt 
mit RTX erstellt (siehe source code). Das Ergebnis ist erschreckend: 
ZI-Data sehr hoch (ca. 35KB)

Program Size: Code=7384 RO-data=560 RW-data=168 ZI-data=35768

ist es normal? was mach ich hier falsch? Lohnt sich überhaupt RTOS auf 
einen
Cortex-m0?
Gruß

von Swies (Gast)


Angehängte Dateien:

Lesenswert?

Im MAP-File habe ich den "Übeltäter" gefunden. Nämlich in rtx_lib wird
eine dynamische Speichergröße von 32768 definiert.

rtx_config.h
....
#ifndef OS_DYNAMIC_MEM_SIZE
#define OS_DYNAMIC_MEM_SIZE         32768
#endif

unabhängig davon: wieviel Threads,mutex,... welche uC usw...
Ich glaub hier soll der Entwickler die Speichergröße je nach Bedarf 
anpassen.
Diesen Default-Wert habe ich erstmal auf 8K reduziert. Welche Auswikrung 
auf sich hat, werde ich hoffentlich in der RTX-Doku finden müssen.
Vielleicht kann jemand hier seine Erfahrung mit der Konfiguration von 
RTX teilen.

von Johannes S. (Gast)


Lesenswert?

ich benutze RTX indirekt da es in Mbed-OS als RTOS drin ist. Da 
Cortex-M0 ja auch viel Flash/Ram haben können, lohnt es sich durchaus 
die auch für RTOS zu nutzen. Die GCC behandelt die M0 allerdings etwas 
stiefmütterlich was die Codeoptimierung angeht, da war der Keil immer 
besser. Ich weiß aber nicht ob das bei den aktuellen Versionen immer 
noch so ist.

Das preämptives RTOS hat natürlich mehr 'Verschnitt', alleine dadurch 
das Threads eigene Stacks haben und man da ja auch Reserven lässt.
Auch der Programmcode durch nötige Mutex wird größer: die microlib bzw. 
newlib-nano bei der GCC sind nicht threadsafe und man muss die 
umfangreichere, volle C-Runtime benutzen und das macht je nach 
Funktionen schon viele kB aus.

Das genannte define ist bei Mbed auf Grösse 0 gesetzt, ich habe mich um 
die Konfiguration bisher nicht kümmern müssen. Bei FreeRTOS gibt es das 
auch, da wird es für die eigene Speicherverwaltung benutzt, ich nehme an 
das ist bei RTX genauso. Mit Größe 0 muss die C-Runtime benutzt werden, 
bei Mbed haben die alloc Funktionen aber Wrapper. Die passen auf das 
malloc nicht im Interruptkontext aufgerufen werden (erzeugen dann einen 
Runtime Fehler), oder fügen Instrumentierung wie Statistik oder Tracing 
hinzu.
Leider ist in IDE/Tools der RTX support eher mau, z.B. im Cortex-Debug 
in VSCode gibt es keine Anzeige der Threads wie es das für andere OS 
gibt.

von Swies (Gast)


Lesenswert?

@Johannes
Vielen Dank für dein Statement. Der STM32G070 hat 128KB Flash und 36KB 
RAM.
Es geht um den RAM-Verbrauch. Da meine Application auch viel RAM 
benötigt. Bevor ich starte, möchte ich gerne eine Übersicht wieviel RAM 
ungefähr von RTX gebraucht wird. Wenn er ein Grossteil des RAM 
verbaucht, werde ich leider auf  die alte superloop umschwenken. Der 
Keil erzeugt sehr gutes optimiertes code. Übrigens: Für STM32 F0,L0 und 
G0 ist Keil frei.
Aus Erfahrung mit anderen uC mit viel Falsh und RAM ist die 
Programmierung mit RTX viel eleganter, robuster und struktierter als 
eine Superloop.
Ich hab gehoft dass andere Entwickler ihre Erfahrungen mit RTOS auf 
kleinen uC mit wenig RAM und Flash bringen.
Bei STMCubeMX in Repository ist ein Beispiel mit STM32G070 mit FreeRTOS 
und 2 Threads a 128 Stack-Size je Thread. Der RAM-Verbrauch hält sich in 
Grenzen. Nach der Kompilierung hab ich folgendes bekommen:
Program Size: Code=6508 RO-data=376 RW-data=132 ZI-data=3388
Ich denke, ich komm nicht drum herum alles zu implementieren in RTX bzw. 
FreeRTOS und wenn es Speicherprobleme gibt werde ich leider das Programm 
in Main-Loop umschreiben.

Gruß

von Mehmet K. (mkmk)


Lesenswert?

Swies schrieb:
> Ich hab gehoft dass andere Entwickler ihre Erfahrungen mit RTOS auf
> kleinen uC mit wenig RAM und Flash bringen.

Zu RTX kann ich nichts beitragen, da es eine Ewigkeit her ist, als ich 
es zuletzt benutzte. Ich bin dann zu Crossworks (der ein eigenes RTOS 
hat) umgeschwenkt und bin zufrieden damit.

Bei kleinen Projekten, die ja meist auch eine kleine MCU ihr eigen 
nennen, benutze ich hingegen Protothreads ( http://dunkels.com/adam/pt 
). Da gibt es keine Threads, die einen eigenen Stack benötigen, da alles 
statisch ist.
Bei meinem letzten Projekt hatte ich es wieder einmal benutzt:
Eine kleine MCU bedient 3 Sensoren, eine Taste, ein RGB-Led, ein Display 
und sendet die Daten via GSM an einen Server.

Aber Protothread wirklich nur bei kleinen Projekten einsetzen, da es 
ansonsen sehr unübersichtlich wird.

von Swies (Gast)


Lesenswert?

@Mehmet
Alter Schweder! Danke für diesen Tipp. Protothreads ist sehr interessant 
für mein Vorhaben. Ich spiele mal ein bisschen mit den Beispielen. Da 
ich keine zeitkritische task habe, vielleicht ist er eine gute 
Alternative zu RTOS.
Super Vorschlag.

Gruß

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.