打印
[其他ST产品]

IDE导致Hard Fault ?

[复制链接]
156|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
WHALEE|  楼主 | 2025-4-6 10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在F469I-DISCO 板卡中,用了运行良好的以前项目中的代码在STMcube中调试,频繁触发硬故障处理程序。

硬故障处理程序显示:Attempt to do exception with bad value in EXEC_RETURN number (INVCP)。

PC 和 LR 只指向最后执行的函数,但由于硬件错误总是出现在代码的不同位置,所以PC和LR没有实质性意义。

我唯一能想到的是 IDE 出了问题,如果我没记错的话,这些事情发生在我设置了一些 printf 断点之后,但我将它们全部删除了。

我可以在 IDE 中设置任何内容,因为即使在创建新项目之后,也会触发硬故障。

使用特权

评论回复
沙发
公羊子丹| | 2025-4-7 07:25 | 只看该作者
我之前用 printf 断点也遇到过 INVPC 的 hard fault,怀疑 ST-Link 的 SWO 输出机制有时候搞乱了堆栈,你试试断点前加个 __NOP()?

使用特权

评论回复
板凳
周半梅| | 2025-4-7 07:26 | 只看该作者
你可以在 HardFault_Handler 里加上栈分析代码,看一下出错时 EXC_RETURN 和 stack frame 的具体内容,INVPC 通常是 LR 不对了。

使用特权

评论回复
地板
帛灿灿| | 2025-4-7 07:27 | 只看该作者
有没有可能 printf 使用了 heap,但你项目没有初始化 malloc 所需区域?printf 一旦踩内存很容易引起栈混乱。

使用特权

评论回复
5
童雨竹| | 2025-4-7 07:28 | 只看该作者
我建议你关掉 semihosting 和 SWO 相关的 debug 输出再试试,有时候 CubeIDE 会默认启用某些调试 hook。

使用特权

评论回复
6
万图| | 2025-4-7 07:29 | 只看该作者
我遇到 INVPC 的问题,是因为中断服务函数返回的时候用了 osThreadYield(),但此时上下文不对,直接炸了。

使用特权

评论回复
7
Wordsworth| | 2025-4-7 07:31 | 只看该作者
你是不是用的是 CMSIS-RTOS 或者 FreeRTOS?这类问题可能是线程栈溢出,调试状态下因为调试器打断导致上下文保存失败。

使用特权

评论回复
8
Bblythe| | 2025-4-7 07:32 | 只看该作者
如果连新项目也有问题,那你考虑一下是不是 ST-Link 固件或者 IDE 的某个插件更新后出锅了?你可以尝试用 ST-Link Utility 单独跑。

使用特权

评论回复
9
Pulitzer| | 2025-4-7 07:33 | 只看该作者
有些 IDE 插件会对 printf 加入自己的“指令拦截”,你看下 Project Properties > Debugger 那一栏,SWV trace 和 semihosting 是不是全关了。

使用特权

评论回复
10
Uriah| | 2025-4-7 07:34 | 只看该作者
我之前也怀疑过 IDE 出问题,后来用裸跑 binary 的方式刷进去后程序就正常跑了,可以试试用 CubeProgrammer 下载 bin 再复现。

使用特权

评论回复
11
Clyde011| | 2025-4-7 07:35 | 只看该作者
如果你打开了调试器的“Instruction trace”之类功能,也可能在某些处理器上导致额外异常,可以在 debug config 里关掉相关设置再测试下。

使用特权

评论回复
12
probedog| | 2025-4-7 11:35 | 只看该作者
可能是堆栈溢出导致吧。

使用特权

评论回复
13
classroom| | 2025-4-7 11:59 | 只看该作者
检查堆栈大小,如果堆栈太小,尝试增大堆栈大小。

使用特权

评论回复
14
elephant00| | 2025-4-7 12:05 | 只看该作者
可能是CubeIDE 或调试器配置问题。

使用特权

评论回复
15
laocuo1142| | 2025-4-7 12:23 | 只看该作者
减少局部变量使用,检查代码中是否有大量的局部变量或大数组,尽量将它们改为全局变量或动态分配。

使用特权

评论回复
16
powerantone| | 2025-4-7 14:23 | 只看该作者
所有指针在使用前是否已正确初始化,并且指向有效的内存地址。

使用特权

评论回复
17
stormwind123| | 2025-4-7 15:00 | 只看该作者
如果程序尝试访问未映射的内存区域或非法指针,可能会导致硬故障。

使用特权

评论回复
18
两只袜子| | 2025-4-7 20:00 | 只看该作者
错误信息 Attempt to do exception with bad value in EXEC_RETURN number (INVCP) 表明异常返回地址(EXEC_RETURN)的值不正确通常是由于异常处理程序中的 BX LR 指令使用了错误的 LR 值。或者在中断或异常处理程序中修改了堆栈或寄存器,导致返回地址被破坏。

使用特权

评论回复
19
duo点| | 2025-4-7 20:23 | 只看该作者
重置 CubeIDE 的工作区设置,或者在一个新的工作区中创建项目。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

8

帖子

0

粉丝