Wie überprüfe ich eine eingebettete Anwendung auf Stapelüberlauf?


8

Ich bin auf ein Problem gestoßen, bei dem ich glaube, dass mein Stapel überläuft. Der Grund, warum ich dazu neige, so zu denken, ist folgender:

1) Code kompilieren, in das Gerät sichern: - Keine Aktivität vom Gerät (ich erwarte die Meldung "Ich lebe").
2) In dieser Situation habe ich die Stapelgröße um 10 Byte erhöht, neu kompiliert und auf das Gerät ausgegeben. und das Problem ging weg.
3) Versuchte die beiden oben genannten Schritte 10 Mal hin und her und kann das Problem zuverlässig reproduzieren und zuverlässig beheben.

Ich möchte sehen, wie der Stapel umfällt. Wie mache ich das?

Ich verwende derzeit einen M16-Mikrocontroller mit 2 KB RAM (30 Byte übrig) und einer Stapelgröße von 256 Byte. Die von mir verwendete IAR Workbench verfügt nicht über das Dienstprogramm Call Graph.

Gibt es andere Möglichkeiten, dies zu tun - überprüfen Sie, ob der Stapel umkippt und um wie viel Code?

Jede Hilfe wird wirklich geschätzt.

Vielen Dank!


Haben Sie einen Simulator für den Chip, in dem Sie den Code (schrittweise) ausführen können?
XTL

Antworten:


7

Eine übliche Methode zur Überprüfung der Speichernutzung besteht darin, den Speicher vor der Ausführung Ihres Programms mit einem konstanten Wert zu füllen. Beispielsweise könnte eine Sequenz von 0xde 0xad durch Ihren Startcode in Ihren Stapelbereich geschrieben werden. Während des Programmbetriebs wächst der Stapel und schreibt über diese Sequenzen. Wenn Sie dann die Möglichkeit haben, den Speicher zu untersuchen, können Sie die unberührten 0xde 0xad-Bytes im Speicher leicht anzeigen und so feststellen, wie viel Stapel verwendet wurde.

Es ist normalerweise schwierig, einen Überlauf zu erkennen, da Funktionsaufruf-Rücksprungadressen auf dem Stapel gespeichert sind und jede Funktionsrückgabe das Programm ins Unkraut schickt. Wenn in diesem Fall Ihr Watchdog aktiviert ist und Sie einen Haltepunkt am Rücksetzvektor festlegen können, können Sie möglicherweise weiterhin den Speicher untersuchen und nach Ihren Prefill-Bytes suchen, um festzustellen, ob dies zu einem Zurücksetzen geführt hat.


1
Wäre das nicht "Dankeschön"? ;)
ducksauz

hahaha! Richtig, sehr wahr. : P
IntelliChick

3

Erstellen Sie eine Variable, die sich oben (oder unten) in Ihrem Stapel befindet. Initialisieren Sie die Variable am Anfang von main. Sie können den Wert der Variablen in der Hauptschleife überprüfen, um festzustellen, ob der Stapel übergelaufen ist. Wenn Ihr Debugger dies zulässt, legen Sie beim Schreiben dieser Variablen einen Haltepunkt fest. Es sollte nur geschrieben werden, wenn es initialisiert wird.


0

Es gibt einige Programme, die statische Analysen durchführen können. Mit Splint können Sie einige Informationen abrufen , da bei der Verwendung Ihres Quellcodes nach Problemen gesucht wird. Ich denke, es prüft nicht auf Stapelprobleme, kann Ihnen aber einige Einblicke in das Problem geben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.