www.mikrocontroller.net

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


Autor: Psiyou ... (psiyou)
Datum:

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

Autor: Tobi (Gast)
Datum:

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

Autor: Psiyou ... (psiyou)
Datum:

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

Autor: gast (Gast)
Datum:

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

Autor: Tobi (Gast)
Datum:

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

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, meine while(1)

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und Buffer-- vergessen!
Bin heute verwirrt :-)

Autor: Niels Hüsken (monarch35)
Datum:

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

Autor: Psiyou ... (psiyou)
Datum:

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

Autor: Niels Hüsken (monarch35)
Datum:

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

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.