Forum: Mikrocontroller und Digitale Elektronik AVR+IAR Stack größe in C Programm bestimmen


von Psiyou .. (Gast)


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ß

von Tobi (Gast)


Lesenswert?

>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.

Genau! Anders gibts keine Möglichkeit.

von Psiyou .. (Gast)


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?

von gast (Gast)


Lesenswert?

Das geht auch in C. Pointer auf die Adresse an der Du mit dem Schreiben 
Beginnen willst. An die Stelle über den Pointer den Inizialisierungswert 
schreiben, Pointer erhöhen usw.

von Tobi (Gast)


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
    }
  }

von Tobi (Gast)


Lesenswert?

Sorry, meine while(1)

von Tobi (Gast)


Lesenswert?

und Buffer-- vergessen!
Bin heute verwirrt :-)

von Niels H. (monarch35)


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.

von Psiyou .. (Gast)


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ß

von Niels H. (monarch35)


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)

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.