Go Down

Topic: Wie die Speicherauslastung für Variablen erkennen? (Read 1 time) previous topic - next topic

Booner

Hallo Leute,

ich habe ein kleines Problem.
In einem Atmega328 benutze ich relativ viele Variablen.
Unter anderem auch Arrays wie dieses:
uint8_t Adressen[8][120];

Jetzt ist mir aufgefallen, dass der µC "lustige" Dinge macht, wenn das Array zu groß ist.
Ich denke, dass irgendwo unzulässig Speicherbereiche überschrieben werden.
Dass die Arrays korrekt indiziert werden habe ich mehrmals kontrolliert.

Kann man irgendwie kontrollieren, ob man zuviele Variablen deklariert hat?


Grüße,

Tom

uwefed

Der ATmega328 hat 2kByte Ram
Wieviel Ram Du für Variablen verbrauchst kannst Du anhand der verwendeten Byte errechen
Ein uint8_t Adressen[8][120]; brauct 960 Byte
Es gibt auch die Möglickeit den freien Speicherplatz zu ermitteln:
http://www.arduino.cc/playground/Code/AvailableMemory

Aber, da Du sagst daß der Arduino ungewollte und unerklärbare Symptome zeigt ist Deine Annahme richtig, daß Du zuviel RAM brauchst.

Lösungen und Infos:
* verwende den Arduino MEGA
* verwende progmem() für Variablen die Konstant sind.
http://arduiniana.org/libraries/Flash/ und
http://www.arduino.cc/en/Reference/PROGMEM
http://arduino.cc/forum/index.php/topic,29822.0.html

Grüße Uwe

Booner

Hallo Uwe,

wow! Das ist mal ne super Antwort!
Vielen Dank für den Lesestoff. Nun ist mir einiges klarer geworden.

Dieses Array ändert sich während der Laufzeit nicht.
Von daher könnte ich es auch beim Init ins Eeprom schreiben.
Zur Laufzeit lese ich dann einfach die jeweils benötigten 8 Byte aus.
Da schlafe ich jetzt erstmal noch drüber.


Vielen Dank und Grüße,

Tom

Udo Klein

Das EEPROM und der Flash Speicher sind nicht das gleiche. EEPROM hast Du noch weniger als SRAM. Flash kannst Du allerdings nicht zur Laufzeit füllen. Man kann die Inhalte für den Flash Speicher aber sehr wohl zur Compilezeit berechnen und auch einfüllen. Ein Beispiel wie man sowas auf die Spitze treibt findest Du hier:

http://blog.blinkenlight.net/experiments/removing-flicker/knight-rider-no-flicker/
Check out my experiments http://blog.blinkenlight.net

Booner

Hei,

ich lese die Adressen von 80-100 DS18B20 Temperatursensoren aus (je 8 Byte),
damit ich anschließend die Temperaturen per Adresse auslesen kann und nicht nach Index,
was extrem langsam wird, wenn man soviele Sensoren am Bus hat.

Die speichere ich nun beim Init im Eeprom, was hervorragend funktioniert. (maximal halt 125 Sensoren)
Da die Adressen ja nun gespeichert bleiben, bräuchte ich die nicht nochmal auslesen.
Das würde den Start extrem beschleunigen. Man kann ja dann per dig. Eingang das Abspeichern unterbinden bzw. auslösen...

Vielen Dank für die ganzen Anregungen!

Wenn jemand näheres Interesse an dem Projekt hat,
hier hab ich ne kleine Beschreibung dazu:
http://www.youtube.com/watch?v=-4rBRaiAmNc&feature=g-upl


Grüße,

Tom

Go Up