Stackinhalt ausgeben in WDT-ISR

Gast #3661136
Lesenswert?
• ▲
▼
Hallo zusammen,

ich habe sporadische Hänger eines C-Programms (ein Tag bis eine Woche 
fehlerfreie Laufzeit) und wollte fragen, ob bzw. wie es möglich ist, zur 
Fehlereingrenzung in der Watchdog-ISR den Stackinhalt auszugeben (UART) 
und/oder ins EEPROM zu verschieben, um festzustellen, wo der Absturz 
erfolgt.

Prozessor ist ATMega 168A, Compiler GCC.

Vielen Dank für Eure Hilfe

Heinz
Persönliche Seite #3661227
Lesenswert?
• ▲
▼
Die (Wort)Adresse kann man auch erhalten mit

  __builtin_return_address (0)

Eine sinnvolle Stelle, um mit dem Dumpen anzufangen, kann sein

  __builtin_frame_address (0)

Damit enthält das Dump nur die Werte aus dem Frame, die gesicherten 
Register und die Return-Adresse --zumindest für die aktuelle Funktion.

Wie groß der Frame ist und wie viele Register gesichert wurden, lässt 
sich nicht so einfach feststellen.

Für die Anzahl der gesicherten Register:
1
uint8_t volatile stack_usage;
2

3
ISR (WDT_vect)
4
{
5
    asm volatile ("ldi %0, .L__stack_usage" : "=d" (stack_usage));
6
}

Dieser Wert enthält nicht PUSHes, die im Body der aktuellen Funktion 
enthalten sind wie z.B. solche um ein printf.

Man kann diese Größen zwar auch direkt im s-File mit -save-temps 
nachlesen, ist aber nervig wenn sich der Code öfter mal ändert. 
Beispiel:
1
/* prologue: Signal */
2
/* frame size = 0 */
3
/* stack size = 6 */
4
.L__stack_usage = 6
Persönliche Seite #3661299
Lesenswert?
• ▲
▼
__builtin_return_address funktioniert für avr nur mit Argument 0, d.h. 
für die aktuelle Funktion.  Tiefer in die Call-Chain kann man damit 
nicht schauen.

Für AVRs mir 3 Bytes an Return-Adresse funktioniert es ebenfalls nicht, 
denn die Return-Adresse passt dann nicht mehr in 16 Bits rein, was 
avr-gcc eine Warnung wert ist.  Dies ist allerdings erst bei Flash > 
128KiB der Fall, also nicht bei einem ATmega168 mit ledigich 16KiB 
Flash.

Analoges gilt auch für ISRs, zumindest für aktuelle avr-gccs.  Da an der 
Funktionalität schon lange nichts mehr geändert worden ist, sollte das 
Gesagte auch für etwas ältlichere Versionen noch Gültigkeit haben, 
zumindest zurück bis 4.5.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.