Compiler behauptet 0 Bytes RAM

Gast #2113716
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)
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
#2113812
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

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