Forum: Mikrocontroller und Digitale Elektronik LPC1768 / MBED Hard-Fault-Error durch I2C Wie debuggen ?


von Tueftler (Gast)


Angehängte Dateien:

Lesenswert?

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
von Roland H. (batchman)


Lesenswert?

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.

von holger (Gast)


Lesenswert?

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