-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: Stack-Problem mit Interrupt

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    05.10.2005
    Ort
    Aalen
    Beiträge
    35

    Stack-Problem mit Interrupt

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    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

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    01.01.2004
    Beiträge
    96
    Ist der Stack überhaupt definiert?

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    05.10.2005
    Ort
    Aalen
    Beiträge
    35
    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)

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    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.
    Disclaimer: none. Sue me.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    05.10.2005
    Ort
    Aalen
    Beiträge
    35
    Wie kann manndenn im AVR-Studio den Stack einsehen?
    Man müsste doch die Adressen zu sehen bekommen?
    Nur wie?

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    10.10.2004
    Ort
    Niedersachsen
    Beiträge
    60
    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

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    05.10.2005
    Ort
    Aalen
    Beiträge
    35
    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
    Wer nur das macht was er schon kann, bleibt immer das was er schon ist.

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    22.10.2005
    Beiträge
    16
    Zitat Zitat von Bunch
    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.

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    10.10.2004
    Ort
    Niedersachsen
    Beiträge
    60
    Nein.
    Dazu nutzt man den Befehl rcall

    Gruß, olfi

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    05.10.2005
    Ort
    Aalen
    Beiträge
    35
    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
    Wer nur das macht was er schon kann, bleibt immer das was er schon ist.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •