Hallo,
Zitat Zitat von jok3r Beitrag anzeigen
Was anderes, ich schreibe gerade an einem Datenlogger der Laufzeitdaten aus einem Steuergerät kopiert (ca 106 Byte ,Serial ) , einen RTC und SD Karte verwaltet und dabei noch ein kleines Menü am TFT ausgibt ...
Jetzt gibt der Compiler schon jedes mal die Meldung "Low memory available, stability problems may occur." aus weil ich bisher ca 87% des dynamischen Speichers verbraten hab.Kann ich wenigstens Teile davon auslagen ?
Bisher hatte ich noch nie das Problem das mein UNO Speicher Probleme bekommt,daher kenne ich bisher keine Abhilfe.
Dein RAM wird in 3 Teile aufgeteilt:
1. Platz für statische Variablen.
2. Stack. Auf dem Stack werden alle automatischen Variablen und die Parameter bei einem Funktionsaufruf abgelegt. Hinzu kommen noch die Rücksprung-Adressen bei Funktionsaufrufen und die Interrupts benötigen auch noch Platz auf dem Stack.
3. Heap. In C wird der Heap mit alloc() und Free() verwaltet in C++ meistens mit new und free.

Besonders der Stackbereich kann Probleme machen, wenn dieser überläuft, dann überschreibt er meistens einen der anderen beiden Bereiche.

Deine Bibliotheken benötigen auch entsprechenden Platz im RAM.

Das dies alles ins RAM passt, ist eine der Aufgaben der Programmierers.

Wie das aufgeteilt ist, verrät dir teilweise das Listing des Linkers.
Wie viel dynamischen Platz der Stack belegt, kannst du mit dem Debugger herausfinden.

Zitat Zitat von jok3r Beitrag anzeigen
Der Dynamische Speicher ist doch der SRAM oder ?
Es gibt zwei Arten von dynamischem RAM:
1. Hardware: Hier bezeichnet es den Aufbau der Speicherzellen. Bei dynamischem RAM werden die Bits im Prinzip in Kondensatoren gespeichert. Da sich die Kondensatoren mit der Zeit entladen, muss die Information dauernd gelesen und neu gespeichert werden.
2. Programmtechnik: Wie oben beschrieben, z.B. der Heap. Das Programm kann zur Laufzeit einen Speicherblock anfordern und diesen dann benutzen. Braucht es diesen nicht mehr, gibt es ihn an den Heap zurück. Fordert das Programm erneut einen Block an, bekommt es einfach den nächsten passenden freien Block zugeteilt. Der Vorteil liegt einerseits darin, dass man beim Schreiben des Programms, noch nicht wissen muss, wie gross der Datenblock sein muss, das muss man erst bei der Anfrage an den Heap wissen. Andererseits kann man so das RAM besser ausnutzen, indem das RAM nur solange belegt wird, wie dieser Speicherblock auch benötigt wird.


MfG Peter(TOO)