Forum: Mikrocontroller und Digitale Elektronik PIC32MX general_exception_handler


von Siegfried S. (Firma: Privat) (schnuremaus)


Lesenswert?

Hallo,

MPLAB 8.92
PicKit3  Firmware 01.50.04
PIC32MX764F128H

„ void _general_exception_handler (unsigned cause, unsigned status) “

Gibt es über diese Funktion gute Dokumentation?

Mir lege daran, zu erkennen aus welcher Zeile diese Funktion 
aufgerufen/ausgelöst wird um den Fehler besser einkreisen zu können.

Vielen Dank im Voraus.

schöne Zeit

: Bearbeitet durch User
von Hmm (Gast)


Lesenswert?

Ich verwende das für den genannten PIC:
1
#include <proc/p32mx370f512h.h>
2
3
4
/*exception handlers*/
5
/*
6
 * Exception cause:
7
    0       0x00 Int Interrupt
8
   1-3      0x01 ? Reserved
9
   4        0x04 AdEL Address error exception (load or instruction fetch)
10
   5        0x05 AdES Address error exception (store)
11
   6        0x06 IBE Bus error exception (instruction fetch)
12
   7        0x07 DBE Bus error exception (data reference: load or store)
13
   8        0x08 Sys Syscall exception
14
   9        0x09 Bp Breakpoint exception
15
   10       0x0A RI Reserved instruction exception
16
   11       0x0B CPU Coprocessor Unusable exception
17
   12       0x0C Ov Arithmetic Overflow exception
18
   13       0x0D Tr Trap exception
19
   14-31    0x0E-0x1F ? Reserved
20
 */
21
static uint32_t excep_addr, excep_vaddr, excep_cause, exception;
22
void _simple_tlb_refill_exception_handler(void){
23
    uint32_t cause;
24
    asm volatile("mfc0 %0,$8" : "=r" (excep_vaddr)); 
25
    asm volatile("mfc0 %0,$13" : "=r" (cause)); 
26
    asm volatile("mfc0 %0,$14" : "=r" (excep_addr)); 
27
    excep_cause = (cause&0x000000FF) >> 2;
28
    exception = 1;
29
}
30
void _general_exception_handler (void){
31
    uint32_t cause;
32
    asm volatile("mfc0 %0,$8" : "=r" (excep_vaddr)); 
33
    asm volatile("mfc0 %0,$13" : "=r" (cause)); 
34
    asm volatile("mfc0 %0,$14" : "=r" (excep_addr)); 
35
    excep_cause = (cause&0x000000FF) >> 2;
36
    exception = 2;
37
}
Da sitzen beim Debuggen immer zwei Breakpoints drin.
Getriggert hat bis jetzt immer nur die general exception, und fast immer 
mit cause = 7. Kommt meist beim Verpointern.

Exceptions sind mit ein Vorteil des CPU-Kerns der PIC32.

von Hmm (Gast)


Lesenswert?

Uha, beim Device habe ich mich leider verlesen, Sorry.
Für die genauen Adressen müsstest du also das Datenblatt konsultieren, 
wobei der Core identisch sein sollte.

Ich habe das aus dem Microchip Forum, und dann angepasst.

Sonst noch könntest du den "call stack" bemühen, üblicherweise kannst du 
damit (aus dem eception handler) zur betreffenden Stelle im Code (oder 
davor) springen.

von Siegfried S. (Firma: Privat) (schnuremaus)


Lesenswert?

Hallo @Hmm (Gast)


konnte inzwischen die Stelle finden.

der UART Receive erzeugt einen "framing error", das ich bisweilen noch 
nicht abgefangen habe.

Solltet du Interesse haben, kannst mich dann direkt kontaktieren.

schöne Zeit

von Siegfried S. (Firma: Privat) (schnuremaus)


Lesenswert?

Hallo,

Habe inzwischen

„void _general_exception_handler (unsigned cause, unsigned status)“
erweitert in

„void _general_exception_handler(unsigned cause, unsigned status, 
unsigned ret_addr)“

und


    excep_ret = ret_addr;                   /* Where the call originates 
*/
    excep_code = (cause & 0x0000007C) >> 2; /* Cause of exception */
    excep_addr = _CP0_GET_EPC();            /* Exception victim */

    if ((cause & 0x80000000) != 0)
    {
        excep_addr += 4;
    }

    bad_addr = _CP0_GET_BADVADDR(); /* Bad address if it is a bad 
address exception */


Somit bekomme ich, zumindest die „Hex-Adresse“ geliefert, wo der µC 
aussteigt.

    Muß zwar danach in das Menü „Disassembler Listing“, da es eine 
Hex-Adresse ist.
      Aber anhand meiner Dokumentation, die dort sich auch befindet, 
kann man den Bereich im C-Code einkreisen.



schönen Abend

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.