Forum: Compiler & IDEs Stapelüberlaufkontrolle


von Florian Müller (Gast)


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?

von Florian Müller (Gast)


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

von nobody0 (Gast)


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.

von Florian Müller (Gast)


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

von nobody0 (Gast)


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.

von Florian Müller (Gast)


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

von nobody0 (Gast)


Lesenswert?

Ja, damit geht es.

von Florian Müller (Gast)


Lesenswert?

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

Gruß,
  Florian

von nobody0 (Gast)


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.

von Florian Müller (Gast)


Lesenswert?

mache ich, dauert allerdings ein paar Tage, meine Uniprüfungen haben
Vorrang

von Florian Müller (Gast)


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

von Florian Müller (Gast)


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

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.