Stack filled to 100% - kann das einer erklären?

Gast #2338984
Lesenswert?

Hallo liebe Leute!

Ich bekomme im IAR folgende Meldung:

Fri Sep 09 11:41:47 2011: The stack 'Stack' is filled to 100% (256 bytes 
used out of 256). The warning threshold is set to 90.%


Den Stack kann ich ja beliebig groß machen. Dabei steht noch der Eintrag 
"Heap".

Kann mir einer vielleicht mal kurz erläutern, was die Warnung genau 
bedeutet, bzw. eher welchen Einfluss sie auf mein Programm hat? Was ist 
denn alles auf dem Stack / Heap?
Persönliche Seite #2338996
Lesenswert?

Neben den für Funktionsaufrufe erforderlichen Daten (Rücksprungadresse 
und übergebene Variablen) landen auch automatische Variablen auf dem 
Stack, also lokal in einer Funktion deklarierte Variablen.
1
int bla(int x, int y)
2
{
3
  int fusel[100];
4

5
  ...
6
}

Beim Aufruf dieser Funktion wird neben der Rücksprungadresse und den 
beiden Funktionsparametern auch das Array 'fusel' auf dem Stack 
angelegt.

Der Heap ist ein anderer Speicherbereich, der nur für dynamische 
Speicherverwaltung mit Funktionen à la malloc genutzt wird.


(Das ist eine grob vereinfachte Darstellung, die aber für die 
Betrachtung des Problemes ausreichen sollte).
Gast #2339001
Lesenswert?

OK, danke schonmal!

Stacki schrieb:
> aja, beliebig groß schon mal nicht. Maximal so groß wie dein RAM

Ja gut, klar.

Stacki schrieb:
> Rufst
> du irgendwas rekursiv auf?

Nein. Ich habe nur ein paar Berechnungen mit mehreren double-Werten.

Rufus Τ. Firefly schrieb:
> Beim Aufruf dieser Funktion wird neben der Rücksprungadresse und den
> beiden Funktionsparametern auch das Array 'fusel' auf dem Stack
> angelegt.

Und wo landen dann andere Variablen, die ich z.B. global deklariere? 
Wieso werden die anders behandelt, als eine Variable, die in einer 
Funktion erzeugt wird?
#2339031
Lesenswert?

Robert schrieb:
> Und wo landen dann andere Variablen, die ich z.B. global deklariere?
Die laden direkt im RAM. Ausserhalb vom Stack.
> Wieso werden die anders behandelt, als eine Variable, die in einer
> Funktion erzeugt wird?
Variablen in einer Funktion müssen nicht ständig im RAM stehen, sondern 
nur kurz (Solange die Funktion läuft). Da es ein riesen Aufwand wäre bei 
jedem Funktionsaufruf zu schauen wo Platz für eine Variable im RAM ist, 
werden die Variablen halt auf den Stack gelegt.

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