www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Stack-Größe testen


Autor: Dan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut'n Abend!

Ich habe ein kleines Problem.... wie kann ich am sinnvollsten überprüfen 
wie viel meines Stacks verbraucht wird? Hatte gedacht, dass ganze RAM 
mit FF zu überschreiben (zu Beginn des main-Programms in der Init-Phase) 
und nach dem ich alle Funktionen des Gerätes getestet habe mal 
nachzuschauen was von meinen zuvor ins RAM geschrieben Werten noch 
erhalten ist.
Ist aber nicht so wirklich praktikabel...wie testet ihr sowas.... die 
default -Einstellung des Compilers ist mir mit 80Bytes zu groß. Benutze 
eine MSP430..der hat leider nur 256Byte RAM


Gruß

Dan

Autor: ,mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Stackpointer auslesen :-)

Gruss

Michael

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau, Stackpointer auslesen. Bei jedem "push" auf den Stack prüfen, ob 
er größer als der größte bisher aufgetretene Wert ist. Falls ja, 
speichern und weitermachen, wenn nein, eh uninteressant. Am Ende haste 
die größe verwendete Stack-Adresse.

Autor: ,mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Wobei ich die Variante mit dem Speicher-mit-FF-füllen eigentlich besser 
finde. Weil man da nicht bei jedem push den Stackpointer prüfen muss, 
sondern am Schluss nochmals drübergehen kann. Wesentlich praktikabler.

Gruss

Michael

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dan wrote:

> Ist aber nicht so wirklich praktikabel...wie testet ihr sowas.... die
> default -Einstellung des Compilers ist mir mit 80Bytes zu groß. Benutze
> eine MSP430..der hat leider nur 256Byte RAM

Das hängt ganz vom Compiler ab.

Die Compiler, die ich kenne (WINAVR, Keil C51), stellen den Stack 
überhaupt nicht ein, sondern nehmen einfach alles, was hinter den Daten 
frei ist, als Stack.

Will man nun die tatsächlich Auslastung des Stacks feststellen, füllt 
man alles ab Datenende bis zum Stackpointer mit einem Muster, was 
möglichst selten vorkommt, z.B. 0x77.

Zum Testen prüft man dann wieder ab Datenende bis zum ersten Byte != 
0x77.


Peter

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum stellt man den Stack nicht auf MAximalwert, also RAMEND (AVR-GCC 
macht das glaub so)

Und in Subroutinen/ISRs liest man einfach mal den SP aus (nachdem lokal 
Var. angelegt sind), und bildet die Differenz zum RAMEND...?
Damit kann man dann was weiß ich machen...

Das müsste doch gehen??

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar geht das.
Ist nur ziemlich viel Arbeit jede Funktion dahingehend
zu instrumentieren.

Den Speicher mit einem Muster füllen und hinterher nachschauen
was von dem Muster übrig geblieben ist, ist wesentlich simpler.

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.