当前位置:   article > 正文

STM32进入HardFault快速定位问题_stm32 cubeide 全速运行进入hardfault

stm32 cubeide 全速运行进入hardfault

基于RT-thread,STM32硬件平台。在项目开发过程中遇到了程序进入hard fault的异常,通过查看pc寄存器和lr寄存器快速定位到出问题位置(函数)。

STM32出现硬件错误可能有以下原因:

1.内存溢出,访问越界;

2.堆栈溢出;

3.中断处理错误;

在RTT系统中,当系统出现hard fault异常时,程序会进入RTT提供的下面这个接口

void rt_hw_hard_fault_exception(struct exception_info *exception_info)
  1. struct exception_stack_frame
  2. {
  3. rt_uint32_t r0;
  4. rt_uint32_t r1;
  5. rt_uint32_t r2;
  6. rt_uint32_t r3;
  7. rt_uint32_t r12;
  8. rt_uint32_t lr;
  9. rt_uint32_t pc;
  10. rt_uint32_t psr;
  11. };

通过将LR寄存器和PC寄存器打印出来,拿到当前PC地址,知道当前程序执行到了哪个地址。LR寄存器是连接寄存器,在执行子函数前,LR会保存执行完子函数后,应该回到哪个地方。

 ​​​​​​

 通过LR和PC值可快速定位在进入异常处理前最后一个调用的函数,在本次调试中可定位到

unsigned char CRC8_Table(unsigned char *p, int cnt)

 进一步推测可能是数组越界或函数指针越界,我们将每次调用该函数传入参数cnt打印出来,发现cnt在某次传入时被赋给了很大的值,导致p++越界。

总结:指针和数组的使用需要是十分谨慎,最好能对传入的参数进行合法性检查,避免出现访问越界的问题。假如出现hard fault问题,可通过此方法快速定位到问题点。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/50633
推荐阅读
相关标签
  

闽ICP备14008679号