Siro
27.10.2011, 16:26
Hallo,
ich habe eine Frage zu den Exceptions des LPC1768. Ich möchte eventuelle Softwarefehler abfangen.
Zum Beispiel einen unerlaubten Speicherzugriff, wie es z.B durch einen falsch initialisierten Pointer passieren könnte.
Der Exeption wird auch erkannt und die Software landet in meinem Handler. Das klappt alles einwandfrei.
Leider wird der Exception anscheinend nicht richtig bestätigt und alle Niederpriorisierten Interrupts treten dann nicht mehr auf.
Irgendwie fehlt anscheinend noch eine "Bestätigung" für die CPU. Sicherlich noch irgend ein Bit setzten/löschen oder was auch immer.
Oder anders gefragt: Wo ist das Interrupt Flag, welches anscheinend noch ansteht ?
Dazu mal eben mein Codeschnipsel
/*----------------------------------------------------------------------------*/
/* Abfangen eines unerlaubten Speicherzugriff */
/* wie er zum Beispiel so entsteht: */
/* int *p=0; ein Zeiger auf 0, also in den Flash Code Bereich */
/* *p=4; hier den Fehler auslösen, unerlaubtes schreiben */
void HardFault_Handler(void)
{ int* p = (int*)0xE000ED2C; /* HFSR - Register LPC1768 */
/* lediglich zum testen ob ich das richtige Bit erwischt habe */
/* und ob das FORCED bit im HFSR gesetzt wurde */
volatile int value = *p;
/* nach der nächsten Zeile müste der Wert von value wieder 0 sein */
value &=(~(1<<30));
/* das gleich tätige ich nun im CPU register */
/* aber !! Achtung!! the bit is sticky (klebrig ????) eine 1 löscht das bit */
*p |=(1 << 30); /* Bit im CPU Register löschen */
/* mal nachgucken ob es geklappt hat */
value = *p;
/* nochmal nachgucken ob es geklappt hat, wegen eventuellen Write Buffer */
value = *p;
/* alles okay, wie ich sehen konnte */
/* aber ich bekomme keine weiteren Interrupts mehr, meine Timer usw. scheinen zu stehen */
/* das liegt natürlich daran, daß sie eine geringere Priorität haben. */
/* Es fehlt also noch irgendwo ein BIT zu löschen um den Execption zu bestätigen */
/* Ich hab den ganzen Tag gesucht, aber bisher ohne Erfolg */
/* Ich habe leider auch im "Definitive Guide of the ARM-Cortex...." BISHER */
/* nichts für mein Problem gefunden. */
/* Wie muss ich meinen Exception beenden, daß er als abgearbeitet erkannt wird */
/* nun meine Fehlerbehandlung aufrufen */
do_error(ERR_HARD_FAULT);
}
/*----------------------------------------------------------------------------*/
Für Eure Hilfe wäre ich sehr dankbar.
Bis dahin suche, lese, probiere ich schonmal weiter.
Siro
ich habe eine Frage zu den Exceptions des LPC1768. Ich möchte eventuelle Softwarefehler abfangen.
Zum Beispiel einen unerlaubten Speicherzugriff, wie es z.B durch einen falsch initialisierten Pointer passieren könnte.
Der Exeption wird auch erkannt und die Software landet in meinem Handler. Das klappt alles einwandfrei.
Leider wird der Exception anscheinend nicht richtig bestätigt und alle Niederpriorisierten Interrupts treten dann nicht mehr auf.
Irgendwie fehlt anscheinend noch eine "Bestätigung" für die CPU. Sicherlich noch irgend ein Bit setzten/löschen oder was auch immer.
Oder anders gefragt: Wo ist das Interrupt Flag, welches anscheinend noch ansteht ?
Dazu mal eben mein Codeschnipsel
/*----------------------------------------------------------------------------*/
/* Abfangen eines unerlaubten Speicherzugriff */
/* wie er zum Beispiel so entsteht: */
/* int *p=0; ein Zeiger auf 0, also in den Flash Code Bereich */
/* *p=4; hier den Fehler auslösen, unerlaubtes schreiben */
void HardFault_Handler(void)
{ int* p = (int*)0xE000ED2C; /* HFSR - Register LPC1768 */
/* lediglich zum testen ob ich das richtige Bit erwischt habe */
/* und ob das FORCED bit im HFSR gesetzt wurde */
volatile int value = *p;
/* nach der nächsten Zeile müste der Wert von value wieder 0 sein */
value &=(~(1<<30));
/* das gleich tätige ich nun im CPU register */
/* aber !! Achtung!! the bit is sticky (klebrig ????) eine 1 löscht das bit */
*p |=(1 << 30); /* Bit im CPU Register löschen */
/* mal nachgucken ob es geklappt hat */
value = *p;
/* nochmal nachgucken ob es geklappt hat, wegen eventuellen Write Buffer */
value = *p;
/* alles okay, wie ich sehen konnte */
/* aber ich bekomme keine weiteren Interrupts mehr, meine Timer usw. scheinen zu stehen */
/* das liegt natürlich daran, daß sie eine geringere Priorität haben. */
/* Es fehlt also noch irgendwo ein BIT zu löschen um den Execption zu bestätigen */
/* Ich hab den ganzen Tag gesucht, aber bisher ohne Erfolg */
/* Ich habe leider auch im "Definitive Guide of the ARM-Cortex...." BISHER */
/* nichts für mein Problem gefunden. */
/* Wie muss ich meinen Exception beenden, daß er als abgearbeitet erkannt wird */
/* nun meine Fehlerbehandlung aufrufen */
do_error(ERR_HARD_FAULT);
}
/*----------------------------------------------------------------------------*/
Für Eure Hilfe wäre ich sehr dankbar.
Bis dahin suche, lese, probiere ich schonmal weiter.
Siro