mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Compiler behauptet 0 Bytes RAM


Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Warum behauptet der Compiler, dass bei folgendem Code 0 Bytes RAM 
verbraucht werden? (UART und ADC wurden vorher mit ein paar Zeilen Code 
initialisiert)
unsigned short i;
unsigned char messwerte[2000];
for(i=0;i<2000;i++)
{
  loop_until_bit_is_set(ADCSRA, ADIF);
  messwerte[i]=ADCH;
}
for(i=0;i<2000;i++)
{
  while (!(UCSRA & (1<<UDRE)));
  UDR = messwerte[i];
}

Mache ich daraus eine globale Variable:
unsigned char messwerte[2000];
sagt der Compiler mir korrekterweise, dass mein RAM des ATmega32 zu 
97,7% gefüllt ist. Interessanterweise braucht der Durchlauf dieser 
Schleife:
for(i=0;i<2000;i++)
{
  loop_until_bit_is_set(ADCSRA, ADIF);
  messwerte[i]=ADCH;
}
7 Takte wenn die Variable lokal ist und 8 Takte wenn sie global ist...
Das ergibt für mich keinen Sinn, aber verwirrender finde ich halt, dass 
bei Verwendung der lokalen Variablen der dafür verbrauchte Speicher 
nicht mehr angezeigt wird. Weiß jemand woran das liegt?

Gruß Tobias

Autor: nilp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja. Das referenzieren einer globalen Variablem ist mit 16bit extern 
pointer, der scheint ein byte mehr zu brauchen. Eine globale Variable 
ist im RAM, eine lokale Variable ist aufm Stack.

Autor: aaaa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schau dir den assemblercode an, das erklärt dann alles!

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tobias schrieb:

> sagt der Compiler mir korrekterweise, dass mein RAM des ATmega32 zu
> 97,7% gefüllt ist. Interessanterweise braucht der Durchlauf dieser

Globale und statische Daten werden vom Compiler angelegt und daher 
angezeigt. Lokale Daten werden erst zur Laufzeit vom Code auf dem Stack 
angelegt und werden daher vom Compiler nicht angezeigt. Platz brauchen 
sie trotzdem.

2000 Bytes Daten bei 2048 Bytes RAM sind eine Garantie für Probleme, 
weil zu wenig Platz für den übrigen Stack vorhanden ist.

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.