Atmel Studio Dummy_Handler
Posted
技术标签:
【中文标题】Atmel Studio Dummy_Handler【英文标题】: 【发布时间】:2014-01-22 20:44:43 【问题描述】:有时我会收到意外中断,我的代码会挂在 Atmel Studio Framework (ASF) 的 exceptions.c
中的 Dummy_Handler()
内。我正在使用 Arduino Due 的 ATSAM3X8E 微控制器。
void Dummy_Handler(void)
while(1)
任何想法如何确定哪个中断?
当然,我可以用唯一的虚拟处理程序替换这个单一的处理程序,每个异常处理一个。 (大约有五十个。)例如更改同一 exceptions.c 文件中的每一行:
void HardFault_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler")));
到这里
void HardFault_Handler ( void ) __attribute__ ((weak, alias("Dummy_HardFault_Handler")));
等等...或者尝试推断我的代码是如何产生哪个中断的。但是谁有这样的时间呢?
【问题讨论】:
【参考方案1】:这个 MCU 有一个中断程序状态寄存器,可以提供一些关于来源的线索。 ASF 已将其包装在 core_cmFunc.h 中的函数 __get_IPSR()
中:
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 的一种蓝屏死机。所以我也安装了一个自己的Hard Fault handler。
ISR(HardFault_Handler)
while (1)
此外,可通过暂停在调试模式下检测到。续集当然是what causes a Hard Fault?我猜是内存擦除或无限递归。
【讨论】:
以上是关于Atmel Studio Dummy_Handler的主要内容,如果未能解决你的问题,请参考以下文章
Atmel Studio 烧录 Atmega328P(Arduiono)
系统调用在 Atmel AVR Studio(使用 ASF)中不起作用