Forum: Mikrocontroller und Digitale Elektronik ARM7 Watchdog Feed Problem bei NXP LPC2000-Controllern


von Dietmar (Gast)


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

von antworter (Gast)


Lesenswert?

Probiere doch mal im normalen (SYS) Mode die INT-enable-Flags im 
CPSR-Register zu löschen, bevor Du den Feed machst, und sie danach 
wieder zu setzen.

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.