Atmel工程一直进入Dummy_Handler() 的解决办法
查找进入Dummy_Handler的原因
在使用Atmel Studio 7 进行调试时,发现设备一直跳到Dummy_Handler,可以使用__get_IPSR(),查看是什么原因导致的。
/**
* \brief Default interrupt handler for unused IRQs.
*/
uint32_t phantomISR = 9999;
void Dummy_Handler(void)
{
phantomISR = __get_IPSR();
while (1) {
}
}
在调试器里,通过watch窗口,查看phantomISR的值,我查询到的值是等于3。
每个值对应的解释如下:
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
在进行调试时,建议把编译等级调到Optimization Level -O0,这样就能知道具体是哪一句报错。
解决办法
通过Debug发现,在代码里进行float浮点运算就会报hard fault。尝试使用Atmel Studio 7里面自带的Atmel Start Project功能,新建的工程就可以正常进行浮点运算。
查看编译选项,发现都有 -mfloat-abi=softfp 的选项,该选项介绍如下
在ARM GCC中,可以使用-mfloat-abi选项设置浮点数的ABI:
• soft: 调用软浮点库对浮点运算进行支持。在GCC中采用常用的指令来模拟浮点运算。
• softfp: 使用FPU进行浮点数运算。但是在函数调用时,仍然使用通用的寄存器传递浮点数参数。这需要额外的类型转换的开销。
• hard: 使用FPU进行浮点数运算。而且在函数调用时,使用FPU的寄存器传递浮点数参数。
工程里用的是softfp,所以有用到FPU单元,然后使用该单元需要在代码里进行FPU使能,调用fpu_enable()开启,开启后就可以正常进行浮点运算,也就不会报hard fault。
其它
期间还遇到使用sprintf和printf无法输出浮点数的问题,这个是编译选项里配置了
-Dprintf=iprintf
-Dscanf=iscanf
如果没有,那就加上 -u_printf_float ,这样就能正常输出浮点数。