Guten Morgen werte Bastlerkollegen! Ich benötige euren Rat: Bin seit längerem daran, eine kleine IMU auf Basis des MBED (LPC1768) und des 9DOF Stick von Sparkfun aufzubauen. (btw. das Sensorboard hat den nicht sehr guten ADXL345 drauf, würde ich daher heutzutage nicht mehr kaufen!) Als Compiler kommt der arm-none-eabi-gcc von CodeSourcery zum Einsatz im Zusammenspiel mit Makefile. Weiter benutze ich der Einfachheit halber FreeRTOS um alles zu deichseln. Die Sensoren werden per I2C ausgelesen, dazu benutze ich das I2C-Modul im Interrupt modus. Im Normalfall funktioniert alles bestens, so wie gewünscht, nur sporadisch, (alle 10-15Minuten) bleibt der Controller mit einem Hard-Fault-Error hängen. Was ich dazu bisher rausgefunden habe ist, dass ein Hard-Fault-Error auftritt, sobald versucht wird eine ungültige Adresse im Flash-Speicher zu lesen/schreiben, die nicht existent ist oder aber nicht richtig aligned ist? Wie ihr merkt, bin ich da selber noch nicht ganz durchgestiegen, was es mit dem Hard-Fault auf sich hat, wäre daher für eine Erklärung dankbar! Bin nun wie folgt vorgegangen um das Problem einzugrenzen: Meine Vermutung geht dahin, dass das I2C-Modul das Problem verursacht, da evtl. ein Sensor nicht richtig reagiert oder ähnliches. -Habe also kurzerhand die Datenleitung während des Betriebs auf Masse gelegt, um einen Fehler zu simulieren. -So lange wie die Leitung auf Masse liegt, tritt die programmierte Fehlerroutine in Aktion, die IMU kann halt keine Daten mehr einlesen, der Controller hängt sich jedoch nicht auf. -Sobald jedoch der I2C-Bus wieder frei ist, geht der Controller in den Hard-Fault-Error und bleibt stehen, bis der Watchdog einen Reset auslöst. In der I2C-Routine habe ich alle notwedigen States mit einer Switch-Anweisung berücksichtigt und für alle anderen mit "default" eine Standardrotuine geschaffen. Komme nun jedoch nicht mehr weiter, keine der I2C-Routinen wird beim Freigeben des Bus (aufheben der Fehlerbedingung) angesprungen. Vielleicht kann mir jemand von euch einen Tip geben, wie ich weiter debuggen kann oder jemand kann mir seine I2C-Interruptroutine zur Verfügung stellen? Freue mich über jede Hilfe und Anregung. Habe den I2C-Code angehängt; Der interessante Teil beginnt ab Zeile 410, wo sich die I2C-Hardware-Routinen befinden. Mit bestem Dank, Tueftler
:
Verschoben durch User
Tueftler schrieb: > Was ich dazu bisher rausgefunden habe ist, dass ein Hard-Fault-Error > auftritt, sobald versucht wird eine ungültige Adresse im Flash-Speicher > zu lesen/schreiben, die nicht existent ist oder aber nicht richtig > aligned ist? "oder" ? Wurde die "hard fault escalation" abgeschaltet? Unabhängig davon kannst Du im "hard fault" herausfinden, an welcher Stelle des Programms dieser auftrat.
Beliebter Fehler bei FreeRTOS: Falsche Interruptprioritäten!
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.