Wenn das RAM knapp wird

Hallo Community, ich brauche mal wieder eure Unterstützung.
Vorausschicken möchte ich, dass ich mich immer noch als ziemlichen Anfänger betrachte und ich vieles, was im Netz zu finden und sicher gut und richtig ist, ganz einfach nicht verstehe.
Allerdings ist mir der Lötkolben auch näher als die Tastatur.
Aktuell habe ich ein Projekt, welches in meinen Augen bereits recht umfangreich geworden ist und welches aktuell lustige Sachen macht, sobald ich auch nur die geringste Änderung vornehme. Selbst dann, wenn diese Änderung überhaupt nicht mit dem gezeigten Verhalten im Zusammenhang steht.
Nach ein wenig Recherche gehe ich nun davon aus, dass ich zu viel RAM benötige.
Das führt mich zu meiner eigentlichen Fragestellung.

Wie kann man den unnötigen bedarf an an RAM vermeiden?
Gefunden habe ich dazu DIESEN Eintrag, der aber das Thema Flashspeicher betrifft.

Als erste Maßnahme kam z.B. rigoros das F-Makro für print zum Einsatz. Dazu gesellen sich dann Dinge, wie zu großzügig deklarierte Variablen oder die Verwendung von Variablen, wo man auch mit #define hätte arbeiten können. Für viel mehr reicht es bei mir als Anfänger aber nicht.
Gibt es ‚DOs und DON‘Ts’ um den Speicherbedarf zu verringern?

Es wäre schön, wenn hier ein paar solcher Hinweise zusammen kämen. Gerne auch mit Beispielen in Form von „So, und nicht so.“ oder ähnlichem. Ich bin mir sicher, dass einige von euch schon sehr vieles von Anfängern gesehen haben und das ein oder andere immer wieder vorkommt.

Vielen Dank im Voraus, für eure investierte Zeit. :slightly_smiling_face:

P.S: Da es mir nicht um meinen Code im Speziellen geht, werde ich hier auch keinen angeben.

Aua!
Ob du da wohl das falsche gelernt hast?

Hallo OM dl5bo

Konstante Variablen können im ProgMem abgelegt werden. Ansonsten empfiehlt sich die konsequente Verfolgung der verwendeten Datentypen in der Anwendung. Desweiteren sollten sogenannte Codeduplikate durch die Verwendung von OOP vermieden werden.
Ich denke mal hier werden noch weitere gute Vorschläge kommen.

73

Ich wünsche einen geschmeidigen Tag und viel Freude beim Programmieren in C++.

1 Like

Strings vermeiden.
Auch wenn Du das F-Makro benutzt, halte die Zeichenketten so kurz wie nötig.
Codeteile wiederverwenden, nicht doppelt schreiben.
Variablen, deren Inhalt zur Laufzeit errechnet werden kann, als Funktion schreiben.
...

2 Likes

Man kann natürlich begeistert sein, was man alles mit 2kB RAM hinbekommt, man kann auch sparsam damit umgehen, und man kann sportlichen Ehrgeiz in diese Richtung entwickeln.
Aber man sollte nicht aus dem Auge verlieren, dass es leistungsfähigere Hardware gibt als einen atmega328p, wenn der RAM-Speicher tatsächlich nicht ausreicht.

Dynamische RAM-Belegung ohne Fehlerprüfung und dadurch verursachtes unerklärliches Verhalten ist eigentlich schlimmer als wenn man klar feststellt, dass der Speicher nicht reicht.

String Objekte sind ein klares DON'T.
Der Rest hängt vom Einzelfall ab.

1 Like

Das mag durchaus sein, wie die Verwendung von dynamischem Speicher auf den kleinen AVRs. Und wenn Du dann noch die Konstanten ins PROGMEM verschoben hast, dann bleibt nicht mehr viel für eine nachhaltige Einsparung. Wer an größere Programme oder komfortables Benutzerinterface denkt, der ist mit einem größeren Controller weit besser bedient als mit dem Einsparen von Bytes.

