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)
此外,可以通过暂停在调试模式下检测到.当然续集是什么导致了硬故障?我猜测内存擦除或无限递归.
| 归档时间: |
|
| 查看次数: |
7261 次 |
| 最近记录: |