我目前正在努力寻找我的STM32H743上有时发生硬件故障的原因. 我能够将罪魁祸首缩小到一段大约200行的代码.现在,我当然想确定它的确切位置.
一些可能相关也可能不相关的信息: 我正在使用C语言对芯片进行编程,使用ST HAL.我通过VSCode的ST-Linkv3使用GDB进行调试.
调试因以下几个因素而变得复杂:
- 该错误很少发生.我已经找到了复制故障的可靠方法,但可能需要几分钟到一个小时才会出现错误.
- 该误差取决于某些硬件时序(它涉及UART外设).我不能只是单步执行代码,直到它发生,因为当单步执行时,它就不会发生.
- 该错误似乎没有留下有意义的堆栈帧(见下文).这其实是我质询的主要题目.
为了找到错误的原因,我按照下面的说明进行操作:https://interrupt.memfault.com/blog/cortex-m-hardfault-debug
我的CFSR(0xE000ED28
)的值是0x1
.所以是IACCVIOL
.嗯..在这一点上,我想提到我没有启用任何MPU是有意义的.
因此,如果我理解正确的话,这意味着有什么东西试图将代码执行跳到现在允许执行代码的内存位置.造成这种情况的可能原因是什么?
我的HFSR(0xE000ED2C
)的价值是0x40000000
.那么FORCED
故障,这对我有什么帮助吗?
我的lr
寄存器的值是0xFFFFFFE9
.lr & (1<<2)
是0x0
,因此这意味着msp
应该是活动堆栈指针.从msp
(运行p/a *(uint32_t[8] *)$msp
)读出堆栈帧可以得到以下结果:
0x672, // r0
0x40, // r1
0x631090, // r2
0x20001800, // r3
0xff // r12
0xfc006e3f // LR
0xfc006e3e // pc
0x81000000 // xPSR
因此,如果我理解正确的话,LR应该是Harderror处理程序之前的最后一次跳转的返回地址.但是0xfc006e3f
是一个什么样的寄信人地址呢?我想这是硬件故障最初发生的部分原因,但我如何才能从这些信息中找到问题的实际原因?