AVR RAM-ROM-Flash-Variablen Zusammenspiel

Gast #429823
Hallo, ich habe mal eine Verständnisfrage, ich benutze einen Atmega64.
Der hat ja 64KB+4KB. Nun verstehe ich aber nicht ganz, wo diese Limits 
zu tragen kommen. 64KB klar so groß darf maximal das Assembly sein also 
die durch GCC erzeugte TEXT Sektion. Aber wie verhält sich das nun mit 
Variablen? Darf ich da nur eine bestimmte Anzahl an Variablen haben oder 
habe ich Einschränkungen bei malloc()? Mir ist irgendwie das 
Zusammenspiel von RAM(SRAM), ROM(Flash) und wo nun globale/lokale 
Variablen abgelegt werden unklar... Wäre nett, falls das einer erhellen 
könnte ;-)
Persönliche Seite #429833
Variablen können nur im RAM abgelegt werden, und das ist 4 kByte groß. 
Auch konstanten wie Stringkonstanten landen beim AVR im RAM, sofern man 
nicht explizit diese im FlashROM ablegt.

Dann aber sind zum Zugriff auf diese Konstanten spezielle 
Zugriffsfunktionen zu verwenden.

Mehr dazu hier:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmspeicher_.28Flash.29

Das ist in der Harvard-Architektur des AVR begründet, bei dem Programm- 
und Datenspeicher voneinander getrennt sind.
Aus diesem Grund kann der AVR auch keine Programme aus dem RAM 
ausführen.

malloc() arbeitet mit dem Heap, und der liegt im RAM, das mit dem Stack 
(der unter anderem für automatische Variablen benötigt wird) geteilt 
wird.
Gast #429836
>Variablen kann es nur im RAM geben. Wenn man sie nicht ändern könnte
>wären es keine Variablen, oder?

Nö.
Man kann Variablen auch (problemlos) ins EEPROM legen.
Sie können dann auch geändert werden, wenn auch nicht so schnell (und 
oft) wie Variablen im RAM.
Gast #429850
Hrm. Man könnte sie auch auf Papier schreiben. Der uC gibt den Wert als 
Blinkcode auf eine LED aus. Wenn eine Instruktion kommt die eine 
Variable einliest, dann muss man den Wert über einen Taster eingeben.

Vielleicht sollten wir "modifiable lvalue" statt "Variable" sagen.
Gast #430224
HaHa ;-)

Also gibt es eine Beschränkung bei der maximalen Anzahl der Variablen, 
Unterprogrammaufrufe,...? Mist ich wollte mit malloc() Messwerte 
speichern, all zu viel passt dann da ja nicht mehr rein :-(
Gast #430227
>Also gibt es eine Beschränkung bei der maximalen Anzahl der Variablen,
>Unterprogrammaufrufe,...?

Hast Du ernsthaft geglaubt, es gäbe keine Beschränkung??

>Mist ich wollte mit malloc() Messwerte
>speichern, all zu viel passt dann da ja nicht mehr rein :-(

Nein, aber es verbietet Dir niemand, externen Speicher zu verwenden.
Gast #430462
Ja natürlich gibt es immer eine Grenze. Aber ich habe Systemarchitektur 
nur an einem 8085 gelernt und da war halt nur ein linearer Speicher mit 
dem Programm und oben hat man seinen Stackpointer hingelegt.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.