Exception handling 阿特梅尔工作室虚拟处理器

Exception handling 阿特梅尔工作室虚拟处理器,exception-handling,arduino,interrupt-handling,atmel,atsam3x,Exception Handling,Arduino,Interrupt Handling,Atmel,Atsam3x,偶尔我会收到一个意外的中断,我的代码将挂在Atmel Studio Framework(ASF)的exceptions.c中的虚拟处理器()中。我正在使用Arduino Due的ATSAM3X8E微控制器 void Dummy_Handler(void) { while(1) { } } 你知道如何判断是哪个中断吗 当然,我可以用唯一的虚拟处理程序替换这个处理程序,每个异常对应一个。(大约有50行。)例如,更改同一exceptions.c文件中的每一行: void HardFa

偶尔我会收到一个意外的中断,我的代码将挂在Atmel Studio Framework(ASF)的
exceptions.c
中的
虚拟处理器()中。我正在使用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")));

等等。。。或者试着解释一下我的代码是如何产生中断的。但是谁有这样的时间呢?

这个MCU有一个中断程序状态寄存器,可以提供一些关于源代码的线索。ASF已将其包装在core\u cmFunc.h中的函数中

uint32_t phantomISR = 9999;

void Dummy_Handler(void)
{
    while(1) {
        phantomISR = __get_IPSR();
    }
}
然后可以在运行时监视此全局变量。(在我的例子中,我暂停了这个死亡循环的汇编代码,并在R3寄存器中看到了值3。)Atmel MCU文档解释了它的值:

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 此外,在调试模式下可通过暂停进行检测。当然续集是?我猜是内存擦除还是无限递归

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