Go Down

Topic: Wie kann ich die RAM Nutzung überwachen? (Read 513 times) previous topic - next topic

Helmuth

Schon wieder ich...

Wenn ich das Exampel Flame vom Partikesystem solo compiliere, gibt es kein Problem.
https://github.com/giladaya/arduino-particle-sys

Wenn ich das Beispiel dahingehend ändere, dass die Daten via FastSPI ausgegeben werden, ist auch noch alles schön. (compiliert und läuft)

Wenn ich das dann mit dem Crossfade kombiniere, compiliert es, aber läuft nicht mehr, jedenfalls sehe ich keine Bildausgabe.
http://arduino.cc/forum/index.php/topic,151103.0.html

Ich vermute, dass der RAM für beide Effekte zusammen nicht ausreicht.

Wie kann ich diese Mutmaßung überprüfen bzw. vorher abschätzen/berechnen, welche Funktion wieviel RAM benötigt?

edit: UNOv3 + Standard IDE

Grüße

jurs


Wie kann ich diese Mutmaßung überprüfen bzw. vorher abschätzen/berechnen, welche Funktion wieviel RAM benötigt?


Ohne Anspruch auf Vollständigkeit: Jede Funktion belegt an RAM einen int-Wert als Rücksprungadresse (2 Bytes) plus den Speicher, den die als Parameter übergebenen Variablen belegen, plus den Speicher des Rückgabewerts (falls nicht void) plus das, was die Funktion selbst an lokalen Variablen deklariert.

Aussichtsreicher als zu rechnen ist vielleicht, mal im Programm an verschiedenen Stellen abzutesten, ob und wieviel Speicher noch frei ist. Im einfachsten Fall mit so einer simplen Funktion:
Code: [Select]

int freeRam () {
  extern int __heap_start, *__brkval;
  int v;
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}

die Du dann im laufenden Programm an verschiedenen Stellen aufrufen kannst, z.B. mit
Code: [Select]

Serial.println(freeRam());


Wenn Dein Speicher dann schon innerhalb Deines Sketches zu einen erheblichen Prozentsatz belegt ist, kann es beim Aufrufen von Library-Funktionen natürlich knapp werden, so dass die Funktionen dann keinen freien Speicher mehr vorfinden, den sie eigentlich benötigen würden.

Soweit ich das sehe, stellt die Funktion allerdings den Worst-Case-Fall dar: Es wird nur der große freie Speicherblock zwischen Heap und Stack dargestellt, normalerweise sollten aber wohl auch noch weitere kleinere Speicherbröckchen vorhanden sein, die vom Speichermanager in einer verketteten Liste verwaltet werden, aber um die zusammenzuzählen benötigt man eine etwas komplexere Funktion.

Siehe auch im Playground:
http://playground.arduino.cc/Code/AvailableMemory

Helmuth


Go Up