7

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

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

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

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

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

对此

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

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

4

1 回答 1

11

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

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 来说是一种蓝屏死机。所以我还安装了我自己的硬故障处理程序。

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

此外,可通过暂停在调试模式下检测到。当然,续集是什么导致硬故障?我猜是内存擦除或无限递归。

于 2014-01-22T20:44:43.860 回答