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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren