AVR+IAR Stack größe in C Programm bestimmen

Gast #849298
Lesenswert?

Hallo,

habe da mal eine Frage zur Bestimmung der Stackgröße in C.
Arbeite mit dem IAR und den AVRs (meist mega). Der  IAR verwendet ja 
einen CStack (für die Daten) und einen RStack (für die 
Rücksprungadresse).
Hatte jetzt schon mal den Fall das ein Programm lief, und nach ein paar 
Erweiterungen auf mal immer wieder abstürzte. Durch herumprobieren habe 
ich dann herausgefunden das die Abstürze ausbleiben wenn ich den CStack 
vergrößere. Habe den dann einfach auf 0xff gesetzt und alles läuft seit 
dem.

Nun würde ich gerne wissen wie ich den maximal benötigte Stackgröße 
bestimmen kann?
Beim RStack ist das ja die Anzahl der verschachtelt aufgerufenen 
Funktionen, also noch recht übersichtlich (im schlimmsten Fall zählen 
;).
Aber wie sieht das beim CStack aus?
Einzige Idee die ich da hatte (und hier im Forum auch schon in anderem 
Zusammenhang gelesen habe) ist ein Muster ins Ram zu schreiben, das 
Programm durchlaufen zu lassen und am Ende schauen wie weit dieses 
Muster zerstört wurde.
Geht das auch einfacher?
Bzw ist das ja auch nicht zu 100% aussagekräftig, man müsste ja alle 
möglichen Zustände durchspiele um die Größe sicher zu bestimmen.

Gruß
Gast #849336
Lesenswert?

Schade,
aber hatte ich fast schon befürchtet nachdem ich zu dem Thema nix 
gefunden habe. Hatte halt noch gehofft das ich nach den falschen 
Begriffen suche...

Naja, die Hoffnung stirbt zu letzt... ;)

Wie schreibe ich den speicher den am besten voll? Denke mal da muss ASM 
her, oder geht das auch in C?
Gast #849343
Lesenswert?

Das geht auch in C.

z.B. (Schreibt von Adresse 0x0000 bis 0x1000):

#define START_ADDRESS 0x0000
char *Buffer=0x1000; //Oberste Adresse

int main(void)
  {
  while(Buffer)
    {
    *Buffer=0x00; //Schreibt 0en rein....
    if (Buffer==START_ADDRESS) break; //Abbruch bei Anfangsadresse
    }
  }
#849346
Lesenswert?

Psiyou ... wrote:

> Wie schreibe ich den speicher den am besten voll? Denke mal da muss ASM
> her, oder geht das auch in C?

C ist ursprünglich dazu entwickelt worden, ASM zu ersetzen. Alles was du 
in ASM machen kannst, geht natürlich auch in C. Es bleibt dir 
überlassen, ob du dafür eine Routine aus der LibAVR oder selber per 
Speicherpointer deinen Speicher initialisierst.
Gast #849400
Lesenswert?

Hi,

danke schon mal soweit :)
Und ich kann einfach so in den Bereich des Stacks schreiben?
(ok, sollte man nicht in einer Unterfunktion machen).

@Tobi
so in der Art hätte ich jetzt auch gedacht, aber überschreibe ich da 
dann nicht auch irgendwann den Pointer Buffer? hab bei C ja keine Ahnung 
wo der genau im Ram liegt...

Gruß
#849403
Lesenswert?

Der Stack ist vom Prinzip her eigentlich nichts weiter, als sein sich 
automatisch bewegender Zeiger auf den Speicher, den man auch manuell 
"herumschubsen" kann.

Ob du mit einem Speicherzugriff in den Daten-Speicher oder auf den Stack 
schreibst, entscheidet nicht der Speicherzugriff selbst, sondern die 
Position des StackZeigers (StackPointer)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren