【问题标题】:microchip exception handling微芯片异常处理
【发布时间】:2011-10-19 23:27:49
【问题描述】:

在微芯片 ICD3 设备上运行我的程序时,异常处理看起来很奇怪。发生异常时程序将停止响应。在检查代码时,我注意到 default-general-exception-handler.c 将创建一个无限循环。这真的很令人困惑,因为我不知道错误发生在哪里以及原因是什么。这是否意味着 Microchip 不支持异常处理?或者有没有办法阅读错误信息?

无限循环:

---  \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_handler,它可以工作!

// 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
    }
}

【问题讨论】:

标签: exception exception-handling microchip pic32


【解决方案1】:

在大多数微控制器上,除了您放置的代码之外,没有任何代码。在大多数情况下,如果发生异常并且您尚未为其定义处理程序,则处理器将不知道如何显示“抱歉,发生系统错误”对话框。对“分支到自身”指令使用两个字节就足以产生对异常的可预测响应;如果没有任何更好的行动方案的特别知识,分支到自我或强制重置可能与任何事情一样好。

PS--一些用于各种平台的编译器会省略未使用的中断或异常的向量;如果此类异常意外发生,则可能会发生奇怪而离奇的事情。一些编译器会生成强制立即复位的代码(请注意,如果启用了看门狗定时器,跳转到自身最终会导致复位)。一些编译器会立即从中断中返回(这在某些 CPU 上可能是无用的,而在其他 CPU 上可能会导致不良行为)。我最喜欢的模式是让所有未使用的中断调用(而不是分支)一个 UnexpectedInterrupt 标签,在没有任何明确定义的情况下,它将指向一个分支到自我指令。如果这样做,UnexpectedInterrupt 处理程序可以弹出堆栈并记录发生了什么类型的意外中断。不过,在我自己手动生成的中断向量表之外,我还没有见过这样的模式。

【讨论】:

    【解决方案2】:

    作为进一步调试 PIC32 异常的提示,异常代码和“原因”寄存器中的所有位(您在所有其他位之前读入 _excep_code 变量的值)是定义在:

    PIC32 Family Reference Manual,第 2.12.9 节原因寄存器 http://ww1.microchip.com/downloads/en/DeviceDoc/61113C.pdf

    【讨论】:

      猜你喜欢
      • 2023-02-01
      • 2020-10-20
      • 1970-01-01
      • 2022-11-30
      • 2018-03-16
      • 1970-01-01
      • 2019-09-11
      • 1970-01-01
      • 2022-06-15
      相关资源
      最近更新 更多