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
"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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.