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?
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
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.
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
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.
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
Dann werde ich das mal so implementieren, um zukünftige Stapelüberläufe sicher erkennen zu können. Gruß, Florian
Postest Du den Code dann auch? Das würde mich interessieren, denn ich hatte sowas ähnliches mal aus der mpgcc-mailingliste, aber nie getestet.
mache ich, dauert allerdings ein paar Tage, meine Uniprüfungen haben Vorrang
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.