一个定位单片机跑飞原因的绝对方法

本文介绍了UP主在使用STM32F407芯片和uCOSii操作系统时遇到程序跑飞问题,通过addr2line工具定位错误,逐步分析堆栈信息、函数调用和变量,揭示了当读队列操作导致内存越界时的解决方案。
摘要由CSDN通过智能技术生成

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主这里只是一个简单的例子,更全面的可以查看栈的数据,将跑飞前的函数执行的每个函数、变量定位出来。大家在平时工作时遇到问题需要参考该步骤进行具体问题具体分析,毕竟那句话是这么说的:马克思主义活的灵魂,在于具体问题具体分析!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值