Exception 微芯片异常处理
在微芯片ICD3设备上运行我的程序时,异常处理看起来很奇怪。发生异常时,程序将停止响应。在检查代码时,我注意到默认的general exception handler.c将创建一个无限循环。这确实令人困惑,因为我不知道错误发生在哪里,原因是什么。这是否意味着微芯片不支持异常处理?或者有没有办法读取错误消息 无限循环:Exception 微芯片异常处理,exception,exception-handling,microchip,pic32,Exception,Exception Handling,Microchip,Pic32,在微芯片ICD3设备上运行我的程序时,异常处理看起来很奇怪。发生异常时,程序将停止响应。在检查代码时,我注意到默认的general exception handler.c将创建一个无限循环。这确实令人困惑,因为我不知道错误发生在哪里,原因是什么。这是否意味着微芯片不支持异常处理?或者有没有办法读取错误消息 无限循环: --- \home\c11067\work\C32\builds\pic32-microchip-release-1.12-20101221-rc2-20101221\pic32
--- \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
通过定义一个_general_exception_处理程序,它可以工作
// 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 & 0x0000007C) >> 2;
while (1) {
// Examine _excep_code to identify the type of exception
// Examine _excep_addr to find the address that caused the exception
}
}
在大多数微控制器上,除了你放在那里的代码外,没有任何代码。在大多数情况下,如果发生异常而您尚未为其定义处理程序,处理器将不知道如何显示“抱歉,发生了系统错误”对话框。“分支到自身”指令使用两个字节就足以产生对异常的可预测响应;在没有任何更好的行动方案的特别知识的情况下,自我或强制重置的分支可能是一个很好的响应
PS——各种平台的一些编译器将省略未使用中断或异常的向量;如果这些异常意外发生,奇怪的事情就会发生。一些编译器将生成强制立即重置的代码(请注意,如果启用了看门狗计时器,跳转到self将最终导致重置)。有些编译器会从中断中立即返回(在某些CPU上可能没有用,而在其他CPU上可能会导致不良行为)。我最喜欢的模式是让所有未使用的中断调用(而不是分支)意外中断标签,在没有任何明确定义的情况下,该标签将指向分支到自我指令。如果这样做,一个意外中断处理程序可以弹出堆栈并记录发生的意外中断类型。不过,在我自己手动生成的中断向量表之外,我还没有看到过这样的模式。作为进一步PIC32异常调试的准备,异常代码和“原因”寄存器中的所有位(在读取_excep_代码变量并将所有其他位清除之前读取的值)定义在: ,第2.12.9节原因寄存器 看起来我需要自己定义异常处理函数。