AVR RAM-ROM-Flash-Variablen Zusammenspiel

Gast #429823
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 ;-)
Persönliche Seite #429833
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.
Gast #429836
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.
Gast #429850
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.
Gast #430224
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 :-(
Gast #430227
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.
Gast #430462
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren