Forum: Mikrocontroller und Digitale Elektronik Stack dimensionieren


von Michael (Gast)


Lesenswert?

Hallo,

wie dimensioniert man denn den Stack bei einem Tiny26 programmiert mit
dem IAR-Compiler?

Der Tiny26 hat 128Byte SRAM. Der Compiler teilt den Stack, wenn ich das
richtig verstand habe, auf in Sprungadressen und Arbeitsspeicher für
Variablen. Im CSTACK liegen die Variablen, im RSTACK die Sprungmarken.

Wie erfolgt nun die Gewichtung? Im Tutorial auf dieser Seite hab ich
was von empfohlenen 100 Leveln gelesen. Das ist ja mit 128 Byte nich
möglich, da ein Level ja 2 Byte verschlingt. Wie teile ich den Stack
auf? 2/3 Sprungadressen und 1/3 CSTACK oder was empfehlt ihr mir?

Gruß,
Michael

von Peter Dannegger (Gast)


Lesenswert?

"Im CSTACK liegen die Variablen, im RSTACK die Sprungmarken."


Was macht denn das für einen Sinn ???

Bei WINAVR gibt es sowas nicht, wozu auch.

Die globalen und statischen Variablen laufen von unten und der Stack
von oben. Somit ist immer maximal Stack reserviert.


Allgemein würde ich sagen, daß 16 Byte (8 Level) für den echten Stack
ausreichen.

Was den CSTACK angeht, wie gesagt, da weiß ich nicht im geringsten,
wozu der nütze ist, lokale Variablen werden doch in Registern
angelegt.


Peter

von Michael (Gast)


Lesenswert?

Ganz meiner Meinung! Ich versteh den Sinn auch noch nicht. Deshalb komm
ich ja so ins straucheln.

Auszug aus dem Compiler Reference Guide:

S. 23 "... A small number of these variables" (auto und static) "are
placed in processor registers; the rest are placed on the stack..."

S.24 "... The stack is a fixed block of memory, devided into two
parts. The first part contains allocated memory used by the functions
that called the current function, and the function that called it, etc.
The second part contains free memory that can be allocated. The
borderline between the two areas is called the top of stack and is
represented by the stack pointer,[...]. Memory is allocated on the
stack by moving the stack pointer."

Ich hab am RSTACK geschraub, bis das Programm abgestürzt ist. 2 Level
reichen im Moment aus. Bei CSTACK <0x22 hängt sich der µC bei
bestimmten Konstellationen auf.

von Hagen (Gast)


Lesenswert?

Ich verstehe das so:

0-x Bytes vom SRAM sind feste globale Variablen, der Compiler/Linker
kann also das Ende X statisch ermitteln.

127-x Bytes ist der verfügbare Stack im Gesammten. Davon
127-y Bytes sind beim Aufruf einer Funktion belegt druch den
Aufrufstack + lokalen Variablen der vorherigen Funktionen.
y-x Bytes bleiben nun übrig für die aktuelle Funktion. avon werden
wiederrum Z bytes statisch duch den Compiler für die lokalen Funktionen
alloziert. Verbleiben y-x-l Bytes die ja im Grunde frei wären. Das wäre
der CSTACK der nun zur Benutzung von speziellen Speichermanager
Funktionen zur Verfügung stehen.
Es könnte nun sein das man dem Compiler die Größe dieses CSTACKs als
minimalen Wert vorgeben kann um eben noch genügend Speicher für den
"Memory Manager" zur Verügung zu haben. Der Compiler/Linker kann nun
auf Grund dieser Information ermitteln wieviel Stack er noch für die
globalen Variablen und den Aufrufstack zur Verfügung hat. Entsprechend
diesem Wert richtet der Compiler/Linker seine Optimierung aus. Er
versucht also deinen Source so zu übersetzen das immer CSTACK Bytes für
deinen dynamsichen Speicher zur Verfügung stehen. Nun kann der Compiler
den CSTACK Bereich wie eine "globale" Variable gleich hinter dem
Bereich der globalen Variablen -> 0-X Bytes, ablegen, also festen
Speicherbereich.

Gruß Hagen

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.