Forum: Mikrocontroller und Digitale Elektronik Compiler behauptet 0 Bytes RAM


von Tobias (Gast)


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

von nilp (Gast)


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.

von aaaa (Gast)


Lesenswert?

schau dir den assemblercode an, das erklärt dann alles!

von (prx) A. K. (prx)


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.

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.