ARM7 Watchdog Feed Problem bei NXP LPC2000-Controllern

Gast #495756
Lesenswert?
• ▲
▼
Habe diese leidige Frage schon mal gestellt, auch in anderen Foren:

Meine Anwendung läuft ohne Watchdog wie erwartet. Sie ist wie folgt, für 
NXP LPC2129 oder LPC2138, konfiguriert:

Etwa 10 IRQ Interrupts, z.B. Timer jede Millisekunde, I2C-Bus, CAN-Rx, 
CAN-Tx, und andere.
Genau 1 FIQ Interrupt, jedoch mit hoher Frequenz bis 100kHz.
WDTC Watchdog Timer Konstante 5 Minuten, damit ein Überlauf für die 
Fehlersuche ausgeschlossen ist.

In meiner Anwendung habe ich festgestellt, daß Watchdog Feeds nicht 
ordnungsgemäß ausgeführt werden. Führe ich den Watchdog Feed ganz normal 
im main()-Programm durch, so bekomme ich laufend Watchdog Resets, obwohl 
der Watchdog Timer noch lange nicht abgelaufen ist. Der Grund sind die 
Interrupts innerhalb der Feed-Sequenz, habe ich festgestellt. Wenn ich 
die Interrupts über VIC-Register für die Feed-Sequenz disable, 
funktioniert die Anwendung wie erwartet. Allerdings erhalte ich 
Default-Interrupts, Spurious Interrupts. Die kann ich nicht auswerten, 
da an der Stelle VICFIQStatus und VICIRQStatus Null sind.

Was geschieht hier?

Das User Manual schreibt, daß ein Delay größer als 2*pclk zwischen den 
beiden Feed-Befehlen einen Watchdog Reset auslöst. Dem ist mitnichten 
so, da ich dort eine for-Schleife für ein beabsichtigtes Delay größer 
als 2*pclk eingebaut habe.

Als Verbesserung habe ich die Watchdog Feed Sequenz in einen 
SWI-Interrupt gepackt. Da stören immerhin die IRQ nicht mehr, da ein IRQ 
keinen SWI unterbrechen kann, aber der FIQ. Disable ich alle Interrupts 
während der Feed-Sequenz über den VIC-Controller, verhält sich die 
Anwendung gutmütig.

In der SWI-Funktion disable ich die FIQ-Line im ARM-Core, da hier im 
Supervisor Mode möglich.

Jetzt bekomme ich eine Menge Surprise-Interrupts, FIQ, während FIQ 
gesperrt sind, aber das stört dank Surprise-Interrupt-Handler nicht 
wirklich. Das ist ARM-typisch. Der entsprechende Interrupt findet dann 
statt, wenn die FIQ-Line wieder enabled wird.

Das Problem sind die Watchdog Resets, wenn während Watchdog Feed ein 
FIQ-Interrupt stattfindet, obwohl der Watchdog-Timer nicht abgelaufen 
ist. Und den habe ich auf 5 Minuten gesetzt, damit der nicht gleich 
anschlägt.

Was geschieht hier genau?

Hier sind doch viele andere ARM-User, die den Watchdog benutzen, oder???

Kurzum: Warum geschieht ein Watchdog-Reset, wenn während, vor, nach der 
Feed-Sequenz ein Interrupt IRQ oder FIQ auftritt? Obwohl ich zwischen 
die 2 Feed-Befehle zum Test auch mal ein Delay eingebaut habe, und die 
Feed Sequenz damit auch einwandfrei funktioniert? Mit dem Debugger komme 
ich nicht weiter. Im User Manual gibt es keinerlei Hinweise dazu.

Werden hier eventuell Registerinhalte beschädigt, obwohl jeder Vorgang 
seine benötigten Register selbst sichert, und ich das peinlich genau 
nachvollzogen habe?

Gibt es Hilfe aus dem Forum, oder werde ich mich an den NXP-Support 
wenden müssen?

Gruß

Dietmar

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.