Zitat Zitat von Felix G
Ich will nirgends hin springen, ich brauch nur die Rücksprungadresse(n) vom Stack
Vergiss es. Du hast keine Information über die Funktion, die die momentane Funktion aufgerufen hat. Wie groß ist ihr Frame? Wieviel Argumente liegen aufm Stack? Wie ist ihr Prototyp? Varargs vielleicht? War es eine ISR oder eine normale Funktion? Gibt es einen Framepointer? ...

Zitat Zitat von Felix G
Ich weiß daß es auf anderen Architekturen nicht nur einen Stackpointer gibt, sondern noch einen zweiten, der angibt wo der Stack für die aktuelle Funktion beginnt. Damit wäre eine derartige Funktion vergleichsweise trivial zu implementieren, aber wenn ich mich nicht täusche fehlt beim AVR ein derartiger Pointer, richtig?
Jein. Ob Framepointer/Argpointer gegen den Stackpointer eliminiert werden, hängt von der Komplexität der Funktion und der Beschalterung von GCC ab. Evtl. hilft dir -fno-emit-framepointer, falls avr-gcc sich darum schert.

Eigentlich müsste man den FP auch über eine volatile auto-Variable erzwingen können.

Ein Debugger findet den nächsten Frame übrigens mithilfe der Debug-Infos, und ich glaub kaum, daß du .debug oder .stabs-Sections aufs Target packen und interpretieren willst?

Oder du müsstest GCC instrumentierten Code erzeugen lassen, der die Infos über Framesize etc. in den Frame legt. Ähnlich wie beim Profiling Zusatzinfos abgelegt werden. Dazu brauchst du die GCC-Quellen und dann in ./gcc/config/avr/avr.c Prolog- und Epilog- Emitter patchen sowie das komplette Framelayout...