-         
Ergebnis 1 bis 6 von 6

Thema: Cortex M3, Exceptions bestätigen ?

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    05.11.2007
    Ort
    Berlin
    Beiträge
    610

    Cortex M3, Exceptions bestätigen ?

    Anzeige

    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


    Code:
    /*----------------------------------------------------------------------------*/
    /* 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

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Da muss ich mich erst reinlesen. Denke, du musst dem Arm sagen, was er nun mit dem Task tun soll.

    Vielleicht stehen da weisheiten drin, ich werd' auch mal gucken.

    http://www.keil.com/appnotes/files/apnt209.pdf


    Oder es find' sich ohnehin wer, der das auswendig weiss
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    05.11.2007
    Ort
    Berlin
    Beiträge
    610
    Hallo PicNick,
    der Weg scheint schon mal richtig.
    Ich werd mir das Morgen mal genauer durchlesen.
    Kann meiner Meinung nur ne Kleinigkeit sein.
    Ich hab ja schon viele der Interrupts am Laufen.
    Uart, ADC, SPI,Timer usw. Da kriegen wir wohl den ollen Hardware Fault auch noch hin....
    Danke Dir für die Info.
    Siro

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    05.11.2007
    Ort
    Berlin
    Beiträge
    610
    Guten Morgen, da bin ich wieder....
    Habe mir das Datenblatt von Keil mal angesehen und auch nochmal das Datenblatt des Controllers.

    Wenn ich das richtig verstanden habe, laufen die Exceptions NICHT über den NVIC.
    Im Datenblatt von Keil steht aber NVIC_SetPriority(BusFault_IRQn, 0x80) merkwürdig ??
    Dann laufen die Exceptions doch über den NVIC ???

    Ich habe beim Debuggen gesehen, daß nach meinem Exeption das IMPRECISERR im SCB->CFSR Register gesetzt wird, also habe ich es per Software gelöscht.
    Das brachte aber auch noch keinen Erfolg.

    Nun lese ich gerade im Datenblatt UM10360 folgendes:
    Ein Bus Fault Exeption wird ausgelöst, wenn ein Schreibzugriff auf den Flashspeicher erfolgt, dafür sorgt der Flash Accelerator.

    Nanu, meine Software landet im "HardFault" und nicht im BusFault. Bei folgendem Zugriff:

    int *p=0;
    *p=4; /* Exception ausloesen, unerlaubter Schreibzugriff auf den Flash */

    Irgendwie bin ich jetzt etwas verwirrt und weis immer noch nicht wie ich die Interrupts wieder freigeben kann, nachdem der Exception kam.

    Das Datenblatt von Keil führt lediglich eine while(1) Schleife ein, wenn der Exception auftrat. Ich wollte aber nicht stehen bleiben
    in meiner Software, sondern eine Fehlermeldung ausgeben. Die Software läuft ja auch weiter, aber meine Timerinterrupts stehen....

    Weiter unten im Datenblatt von Keil steht dann, was die Software nach einem Execption tun kann.
    System Reset
    Recovery (genau das will ich, leider fehlt hier ein Beispiel)
    Task termination

    Ich bin also noch nicht viel weiter gekommen.
    Wo sind die Spezis, die mir helfen können ?

    Siro
    Geändert von Siro (28.10.2011 um 10:57 Uhr)

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    21.12.2011
    Beiträge
    9
    Hallo,
    beschäftige mich erst seit Neuestem mit dem M3 und Lowlevel-Programmierung. Hast du dein Problem gelöst? Wenn nicht, schau mal folgende Info (ARM Page)
    HFSR [30] FORCED
    Indicates a forced hard fault, generated by escalation of a fault with configurable priority that cannot be handles, either because of priority or because it is disabled:
    0 = no forced HardFault
    1 = forced HardFault.

    When this bit is set to 1, the HardFault handler must read the other fault status registers to find the cause of the fault.
    Könnte eine DataAccessViolation im MFSR ausgelöst worden sein?

    Gruß René

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    05.11.2007
    Ort
    Berlin
    Beiträge
    610
    Hallo Rene,
    ersteinmal Danke, daß Du dieses Thema nochmal aufgegriffen hast.
    Leider konnte ich bis heute mein Problem nicht lösen.
    Ich habe mehr durch Zufall jedoch festgestellt, daß meine Software bei einem Stackoverflow auch in meinem HardFault Handler landet.

    Dann habe ich noch so einiges probiert:

    Code:
    /* das bit BUSFAULTPEND im SCB->SHCSR register löschen */
      p = (U32*)0xE000ED24;
      value = *p;               /* register lesen */
      value &=(~(U32)(1<<14));       /* bit loeschen */
      *p = value;               /* registerwert zurück schreiben */
      
      /* das bit IMPRECISERR im SCB->CFSR register löschen */
      p = (U32*)0xE000ED28;
      value = *p;               /* register lesen */
      value &=(~(U32)(1<<14));       /* bit loeschen */
      *p = value;               /* registerwert zurück schreiben */
      
      ENABLE;
      
      __asm ("CPSIE F");
    Alles ohne Erfolg. Meine Interrupts nach dem HardFault sind nach wie vor komplett gesperrt.

    Eine Nachfrage direkt bei NXP blieb leider ohne Rückmeldung.
    Ich werde mich auch nochmal diesem Thema widmen. Sobald ich etwas in Erfahrung bringe werde ich es posten.

    Siro

Ähnliche Themen

  1. ARM Cortex-M3 Starterkit für 69 Dollar
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 30.05.2011, 16:00
  2. Software Reset Cortex M3
    Von Siro im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 8
    Letzter Beitrag: 30.01.2011, 22:06
  3. ARM Cortex M3 KettenRoboter
    Von Pajonilaus im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 2
    Letzter Beitrag: 30.06.2010, 18:59
  4. Cortex M3 Programcounter Adressen
    Von Siro im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 2
    Letzter Beitrag: 11.06.2010, 15:39
  5. Cortex M3 Ramfunction
    Von Siro im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 2
    Letzter Beitrag: 27.04.2010, 08:34

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •