PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Stack-Problem mit Interrupt



Bunch
19.10.2005, 11:00
Hallo,

Ich arbeite mit AVR-Studio 4.11, einem STK500 und einem Mega32

Nun trten beim debuggen fehler auf:

nach einem Externen-Interrupt springt der Controller zunächst an die
richtige Adresse um den Interrupt-Handler aufzurufen.

Nach soweit ich im einzelschritt debuggen kann stimmt auch alles.

Wenn ich jedoch mit F5 in den "Run"-Modus schalte springt er jedoch
nachdem der InterruptHandler durchgeführt wurde auf die
Einsprungadresse =0x0000 , dieja eigentlich die Resetfunktion Handelt.

Mehrer Versuch lieferten schon unnachvollziehbare Sprünge im Programm.



Ich wollte nun mittels des Stack-Monitors im "Workspace I/O " des
AVR-Studios nachvollziehen wo die ganzen Sprungadressen hinterlegt
sind.

Es erscheint jedoch Programm-Stack "Disabled". ALLE Einträge im
Stack-Monitor sind DISABLED.

Wie kann ich diese Enablen ?

Hat das was mit dem Fehler zu tun?

Können die Adressen überhaupt mit dem Stackmonitor betrachtet werden ?



Vielen Dank

fzehner
19.10.2005, 13:25
Ist der Stack überhaupt definiert?

Bunch
19.10.2005, 13:54
Ja, mit:

ldi temp,LOW(RAMEND) ;LOW-Byte der obersten RAM-
out SPL, temp
ldi temp,HIGH(RAMEND) ;HIGH-Byte der obersten RAM-
out SPH, temp

Dies muß doch genügen oder?

Wieso ist das DataStack enabled? ( im Workspace)

SprinterSB
19.10.2005, 16:24
Wenn das Programm irgendwo landet, wo es nicht hingehört, dann überschreibst du dir mit irgendwas deine Stack-Inhalte. Der Stack wächst zu weit nach unten und liegt im normalen Datenbereich. Wenn du dann Variablen schreibst, überschreibst du die Rücksprungadresse.
Ausserdem werden beim Sprung in eine Unterroutine/ISR Daten überbügelt. Auch möglich, daß eine rekursiver IRQ das Problem auslöst, zB wenn in einer Timer-ISR wieder dieser Timer-IRQ ausgelöst wird und man in der ISR ein cli stehen hat.
Weitere Fehlerquelle kann ein falsch initialisierter/übergelaufener Pointer sein, über den du auf den Stackbereich geschrieben hast.
Unkontrollierte Sprünge können auch auftreten, wenn die Versorgungsspannung zu niedrig ist.

Bunch
25.10.2005, 09:35
Wie kann manndenn im AVR-Studio den Stack einsehen?
Man müsste doch die Adressen zu sehen bekommen?
Nur wie?

olfi13
25.10.2005, 14:09
Hi!
Im AVR-Studio siehst du nir den Stack-Pointer, beobachte einmal welchen Wert dieser beim Simulieren hat wenn der Fehler auftritt (Auch den Wert notieren wenn ein Sprung in einen Interrupt auftritt). Der Wert nach der Initialisierung (0x00DF) wird kleiner sobald du etwas auf den Stack legst.

Kontrolliere die Anzahl deiner Pop's und Push's, dort liegt meistens der Fehler. Zuviel vom Stack genommen (ein pop mehr als push's) und dein Proz. verabschiedet sich zur Adresse 0x0000

Gruß, olfi

Bunch
25.10.2005, 17:30
Ok, vielen Dank

schreiben eigentlich die Branch-Befehle auch auf den Stack, sodaß man wieder an eine Stelle nach einer Verzweigung einsteigen kann?

Grüsse

Cathrel
25.10.2005, 18:18
schreiben eigentlich die Branch-Befehle auch auf den Stack, sodaß man wieder an eine Stelle nach einer Verzweigung einsteigen kann?



Nein das tun die Branch-Befehle nicht, das tun ausschliesslich die befehle:

rcall, icall und eicall.

olfi13
25.10.2005, 18:21
Nein.
Dazu nutzt man den Befehl rcall

Gruß, olfi

Bunch
26.10.2005, 12:29
Hallo alle,

hab alle Pushs und Pops überprüft, aber die Anzahl ist identisch.

Jedoch springt er trotzdem immernoch unkontrolliert auf Reset.

Da zeimlich viel mit Timern gezählt wird ist es sehr aufwändig die den kompletten Ablauf schrittweise durchzuhüpfen. ( Millionen )

Ich kann nur über Breakpoints feststellen daß er nicht nur die Interupt-Vektoren anspringt sondern auch Reset !

Kann ich irgendwo sehen welche Zeilen vor dem Breakpoint-Stop abgearbeitet worden sind?

Besten Dank

Bunch
26.10.2005, 12:48
Hallo

bzw. was kann ich überhaupt machen um diese Nadel im Heuhaufen zu finden ?

Grüsse

Bunch
26.10.2005, 13:35
Ok, ich hab noch ne Frage:

Wenn ich fälschlicherweise rcall verwende, und daraufhin kein ret folgt, das diese Adresse wieder vom Stack holt, so bleibt diese Rücksprungadresse im Stack ewig liegen, -oder?

Und jedesmal wenn dies geschieht "wächst" der Stapel.....
... und was passiert dann ?

- Ganz abgesehen das es zu einem riesen Gewurstel kommt.

Kann durch diesen Grund der Proz auf Reset gehen?

Grüsse

olfi13
26.10.2005, 13:37
Hi!
Schwer eine allgemeine Antwort zu geben da ich Dein Programm nicht kenne.
Deaktiviere mal die Int's (in der Vektorentabelle ein reti setzen statt des Aufrufes des Handlers), minimimiere das Programm durch auskommentiern.

Gruß, olfi

Cathrel
26.10.2005, 13:43
Ok, ich hab noch ne Frage:
Wenn ich fälschlicherweise rcall verwende, und daraufhin kein ret folgt,
[...]
Kann durch diesen Grund der Proz auf Reset gehen?


Ja das ist eine mögliche Ursache für dein Problem.