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


von Dan (Gast)


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

von ,mr.chip (Gast)


Lesenswert?

Hallo

Stackpointer auslesen :-)

Gruss

Michael

von Dennis (Gast)


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.

von ,mr.chip (Gast)


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

von Peter D. (peda)


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

von Matthias (Gast)


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

von Karl H. (kbuchegg)


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.

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.