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?
Naja, beliebig groß schon mal nicht. Maximal so groß wie dein RAM. Rufst du irgendwas rekursiv auf?
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).
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?
Ich habe mir den Stack jetzt mal angeguckt - der wird recht groß bei einer Wurzelberechnung und beim Arkussinus.
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.
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.
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
Ups, wundert euch nicht über die zwei Namen, wir sitzen hier grad zu zweit (Robert + Dennis).
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
Optimizations steht per default auf "low" im Moment.
Oh, wenn ich es mal testweise auf "high" stelle, dann sinds direkt 4k weniger Code.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.