Atmel Studio Dummy_Handler



有时我会得到意外的中断,我的代码会挂在 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) {
    }
}

也可以通过暂停在调试模式下检测到。当然,续集是什么导致严重的错误?我猜记忆擦拭或无限递归。

相关内容

  • 没有找到相关文章

最新更新