ARM7: Interruptproblem

Gast #672165
Lesenswert?
• ▲
▼
Hallo!

Wer kann mir bei folgendem Problem mit einem NXP LPC2148 helfen:

In meinem Programm tritt in sehr seltenen Fällen ein "Spurious
interrupt" auf. Dafür habe ich eine Interruptroutine geschrieben,
die die Interruptanforderung löschen soll. Der Interrupt wird durch
Timer 1 ausgelöst.

Jetzt tritt das Problem auf, dass das Löschen der Interruptanforderung
nicht gelingt. Sofort nach dem Verlassen der Int.routine wird sie
neu aufgerufen. Damit hängt sich mein Programm auf. Hier die
Interruptroutine:

__irq __arm void default_ISR()
{
  //Interruptflags der Interruptquellen löschen
  EXTINT|=1<<2;                  //Interruptflag EINT2 löschen
  T0IR=0xFF;                    //Interruptflag T0 löschen
  T1IR=0xFF;                    //Interruptflag T1 löschen
  I2C0CONCLR=0x00000008;        //I2C-Interrupt-Flag löschen

  VICVectAddr = 0;          //VICVectAddr löschen
}

Laut Register VICIRQSTATUS liegt nur der Timer1-Interrupt an.
Er sollte mit T1IR=0xFF eigenlich gelöscht werden.
Wo liegt der Fehler?
#672528
Lesenswert?
• ▲
▼
> Wie kann man sicher feststellen, welche Interruptquelle
> den Spurious interrupt ausgelöst hat?

Kann es per Definition eigentlich nicht geben. Der schlägt ja genau dann 
zu, wenn der VIC schon keine Ahnung mehr hat, was den Interrupt 
auslöste.

Wenn es überhaupt ein "spurious interrupt" war. Nicht alles was im 
default Vector aufläuft ist zwangsläufig ein solcher.

Allerdings ist mir nicht klar, wieso du im Handler alle Interrupts 
löschst. Ein gesetztes Interrupt-Flag führt m.E. zum regulären Handler, 
nur wenn es zum Zeitpunkt der Vektorermittlung schon nicht mehr gesetzt 
war, dann gibt's den berüchtigten "spurious interrupt".

Vorausgesetzt natürlich, der VIC ist korrekt programmiert und alle 
eingeschalteten Interrupts sind vektoriert (?).

Wenn der Handler dauernd aufgerufen wird und das Timer-Interruptflag 
gesetzt ist, dann scheint dem Timer kein Interrupt-Vektor zugewiesen zu 
sein. Für einem "spurious interrupt" gilt nämlich per Definition
  (VICIRQStatus & VicIntEnable) == 0
jedenfalls zu dem Zeitpunkt zu dem VICVectAddr gelesen wurde.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.