Compiler behauptet 0 Bytes RAM

Gast #2113716
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)
1
unsigned short i;
2
unsigned char messwerte[2000];
3
for(i=0;i<2000;i++)
4
{
5
  loop_until_bit_is_set(ADCSRA, ADIF);
6
  messwerte[i]=ADCH;
7
}
8
for(i=0;i<2000;i++)
9
{
10
  while (!(UCSRA & (1<<UDRE)));
11
  UDR = messwerte[i];
12
}

Mache ich daraus eine globale Variable:
1
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:
1
for(i=0;i<2000;i++)
2
{
3
  loop_until_bit_is_set(ADCSRA, ADIF);
4
  messwerte[i]=ADCH;
5
}
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
Gast #2113719
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.
#2113812
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

Eine eigene Frage? Dieser Thread ist über 15 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.