www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Fragen zum Stack


Autor: Redegle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt alles. Aber Daten werden im Ram gespeichert. Register sind nur 
temporaere speicher.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: Redegle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok Danke

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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Ben (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.