mikrocontroller.net

Forum: Compiler & IDEs Stapelüberlaufkontrolle


Autor: Florian Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Fangemeinde,

ich programmiere zur Zeit einen MSP430F149 Mikrocontroller. Allerdings
meldet sich in unregelmäßigen Abständen der Watchdog-Interrupt
(manchmal auch erst nach Stunden). Ich habe schon diverse
Untersuchungen angestellt und vermute, daß der Stapelspeicher
überläuft.
  Aus diesem Grunde wollte ich mir zu Testzwecken eine
Stapelüberlaufkontrolle schreiben. Wie ich gelesen habe, läßt sich die
Stapelgröße bei dem MSPGCC-Compiler nicht ändern. Das ließe für mich
den Schluß zu, das der Stapel an max. RAM-Adresse beginnt. Des weiteren
vermute ich, daß der Heap-Speicher an der niedrigsten RAM-Adresse
beginnt, müßte aus logischer Sicht eigentlich so sein. Auf den
Heap-Speicher will ich dann eine Signatur schreiben. Sollte irgendwann
der Watchdog-Interrupt auslösen, soll in der Watchdog-Routine überprüft
werden, ob die Signatur verändert wurde.
  Eine weitere Möglichkeit zur Überpüfung eines Stapelüberlaufs wäre,
die max. verwendete Heap-Adresse herauszubekommen und zu überprüfen, ob
der Stackpointer niedriger als diese Adresse ist. Allerdings könnte es
schwierig sein, die max. verwendete Heap-Adresse herauszubekommen.

Würde mein Vorhaben so funktionieren, oder mache ich irgendwo einen
Denkfehler?

Autor: Florian Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe das mal mit der Signatur auf dem Heap implementiert, jetzt weiß
ich genau, daß der Stapel während des Betriebs den Heap überschreibt.
Hat jemand von euch noch Verbesserungsvorschläge für die
Kontrollfunktion? Da sich die Signatur ja immer oben auf dem Heap
befinden muß, was bei einem weiteren Aufruf von m/c/realloc nach
Anlegen der Signatur höchstwahrscheinlich nicht mehr der Fall ist. Die
andere Variante, die mir einfällt wäre da nur die mit der max.
Heap-Adresse (s.o.).

Gruß,
  Florian

Autor: nobody0 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Möglichkeit ist den Bereich zwischen heap u. stack mit einem Muster
wie 0xe5 zu füllen und abzufragen:


init_ram:
 mov #__bss_end, r15
 mov #__stack, r13
 mov.b #0xe5, 0(r15)
 inc r15
 cmp r13, r15
 jnc $-10


...
if (*(unsigned int *) __bss_end != 0xe5e5)    // Data at the end of BSS
corrupt!
...

Ich hatte sowas mal angefangen und auch nach IAR portiert, aber das hat
mit IAR nie richtig funktioniert.

Autor: Florian Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nobody0,

das wäre natürlich auch eine Möglichkeit, aber ich vermute mal, daß ich
dabei zuviel Prozessorleistung verliere, den kompletten Speicher
daraufhin zu überprüfen, ob noch ein Teil der Signatur vorhanden ist.
Da müßte ich mal Laufzeittests machen.
Was mir noch eingefallen ist, ich könnte mir die Funktionen zur
Allokierung von dynamischen Speicher mittels "#define" umdefinieren,
so daß beim Aufruf solcher Funktionen gleich die höchste verwendete
Heap-Adresse protokolliert wird und ich nur dort meine Signatur
überprüfen muß. Was hälst Du denn von dieser Methode?

Gruß,
  Florian

Autor: nobody0 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das wird wohl nicht funktionieren, außer es wird immer gleich viel
alloziert.
Normalerweise wird auf einem MC (ohne MMU) nicht alloziert und einfach
das RAM direkt über dem Heap-Ende (bss_end) überprüft, ob das Bitmuster
noch da ist. Das erfordert nur einmal von dieser Adresse lesen u.
vergleichen.

Autor: Florian Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso sollte das nur funktionieren, wenn immer gleich viel Speicher
alloziere? Ich kann doch nach der Umdefinierung genau feststellen,
welches die höchste verwendete Speicherstelle des Heaps ist. Darüber
lege ich bei jeder Allozierung meine Signatur und überprüfe diese
regelmäßig.

Gruß,
  Florian

Autor: nobody0 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, damit geht es.

Autor: Florian Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann werde ich das mal so implementieren, um zukünftige Stapelüberläufe
sicher erkennen zu können.

Gruß,
  Florian

Autor: nobody0 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Postest Du den Code dann auch?
Das würde mich interessieren, denn ich hatte sowas ähnliches mal aus
der mpgcc-mailingliste, aber nie getestet.

Autor: Florian Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mache ich, dauert allerdings ein paar Tage, meine Uniprüfungen haben
Vorrang

Autor: Florian Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Weiterarbeit an der Verbesserung der Stapelüberlaufkontrolle muß
leider erstmal für unbestimmte Zeit auf Eis gelegt werden, da andere
Sachen auf der Arbeit im Moment Vorrang haben.

Gruß,
  Florian

Autor: Florian Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt ist leider doch alles anders gekommen. Ich arbeite nur noch dieses
Jahr mit diesen Mikrocontrollern, so daß mir keine Zeit mehr bleibt, die
hier diskutierte Version der Stapelüberlaufkontrolle zu testen.

Gruß,
  Florian

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.