Man sollte auch mal daran denken, daß viele Zusatzmodule wie für Netzwerk, Grafik, Bluetooth etc. mächtige Controller an Bord haben, die einen Uno so nehbenher noch emulieren könnten. Warum also nicht gleich größer einsteigen und solche Sachen per Bibliothek erledigen?

1 Like

Wahrscheinlich. Dann korrigiere die Aussage doch bitte. Das wäre prima.

F-Makro
geschickte Wahl der Variablen.
Globale Variablen meiden.
Keine Libraries verwenden die für ihren Speicherbedarf berüchtigt sind.

das ist natürlich schade. Ohne konkreten Code reduziert sich die Hilfe dann eben auf "nimm einen größeren MC".

2 Likes

Ich würde es nicht korrigieren nennen wollen.
Daher versuche ich es mal mit einer - leicht verzerrten - Erklärung.
Präprozessorderiktiven sind einfache Ersetzungen.
Der Compiler bekommt weder mit, was daraus werden soll, noch kann er sich daran machen die entsprechenden Stellen zu optimieren, da Sie für ihn tabu sind.

Wenn Du zwei identische Funktionen baust und verwendest, wird daraus 2x fertiger Code, der dann ins Kompilat eingebunden wird.
Eine Überprüfung, ob das richtig ist, was Du geschrieben hast findet ebenfalls nicht statt.
Bereichüberschreitungen sind genauso möglich wie Redefinitionen...

Las den Compiler machen.
Der prüft und optimiert besser als Du per Hand versuchst ihm vorzuenthalten.

1 Like

#define statt constexpr spart keinen RAM, verhindert nur Datentyp-sicheres Übersetzen.

Ein C++ Compiler erzeugt mit entspechender Optimierungsvorgabe mindestens genauso speicheroptimierten Code wie bei Beschränkung auf C-Syntax.

1 Like

@my_xy_projekt , @michael_x
Danke euch beide. Das war wirklich hilfreich. Dazu habe ich noch DIESEN Thread gefunden.
Für mich ist es noch sehr schwierig, solche Dinge im Detail zu beurteilen. Also, was der Compiler daraus macht und wie sich das im Speicher auswirkt.
Danke.

Du möchtest also einen privat Kurs in C++ Grundlagen und eine Einführung in den Optimizer.
Ach nöö...

Da kann man, wenn es einem Spaß macht, sich immer wieder wundern. Auch im hohen Alter.
Kann sein, es existiert nach dem Übersetzen gar keine Funktion namens loop(), sondern nur ein Sprungbefehl.
Und gerne erkennt der Compiler, dass etwas gar nicht gebraucht wird und lässt es einfach weg. Das erschwert natürlich manuelle Optimierungen :wink:

1 Like

Alle mit Arduino-IDE programmierbar:

Seeeduino XIAO 5,60 Euro Speicher: 256KB Flash, 32KB SRAM

ESP8266 3 Euro 1MB flash 96 kB RAM WiFi on board
https://www.komputer.de/zen/index.php?main_page=product_info&cPath=38_39&products_id=481&zenid=ac4h1otr4p07g0mafuh18ij6u6

ESP32 6,50 Euro flash 4MB RAM 512kB WiFi und Bluetooth on board
https://www.komputer.de/zen/index.php?main_page=product_info&cPath=38_39&products_id=481&zenid=ac4h1otr4p07g0mafuh18ij6u6

Wenn es mehr IO-pins sein müssen

Adafruit Feather M0 Basic Proto - ATSAMD21 Cortex M0 256kB flash 48 kB RAM

Adafruit Feather nRF52840 Express * 1MB flash and 256KB SRAM

Teensy 4.1 8 MB flash 1 MB RAM
https://www.pjrc.com/store/teensy41.html

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.