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