UP主在工作时,有一个项目使用STM32F407芯片,出现很多次程序跑飞的问题,在解决问题的过程中,总结出了一个定位跑飞原因的绝对方法。
一、背景:
芯片:stm32f407zgt6
操作系统:uCOSii
调试工具:addr2line
二、原理:
通过查看程序跑飞前的堆栈,可以看到跑飞前单片机的所有信息。
三、分析过程:
第一步:使用addr2line将程序跑飞前的数据打印出来,arrd2line的使用可以点下面链接
Keil环境下STM32定位hardfault位置方法(addr2line工具)和遇到的情况_stm32 hardfault-CSDN博客
第二步:通过addr2line指令,我们可以定位到程序跑飞前函数调用过程
第三步:我们看源码,看到程序是在读队列函数里面跑飞的
第四步:读队列函数肯定是没问题的,那么我们就需要看下这个函数的变量了,插一句:需要了解函数的调用过程,可以看下面的链接,不看也可以,我下面简单介绍如何找到我们的目标变量
1.3 函数调用反汇编解析以及调用惯例案例分析 - jiu~ - 博客园 (cnblogs.com)
第五步:调试打开汇编窗口,那么我们就可以知道,Buf的值等于R1寄存器,Ret的值等于R0寄存器的值,我们回到打印的信息看一下
第六步:可以看到,Ret是0x20020001,超出RAM大小,往里面拷贝数据时就跑飞了
这是调用QueueRead的那段汇编代码,可以看到用R0和R1保存了函数形参值
四、总结:
以上就是使用addr2line对代码跑飞问题进行定位的方法了,这个方法应该是具备普适性的。当然,UP主这里只是一个简单的例子,更全面的可以查看栈的数据,将跑飞前的函数执行的每个函数、变量定位出来。大家在平时工作时遇到问题需要参考该步骤进行具体问题具体分析,毕竟那句话是这么说的:马克思主义活的灵魂,在于具体问题具体分析!