PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Controller-RAM sparen



cdk
07.07.2019, 13:04
Hallo Leute,

ich komme mit meinem derzeitigen Projekt (Ereignislogger) so langsam in einen Bereich wo ich mir Sorgen um den Platz im Controller-RAM mache. Der Compiler sprach von 1200 belegten Bytes der insgesamt 2048 beim Uno. Bin durch kürzen und durch Verwendung identisch gleicher Texte für Konsole- und LCD-Ausgabe (der Compiler optimiert da anscheinend fleißig) dann wieder immerhin auf 800 belegte Byte runtergekommen. Aber das Programm ist ja noch lange nicht vollendet.

Daher meine Fragen:

- Wieviel RAM sollte man eigentlich für die Laufzeit so Pi*Daumen noch frei haben?

- Gibt's eine Möglichkeit den freien RAM zur Laufzeit zu bestimmen und zumindest eine kritische Knappheit zu erkennen?

- Was verbraucht denn außer lokalen Variablen noch RAM? Ich glaube bei Interrupts und bei Funktionsaufrufen werden zumindest mal die Prozessorregister auf den Stapel gelegt - was sich dann bei mehrfach verschachtelten Aufrufen wohl auch zusammenläppert. Oder?

- Kann man feste Texte nicht auch irgendwie im Programmcode "verstecken"? Im Flash habe ich noch reichlich Platz. Egal ob ich fest in den Programmcode getippte Texte verwende oder die als const char* übergebe - beides kostet RAM, und zwar gleich viel...

Und ja - wenn ich hier im Arduino-Board nach "RAM" suche bekomme ich keinen einzigen Treffer. Ist das normalerweise "kein Thema"....? :confused:

Gruß, Dieter

HaWe
07.07.2019, 13:42
hallo,
du kannst Variablen Im Flash speichern durch das keyword PROGMEM:
const PROGMEM dataType variableName[] = {};
https://www.arduino.cc/reference/en/language/variables/utilities/progmem/

mit F() kannst du ebenfalls einen cstring im Flash ablegen:
#define Ausgabe F("Dies ist ein langer Satz.")
http://shelvin.de/string-im-programmspeicher-mit-progmem-ablegen-und-ausgeben/

wenn es aber zu knapp wird mit RAM, hilft IMO langfristig nur ein besserer Prozessor.

cdk
07.07.2019, 14:24
Aha! Danke! Das hilft mir entscheidend weiter. In erster Linie habe ich wohl nur ein String-Problem - dann weiß ich ja jetzt wie ich mir helfen kann wenn's knapp wird.

Bleibt aber noch die Frage WANN wird's denn knapp? Wieviel RAM sollte man sich für die Laufzeit frei halten?

HaWe
07.07.2019, 15:52
Aha! Danke! Das hilft mir entscheidend weiter. In erster Linie habe ich wohl nur ein String-Problem - dann weiß ich ja jetzt wie ich mir helfen kann wenn's knapp wird.

Bleibt aber noch die Frage WANN wird's denn knapp? Wieviel RAM sollte man sich für die Laufzeit frei halten?

da kenne ich keine Regel...

Rabenauge
07.07.2019, 16:58
Es gibt auch keine Regel- theoretisch kann der Ram nahezu voll sein- vorausgesetzt, es ergibt sich im Programmablauf nichts, was zusätzlichen verbraucht.
Das kann durchaus vorkommen, gelegentlich hatte ich, bei einer Auslastung von über 80%, schon manches merkwürdige Verhalten- was sich mit sparsamerem Umgang beheben liess.

Das hier: https://playground.arduino.cc/Code/AvailableMemory/ sollte helfen, den tatsächlichen Verbrauch zur Laufzeit mal zu ermitteln....wird aber im Programm mehrmals aufgerufen werden müssen, weil sich der aktuelle Verbrauch ja ändern könnte.

cdk
07.07.2019, 17:48
Super. Damit kann ich mir im Zweifelsfall dann auch weiterhelfen... obwohl ich teilweise nur Bahnhof verstehe wenn ich so manche Codezeile dort anschaue... :mrgreen:

Habe inzwischen auch mal ein bißchen mit dem F() Makro rumgespielt, das scheint aber etwas verbuggt zu sein. Früher oder später (d.h. umso öfter ich das verwende) tritt beim Compiler ein Segmentation Fault in der LCD-Library auf. Gut, kann natürlich auch an dieser Library liegen.
Habe mich also auf ein paar "fette" Serial.print() Ausgaben beschränkt, bringt ja auch schon was - und damit läuft's.