Forum: Compiler & IDEs ATMEGA wer löst Watchdog-Reset aus


von Martin Raffelsieper (Gast)


Lesenswert?

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

von Jörg Wunsch (Gast)


Lesenswert?

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.

von Martin Raffelsieper (Gast)


Lesenswert?

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?

von Martin Raffelsieper (Gast)


Lesenswert?

wo kann ich denn nachlesen, welche Register für Stack, etc verwendet
sind?

von Jörg Wunsch (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.