硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2813|回复: 3
收起左侧

哪类浮点异常操作会导致HardFault?

[复制链接]

98

主题

356

回帖

650

积分

金牌会员

积分
650
发表于 2020-3-26 15:19:54 | 显示全部楼层 |阅读模式
设备运行几天后,总会莫名其妙的进入HardFault异常中断。根据HardFault中记录的SCB寄存器显示,SCB->CFSR=0x00008200,查M4权威手册发现这是个总线错误,具体的错误标志位是LSPERR
,解释为“Floating point lazy stacking error”,而BFAR的值每次都不同,但从汇编界面中指向的内容都是一致的,全部是“MOVS r0,r0”。查询故障前程序指针附近的代码,有一半的记录显示确实是进行了浮点的操作,另外一半记录显示在申请动态内存的时候,代码似乎没看出啥问题,因为这个函数会一直在调用。
请见硬汉哥是否也遇到过类似的故障?
QQ截图20200326151807.bmp
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115667
QQ
发表于 2020-3-26 15:29:55 | 显示全部楼层
mdk调试组件里面的hardfault reports显示的什么
这里特别注意一点:
使用硬件FPU一定要注意一点,浮点变量的地址必须要4字节对齐,这个是强制要求的。如果不使用硬件浮点,不用对齐,没关系,因为M内核支持非对齐访问、
回复

使用道具 举报

98

主题

356

回帖

650

积分

金牌会员

积分
650
 楼主| 发表于 2020-3-26 15:38:22 | 显示全部楼层
eric2013 发表于 2020-3-26 15:29
mdk调试组件里面的hardfault reports显示的什么
这里特别注意一点:
使用硬件FPU一定要注意一点,浮点变 ...

因为设备跑好几天后才出现异常,所以没有用仿真器,无法查看hardfault reports,只是把故障记录在了内部FLASH中,异常后再仿真看记录。
纠正个错误,刚才看权威记录走眼了,SCB->CFSR=0x00008200的错误标志位为PRECISERR,解释为“Precise data access error”,个人理解为进入异常前执行的指令出现了错误,怀疑可能还是回到了内存溢出的原点,跟浮点单元可能没啥关系,之前排查的方向跑偏了。
可以排除浮点对齐操作,因为故障制造了一个未对齐的浮点操作,发现UNALIGNED位会置1的。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115667
QQ
发表于 2020-3-26 16:42:14 | 显示全部楼层
云琴箫龙 发表于 2020-3-26 15:38
因为设备跑好几天后才出现异常,所以没有用仿真器,无法查看hardfault reports,只是把故障记录在了内部F ...

嗯,基本是就是这方面的问题了。运行阶段排错可以考虑下Ozone

SEGGER的Ozone调试组件新增的快照功能,超级实用,解决随机性死机的利器
http://www.armbbs.cn/forum.php?m ... 4967&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-11 01:06 , Processed in 0.217840 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表