Hallo zusammen Preisrätsel: Eine SW auf einem ATmega..(z.b. 64) läuft so vor sich hin. Plötzlich kommt ein Watchdog-Reset, erkennbar an dem entsprechenden Bit im MCUCSR-Register. We kann man herauskriegen, in welcher Endlosschleife o.ä. sich der Prozessor befunden hat, als der WD zugeschlagen hat??? Gruß Martin
Da es ein Reset ist, nur Du selbst. Du könntest bestenfalls sehr früh in der Initialisierung (.init1) noch die alten Stack- und Framepointer retten und dann anhand des Stackinhaltes gucken, ob Du Dir einen Reim drauf machen kannst, aber der PC-Stand ist komplett weg nach einem Reset.
d.h. wenn die CPU bei Adresse 0 loslegt, sind die Stackpointer noch auf dem zustand, die sie beim Reset hatten? wenn ja, dann bräuchte ich mich ja nur vor dem C-Startup-Code einzuklinken?
wo kann ich denn nachlesen, welche Register für Stack, etc verwendet sind?
Hmm, nö, laut Doku beginnt der Stackpointer nach einem Reset bei 0, das geht also wohl doch nicht. Der Framepointer ist das Y-Register(paar). Sieh Dir am besten mal im generierten Assemblercode den Aufbau der Stackframes an. Letztlich wird im aktuellen Stackframe auch der letzte Stackpointer mit hinterlegt, darüber könntest Du das ermitteln (und auch den zuletzt auf dem Stack hinterlegten Rücksprung-PC). Setzt natürlich alles voraus, daß es nicht in main() passiert, da main() keinen kompletten Stackframe anlegt (weil davon ja nie wirlich zurückgekehrt werden muß).
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.