Es läuft 
-fno-omit-frame-pointer war genau das was gefehlt hat
Falls noch Jemand Interesse an einer derartigen Funktion hat:
callstack.h
Code:
#ifndef CALLSTACK_H_INCLUDED
#define CALLSTACK_H_INCLUDED
#warning "please use compiler option -fno-omit-frame-pointer"
#include <stdint.h>
#define CALLSTACK_MAX_DEPTH 16
extern uint16_t callstack[CALLSTACK_MAX_DEPTH];
void stackwalk(const uint16_t ram_end);
#endif // CALLSTACK_H_INCLUDED
callstack.c
Code:
#include "callstack.h"
#include <stdlib.h>
uint16_t callstack[CALLSTACK_MAX_DEPTH];
void stackwalk(const uint16_t ram_end)
{
uint8_t n;
uint16_t FP_stackadr;
uint16_t RET_stackadr, RET_stackval;
FP_stackadr = ((uint16_t)&ram_end) + sizeof(ram_end);
for(n=0;(n < CALLSTACK_MAX_DEPTH) && (FP_stackadr <= ram_end);n++)
{
RET_stackadr = FP_stackadr + sizeof(uint16_t);
RET_stackval = ((uint16_t)(*(uint8_t*)RET_stackadr) << 8) | *((uint8_t*)RET_stackadr + 1);
FP_stackadr = *(uint16_t*)FP_stackadr + 1;
callstack[n] = RET_stackval;
}
callstack[n] = 0x0000;
}
Um an die Rücksprungadressen zu gelangen muss man nur einmal stackwalk(RAMEND) ausführen, und schon stehen sie im array callstack.
Daß man RAMEND explizit angeben muss erscheint auf den ersten Blick vielleicht etwas umständlich, aber so ist es z.B. auch möglich die Funktion in eine lib zu packen, ohne an einen bestimmten AVR gebunden zu sein.
Bei den Testfällen die ich mit der Funktion bisher durchgespielt habe stimmten die Ergebnisse, dennoch kann ich natürlich nicht dafür garantieren daß der Stack immer 100% fehlerfrei durchlaufen wird.
Lesezeichen