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.
P.S: Da es mir nicht um meinen Code im Speziellen geht, werde ich hier auch keinen angeben.
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++.
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.
...
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.
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?
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.
@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.
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