嵌入式技术论坛
直播中

jjll652

9年用户 1462经验值
私信 关注
[问答]

无法触发FPU activ这个硬件故障请问有知道这是什么情况吗

调试过程中, 出现了 FPU active 硬件故障, 可以百分百复现, 但是在线调试之后, 无论如何都无法触发这个硬件故障了, 而且, 之后下载的程序, 也不会触发这个问题, 请问有知道这是什么情况吗

1.jpg

回帖(11)

王秀珍

2022-9-8 10:17:06
只是提示当前程序使用了FPU,不代表与Hardfault有关。
当然也有可能相关,但从大家的情况来看,概率较小,要根据实际情况来分析。

你这里的问题,可以通过PC和LR寄存器来分析,

看你打印的寄存器,R3的值就很可疑,一般都是空指针和野指针造成的,
你看下你的PC和LR指向哪些代码,就基本有数了。

另外,日志显示你这个异常发生在中断里面。

也可能是中断栈溢出了。
举报

jjll652

2022-9-8 10:17:20
刚刚又重新复现了, 然后我把中断里面处理浮点数的函数, 通过信号量扔到线程里面处理了, 问题好像似乎解决了, 谢谢大佬
举报

jjll652

2022-9-8 10:17:28
又尝试找了一个根本原因, 发现还是能复现这个问题, 然后使用cmbacktrace 捕获到死在了atof函数 , 重写了一把, 最终定位为除以浮点数会概率性死机, 如果把 x/10.0 换成 x/10 , 就不会死机, 请问这可能是什么原理 , 芯片为 stm32l475vet6
举报

jjll652

2022-9-8 10:17:35
如果换成 两个整数直接相除, 也会出现FPU active 错误
举报

王秀珍

2022-9-8 10:17:44
上面说了,FPU active只是表示当前CPU开了FPU,没有别的意思,你可以把这条打印删除掉。
不要干扰你找问题。
举报

jjll652

2022-9-8 10:17:52
打错字了不是整数, 是两个实数相除, 比如把那一部分换成 9/10.0 , 没有变量参与计算.也会死掉
举报

王秀珍

2022-9-8 10:18:01
如果怀疑浮点部分出问题,主要查以下几点:

浮点明确要求栈是8字节对齐,线程栈在 cpuport.c 中做,中断栈一般在汇编文件中定义,也是8字节对齐的。
使用浮点后,栈的使用会加大,可能原来已经快溢出了,现在用了浮点,就刚好溢出
最上面图中有PC和LR地址,对应地址的指令请先去检查一下。
举报

jjll652

2022-9-8 10:18:13
排查, 确实死在了处理浮点数上面, 如果用系统的 atof , 就会死在这, 如果用自己写的, 就会死在除以小数的地方, 如果改成整数, 跑十分钟也不会出现
1.jpg
举报

王秀珍

2022-9-8 10:18:33
上面代码有语法或逻辑错误吗? 不管哪种都没有!

那怎么查呢? 既然代码本身没问题,那只能查他的运行环境了。
看指令,看数据,看地址,看栈使用情况,。。。

特别是栈的使用情况,我点我觉得很有可能就是这里有问题。
建议在异常处下断点,然后看此时的栈使用到哪里了,离栈底还有多远。
举报

jjll652

2022-9-8 10:18:45
线程栈对齐问题, 使用最新的4.02 版本, 检查cpuport.c 中, 确实有8字节的对齐的代码;
线程栈大小, 出问题的线程给到2048字节, 使用率 14%, 使用率都比较低
运行地址, 用addr2line 查看, 死在了atof_my 函数里面了

2.jpg
举报

jjll652

2022-9-8 10:18:58
找到问题了, 是我一个结构体数组太小了,导致偶尔越界访问, 经过这次排查, 学到了不少新知识
举报

更多回帖

发帖
×
20
完善资料,
赚取积分