Forum: Mikrocontroller und Digitale Elektronik AVR RAM-ROM-Flash-Variablen Zusammenspiel


von 0undNichtig (Gast)


Lesenswert?

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 ;-)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Marko B. (Gast)


Lesenswert?

Variablen kann es nur im RAM geben. Wenn man sie nicht ändern könnte 
wären es keine Variablen, oder?

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>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.

von Marko B. (Gast)


Lesenswert?

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.

von 0undNichtig (Gast)


Lesenswert?

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 :-(

von AVRFan (Gast)


Lesenswert?

>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.

von 0undNichtig (Gast)


Lesenswert?

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.

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.