【Atmel】代码运行一直调到 Dummy_Handler()的解决办法

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

其它

期间还遇到使用sprintfprintf无法输出浮点数的问题,这个是编译选项里配置了

-Dprintf=iprintf
-Dscanf=iscanf

如果没有,那就加上 -u_printf_float ,这样就能正常输出浮点数。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值