【问题标题】:Atmel Studio Dummy_HandlerAtmel Studio Dummy_Handler
【发布时间】:2014-01-22 20:44:43
【问题描述】:

有时我会收到意外中断,我的代码会挂在 Atmel Studio Framework (ASF) 的 exceptions.c 中的 Dummy_Handler() 内。我正在使用 Arduino Due 的 ATSAM3X8E 微控制器。

void Dummy_Handler(void)
{
    while(1) {
    }
}

任何想法如何确定哪个中断

当然,我可以用唯一的虚拟处理程序替换这个单一的处理程序,每个异常处理一个。 (大约有五十个。)例如更改同一 exceptions.c 文件中的每一行:

void HardFault_Handler  ( void ) __attribute__ ((weak, alias("Dummy_Handler")));

到这里

void HardFault_Handler  ( void ) __attribute__ ((weak, alias("Dummy_HardFault_Handler")));

等等...或者尝试推断我的代码是如何产生哪个中断的。但是谁有这样的时间呢?

【问题讨论】:

    标签: exception-handling arduino interrupt-handling atmel atsam3x


    【解决方案1】:

    这个 MCU 有一个中断程序状态寄存器,可以提供一些关于来源的线索。 ASF 已将其包装在 core_cmFunc.h 中的函数 __get_IPSR() 中:

    uint32_t phantomISR = 9999;
    
    void Dummy_Handler(void)
    {
        while(1) {
            phantomISR = __get_IPSR();
        }
    }
    

    然后可以在运行时监控这个全局变量。 (在我的例子中,我暂停了这个死循环的汇编代码,并在 R3 寄存器中看到了值 3。)Atmel MCU 文档解释了它的值:

    ISR_NUMBER 这是当前异常的编号: 0 = 线程模式 1 = 保留 2 = NMI 3 = 硬故障 4 = 内存管理故障 5 = 总线故障 6 = 使用错误 7-10 = 保留 11 = SVCall 12 = 为调试保留 13 = 保留 14 = PendSV 15 = 系统标记 16 = IRQ0 45 = IRQ29

    这两次都发生在我身上,这是硬故障,是 Ardunio Due 的一种蓝屏死机。所以我也安装了一个自己的Hard Fault handler

    ISR(HardFault_Handler)
    {
        while (1) {
        }
    }
    

    此外,可通过暂停在调试模式下检测到。续集当然是what causes a Hard Fault?我猜是内存擦除或无限递归。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多