title: microchip exception handling
body: <p>While running my program on a microchip ICD3 device, the exception handling looks weird. The program will stop response while exception occurs. While checking the code, I noticed that the default-general-exception-handler.c will create an infinite loop. It is really confusing because I cannot know where the error occurs and what is the reason. Does that mean Microchip doesn't support exception handling? Or is there a way to read the error message?</p>
  
  <p>infinite loop:</p>
  
  <pre><code>---  \home\c11067\work\C32\builds\pic32-microchip-release-1.12-20101221-rc2-20101221\pic32-libs\libc\stubs\default-general-exception-handler.c
  9D00DD28  1000FFFF   beq         zero,zero,0x9d00dd28
  9D00DD2C  00000000   nop        
  </code></pre>
  
  <p>By defining a _general_exception_handler, it works!</p>
  
  <pre><code>// declared static in case exception condition would prevent
  // auto variable being created
  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 &amp; 0x0000007C) &gt;&gt; 2;
  
      while (1) {
          // Examine _excep_code to identify the type of exception
          // Examine _excep_addr to find the address that caused the exception
      }
  }
  </code></pre>