Forum: Mikrocontroller und Digitale Elektronik Fragen zum Stack


von Redegle (Gast)


Lesenswert?

Hallo,

ich lese mir gerade den Bereich hier im Forum über den Stack durch.
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Stack
Habe auch bereits etwas Forensuche betrieben.

Würde nun gerne von euch wissen ob ich die Informationen richtig 
Interpretiert habe.

Es scheint so, als ob der Stack die Positon im Programm speichert, damit 
der Controlle weiß, wo er beim Befehel "ret" hinspringen muss.

Des weiteren habe ich gelesen, dass ich den Stack initialisieren muss, 
damit der Controller den RAM von hinten beschreibt, damit keine Werte 
ungewollt überschrieben werden.

Dort habe ich gerade schon die erste Frage, nämlich welche Daten werden 
im RAM gespeichert. Dachte das Programm wird im Flash-Rom gespeichert 
und die Daten zum Rechnen werden im Register r01-r32 
zwischengespeichert.

von Purzel H. (hacky)


Lesenswert?

Stimmt alles. Aber Daten werden im Ram gespeichert. Register sind nur 
temporaere speicher.

von Gast (Gast)


Lesenswert?

>der Stack die Positon im Programm speichert, damit
>der Controlle weiß, wo er beim Befehel "ret" hinspringen muss.

Besser kann man's nicht ausdrücken :-)

>Dachte das Programm wird im Flash-Rom gespeichert

Exakt.

>und die Daten zum Rechnen werden im Register r01-r32 zwischengespeichert.

In die Register müssen die Daten, damit der µC damit Rechenoperationen 
durchführen kann. Nur die 32 Register sind mit der ALU, der arithmetical 
logical unit verbunden. Da man aber meistens viel mehr Daten zu 
speichern hat als die 32 Bytes, die in die Register passen, gibt es das 
SRAM (typische Größe 1...256 kByte).

(Früher hatten Prozessoren übrigens statt 32 gewöhnlich nur ein 
einziges Register, das dann Akku genannt wurde. Das war echt 
umständlich, weil man jeden Kicki aus dem RAM laden und wieder 
zurückschreiben musste.)

von Redegle (Gast)


Lesenswert?

Ok Danke

Könnt ihr mir noch erklären, wiso
LOW(RAMEND) = 0xFF und
HIGH(RAMEND)= 0x21
bei nem Atmega2560 ist.

von Gast (Gast)


Lesenswert?

Hm... hast Du mal ins Datenblatt geschaut? Laut diesem gibt es beim 
ATmega2560 32 Register, 64 I/O-Register, 416 externe I/O-Register und 
ein 8 KByte = 8192 Bytes großes SRAM. Die Zählung der SRAM-Adressen 
beginnt mit Null beim Register r0 und endet bei der höchsten SRAM-Zelle. 
32 + 64 + 416 + 8192 = 8704. Die letzte SRAM-Zelle hat damit die RAMEND 
genannte Adresse 8703 = 0x21FF. Im Datenblatt auf den Seiten 20/21 
findest Du sogar noch ne hübsche Grafik dazu. Und noch viel mehr 
wissenswerte Informationen :-)

von Ben (Gast)


Lesenswert?

was vielleicht noch zu erwähnen ist, der stack kann bei programmfehlern 
sehr wohl den speicher überschreiben (stack overflow). etwa wenn eine 
funktion rekursiv sich selbst aufruft und die tiefe dabei größer wird 
als es der platz zwischen RAMEND und der höchsten im RAM abgelegten 
variable erlaubt. der controller muß dabei nicht zwangsläufig crashen, 
wenn die endbedingung der rekursiven funktion erreicht wird bevor der 
stackpointer in die I/O register hineinläuft kehrt sie problemlos zum 
hauptprogramm zurück, der inhalt der im RAM abgelegten variablen ist 
aber mehr oder weniger zerstört.

von (prx) A. K. (prx)


Lesenswert?

Gast schrieb:

> (Früher hatten Prozessoren übrigens statt 32 gewöhnlich nur ein
> einziges Register, das dann Akku genannt wurde.

Das ist bei den 8-Bit Controllern auch weiterhin so. Z8 und AVR sind 
eher die Ausnahme als die Regel.


@Redegle: Es gibt ein paar sehr kleine Exemplare unter den AVRs, die 
kein separates RAM besitzen, sondern nur mit den Registern arbeiten. Der 
Stack liegt bei diesen folglich nicht im RAM, sondern ist ein eigener 
spezieller Speicher für mehrere CALL/RET Ebenen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.