SRAM auslesen

Gast #1716227
Lesenswert?

Hi Leute,

wie kann man im AVR Studio den SRAM auslesen? Ich debugge mit nem ICE 
MKII. Im AVR Studio gibt es ein Memory Window. Dort finde ich aber 
nichts zum "SRAM"...

Mein eigentliches Problem ist aber, dass ich gerne wissen würde, ob der 
SRAM voll ist oder nicht! Wenn ja, was passiert wenn er voll ist? 
Explosion?
Gast #1716274
Lesenswert?

Frankl schrieb:
> Im Studio <View> <Memory> und <Data> (SRAM da Start bei
>
> 0060).

Hatte ich mir schon gedacht.

Hab jetzt mal geschaut und fast jedes meiner 512 Byte is belegt! Wird 
SRAM nach benutzen wieder gelöscht? Woran erkenne ich, ob ich "zu wenig" 
SRAM zur verfügung habe??
#1716280
Lesenswert?

Johann schrieb:
> Mein eigentliches Problem ist aber, dass ich gerne wissen würde, ob der
> SRAM voll ist oder nicht! Wenn ja, was passiert wenn er voll ist?
> Explosion?

Wenn das SRAM voll ist, dann verschwindet die Lücke zwischen Heap bzw. 
globalen Variablen und Stack. Im nächsten Schritt überschreibt dann ein 
Speicherbereich den anderen und es gibt abstruse Fehler. Das kann 
passieren, obwohl .data, .bss und .noinit noch ins SRAM passen. Aber 
leider der Stack, der mit jeder aufgerufenen Funktion wächst, nicht 
mehr.

Hilfreich sind diese Infos: 
http://www.rn-wissen.de/index.php/Speicherverbrauch_bestimmen_mit_avr-gcc#Nutzung_des_SRAM_durch_avr-gcc

Servus
Michael
Gast #1717180
Lesenswert?

Hi
Zu deinem Verständnis: der SRam ist der Arbeitsspeicher deines µC's. 
Stell dir ein Blatt Papier vor. Oben schreibst du deine Variablen 
hinein, also dort sind die Speicherzellen, die du als Variablen 
definiert hast. Z.B.
Mein_Counter:    .Byte1
Diese Variablen beeinflußt dein Programm, setzt Werte sozusagen. 
Gelöscht wird da nix.
Nun kommt noch der Controller, denn er muß wissen, wo er war, wenn er 
auf einen Call trifft oder ein Interrupt ihn aus seiner routinemäßigen 
Arbeit abruft. Dazu hat er einen Stack. Das ist der Bereich auf deinem 
Blatt Papier von unten. Dort merkt er sich seine Rücksprungadressen und 
alles, was ihm per Push zum Merken notwendig erscheint. Dbei setzt er 
einfach seinen Adresszeiger auf die entsprechende Speicherstelle und 
trägt dort etwas ein. So bei einem Call die nächste routinemäßige 
Programmadresse, bei einem Push den Inhalt eines Registers. Findet er 
ein Ret (Rücksprung aus Unterprogramm, so holt er sich den Wert aus dem 
Stack, so nennt man dden Speicherbereich, und adressiert seinen 
Programm- oder Befehlszeiger mit diesem Wert. Ein Pop trägt den Wert vom 
Stack in das entsprechende Register ein. Danach wird der Stackzeiger 
entsrechend aktualisiert, also hochgesetzt. Man kann also sagen, die 
Variablen füllen den Speicher von unten und der Stack von oben abwärts. 
Hast du viele Variablen, so bleibt wenig für den Stack übrig, denn wenn 
der Controller einen Call sieht, beschreibt er gnadenlos den Stack. und 
setzt den Zeiger nach unten. Im schlimmsten Fall überschreibt der Stack 
den Variablenspeicher. Wenn du bspw. einen Interrupt hast, der sich 
innerhalb seiner Routine wieder aufruft, oder einen Call, der innerhalb 
des UP's wieder sich selbst aufruft, hast du nullkommanix den Stach im 
Variablenbereich und dein Controller läuft ins Nirwana. Übrigends, 
gelöscht wird gar nix, lediglich der Flashvor einer Neuprogrammierung 
mit einem Default-Wert geladen ( idR mit 255 dez oder FF hex.) Manche 
sagen, das Programm ist gelöscht. Ja, das Programm, aber nicht der 
Speicher...
Gruß oldmax

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren