有时我会得到意外的中断,我的代码会挂在 Dummy_Handler()
中,在Atmel Studio Framework(ASF)的exceptions.c
中。我正在使用Arduino的ATSAM3X8E微控制器。
void Dummy_Handler(void)
{
while(1) {
}
}
有什么想法如何确定是哪个中断是?
当然,我可以用独特的虚拟处理程序替换这个单个处理程序,每个例外情况一个。(其中大约有五十个。)例如,在同一例外中更改每行。C文件:
void HardFault_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler")));
到这个
void HardFault_Handler ( void ) __attribute__ ((weak, alias("Dummy_HardFault_Handler")));
等...或尝试推论我的代码如何生成中断。但是谁有这种时间?
此MCU具有中断程序状态寄存器,可以提供一些线索。ASF将其包裹在函数 __get_IPSR()
中
uint32_t phantomISR = 9999;
void Dummy_Handler(void)
{
while(1) {
phantomISR = __get_IPSR();
}
}
然后可以在运行时监视此全局变量。(就我而言,我暂停了此死亡循环的汇编代码,并在R3寄存器中看到了值3。)ATMEL MCU DOC解释了其值:
isr_number这是当前例外的数量:0 =线程模式1 =保留2 = NMI3 =硬故障4 =内存管理故障5 =巴士故障6 =使用故障7-10 =保留11 = svcall12 =保留调试13 =保留14 = pendsv15 = Systick16 = IRQ045 = IRQ29
这两次都发生在我身上,这是严重的错,这是Ardunio到期的蓝屏死亡。因此,我还安装了我自己的硬故障处理程序。
ISR(HardFault_Handler)
{
while (1) {
}
}
也可以通过暂停在调试模式下检测到。当然,续集是什么导致严重的错误?我猜记忆擦拭或无限递归。