Forum: Mikrocontroller und Digitale Elektronik Stack filled to 100% - kann das einer erklären?


von Robert (Gast)


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?

von Stacki (Gast)


Lesenswert?

Naja, beliebig groß schon mal nicht. Maximal so groß wie dein RAM. Rufst 
du irgendwas rekursiv auf?

von Rufus Τ. F. (rufus) Benutzerseite


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).

von Robert (Gast)


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?

von Robert (Gast)


Lesenswert?

Ich habe mir den Stack jetzt mal angeguckt - der wird recht groß bei 
einer Wurzelberechnung und beim Arkussinus.

von Jörg S. (joerg-s)


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.

von Robert (Gast)


Lesenswert?

Vielen Dank für die Erklärung!

von cskulkw (Gast)


Lesenswert?

Welchem Prozessor quälst Du mit einer Wurzelberechnung? Die werden doch 
als endliche Reihe gerechnet. Das kann man ganz gut mit Rekursionen 
erreichen.

Vielleich liegt da die Ursache.

von Peter D. (peda)


Lesenswert?

cskulkw schrieb:
> Das kann man ganz gut mit Rekursionen
> erreichen.

Man kann Rekursionen recht einfach in Schleifen umformen, dann sinkt der 
RAM-Bedarf rapide.

Ich hatte sogar mal gesehen, daß der Compiler selber die Rekursion zu 
ner Schleife optimiert hat. Geht aber nur bei einfach überschaubaren 
Rekursionen.


Peter

von Dennis (Gast)


Lesenswert?

Ich quäle einen MSP430 unter IAR Embedded.

von Dennis (Gast)


Lesenswert?

Ups, wundert euch nicht über die zwei Namen, wir sitzen hier grad zu 
zweit (Robert + Dennis).

von Peter D. (peda)


Lesenswert?

Robert schrieb:
> Ich habe mir den Stack jetzt mal angeguckt - der wird recht groß bei
> einer Wurzelberechnung und beim Arkussinus.

Der IAR sollte eigentlich gut zu optimieren.

Hast Du die Optimierung ausgeschaltet?
Als Default sollte man "-Os" nehmen. Schlechtere Optimierungen nur dann, 
wenn man weis, was man tut.


Peter

von Dennis + Robert (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Als Default sollte man "-Os" nehmen.

Und wofür steht das?

von Dennis + Robert (Gast)


Lesenswert?

Optimizations steht per default auf "low" im Moment.

von Dennis + Robert (Gast)


Lesenswert?

Oh, wenn ich es mal testweise auf "high" stelle, dann sinds direkt 4k 
weniger Code.

von ... (Gast)


Lesenswert?

Dennis + Robert schrieb:
> Peter Dannegger schrieb:
>> Als Default sollte man "-Os" nehmen.
>
> Und wofür steht das?

"-Os" ist eine Option für den Optimizer vom gcc. Das s steht für size. 
Der Compiler soll also möglichst kleinen Code erzeugen.

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.