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