Forum: Compiler & IDEs Program counter <-> .map-File Adressen (ATmega324P)


von Dirac (Gast)


Lesenswert?

Hallo,

ich versuche (wie sicher schon viele Leute vor mir) einen "endless loop" 
zu untersuchen indem ich mir per Watchdog Interrupt den Programmzähler 
vom Stack zu holen und dann ausgeben zu lassen. Um das Ganze zu testen 
rufe ich die ISR am Anfang der main() auf und bekomme dann 0x3d3 zurück.
1
ISR( WDT_vect )
2
{
3
  register unsigned char reg1 asm("r16");
4
  register unsigned char reg2 asm("r17");
5
6
  stack_read(); //get PC
7
  printf("#PC: %x%x\n",reg1,reg2);
8
}


Mein Problem ist, daß ich diesen Wert nicht mit den Adressen im 
.map-File zusammenbringe. Dort liegt main ab 0x1d84. Mir fehlt wohl noch 
irgendein offset o.Ä oder habe ich einen generellen Denkfehler?

Vielen Dank für die Antworten,
Dirac

von Dirac (Gast)


Lesenswert?

Hier noch stack_read():
1
#define stack_read()   \
2
__asm__ __volatile__ (  \
3
    "POP r16" "\n\t"    \
4
    "POP r17" "\n\t"    \
5
    "PUSH r17" "\n\t"    \
6
    "PUSH r16" "\n\t"   \
7
    )

von Stefan E. (sternst)


Lesenswert?

Dirac schrieb:
> habe ich einen generellen Denkfehler?

Schau dir doch mal in der lss-Datei den kompletten Code der ISR an. Dann 
bekommst du vielleicht einen Eindruck davon, was du dir da gerade vom 
Stack holst. Die Rücksprungadresse ist es jedenfalls ganz sicher nicht.

von Dirac (Gast)


Lesenswert?

Ok, ich schau's mir mal an. Prinzipiell sollte der PC ohne offset den 
Adressen in der .map entsprechen, richtig?

von Stefan E. (sternst)


Lesenswert?

Dirac schrieb:
> Prinzipiell sollte der PC ohne offset den
> Adressen in der .map entsprechen, richtig?

Einen Offset gibt es nicht, aber einen Faktor 2 (Word<->Byte Adressen).

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.