/******************************** Dependencies: xc.h Processor: PIC32MX795F512L Complier: XC32 v1.32 Debugger: Simulator ********************************/ #include <xc.h> #pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1, FWDTEN = OFF #pragma config POSCMOD = HS, FNOSC = PRIPLL, FPBDIV = DIV_2 static enum { EXCEP_IRQ = 0, // interrupt EXCEP_AdEL = 4, // address error exception (load or ifetch) EXCEP_AdES, // address error exception (store) EXCEP_IBE, // bus error (ifetch) EXCEP_DBE, // bus error (load/store) EXCEP_Sys, // syscall EXCEP_Bp, // breakpoint EXCEP_RI, // reserved instruction EXCEP_CpU, // coprocessor unusable EXCEP_Overflow, // arithmetic overflow EXCEP_Trap, // trap (possible divide by zero) EXCEP_IS1 = 16, // implementation specfic 1 EXCEP_CEU, // CorExtend Unuseable EXCEP_C2E // coprocessor 2 } _excep_code; static unsigned int _epc_code; static unsigned int _excep_addr; // this function overrides the normal _weak_ generic handler void _general_exception_handler(void) { asm volatile("mfc0 %0,$13" : "=r" (_excep_code)); asm volatile("mfc0 %0,$14" : "=r" (_excep_addr)); _excep_code = (_excep_code & 0x0000007C) >> 2; while (1) { // Examine _excep_code to identify the type of exception // Examine _excep_addr to find the address that caused the exception } } int main(void) { int division_by_zero; int zero_value = 0; division_by_zero = 2 / zero_value; // Divide by 0, will cause an exception while(1); }