Atmel Studio Dummy_Handler

Bob*_*ein 6 exception-handling arduino interrupt-handling atmel atsam3x

偶尔我会得到意外的中断,我的代码里面挂Dummy_Handler()exceptions.c爱特梅尔工作室框架(ASF)的.我正在使用Arduino Due的ATSAM3X8E微控制器.

void Dummy_Handler(void)
{
    while(1) {
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

void HardFault_Handler  ( void ) __attribute__ ((weak, alias("Dummy_Handler")));
Run Code Online (Sandbox Code Playgroud)

对此

void HardFault_Handler  ( void ) __attribute__ ((weak, alias("Dummy_HardFault_Handler")));
Run Code Online (Sandbox Code Playgroud)

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

Bob*_*ein 10

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

uint32_t phantomISR = 9999;

void Dummy_Handler(void)
{
    while(1) {
        phantomISR = __get_IPSR();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后可以在运行时监视此全局变量.(在我的情况下,我暂停了这个死循环的汇编代码,并在R3寄存器中看到了值3.)Atmel MCU doc解释了它的价值:

ISR_NUMBER
This is the number of the current exception:
0 = Thread mode
1 = Reserved
2 = NMI
3 = Hard fault
4 = Memory management fault
5 = Bus fault
6 = Usage fault
7-10 = Reserved
11 = SVCall
12 = Reserved for Debug
13 = Reserved
14 = PendSV
15 = SysTick
16 = IRQ0
45 = IRQ29

这两次都发生在我身上,那就是硬故障,这是Ardunio Due的一种蓝屏死机.所以我还安装了自己的Hard Fault处理程序.

ISR(HardFault_Handler)
{
    while (1) {
    }
}
Run Code Online (Sandbox Code Playgroud)

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