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.
Stimmt alles. Aber Daten werden im Ram gespeichert. Register sind nur temporaere speicher.
>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.)
Ok Danke Könnt ihr mir noch erklären, wiso LOW(RAMEND) = 0xFF und HIGH(RAMEND)= 0x21 bei nem Atmega2560 ist.
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 :-)
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.