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ß
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.
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.
@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ß
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.
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.