www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Stack dimensionieren


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.