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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.