STM32卡死、跑飞如何调试确定问题

news2024/9/21 22:51:48

目录

前言

一、程序跑飞原因

二、调试工具

2.1Registers工具

2.2 Memory工具

2.3 Disassembly工具

2.4 Call Stack工具

三、找到程序跑飞位置

方式一、

方式二、


前言

我们初学STM32的时候代码难免会出现疏忽,导致程序跑飞,不再正常运行,那么都是什么情况会导致STM32程序跑飞呢?

一、程序跑飞原因

软件导致STM32跑飞(程序失控或死机)的原因有多种,主要包括以下几个方面:

  1. 中断处理不当

    • 未响应或清除中断标志:如果打开了某个中断但没有及时响应和清除中断标志,程序可能会持续进入中断,造成死机假象。
    • 中断变量处理不妥:如果定义了某些会在中断中修改的全局变量,但没有正确管理这些变量(如使用volatile关键字声明,或在读取前关闭全局中断),可能会导致数据不一致或程序异常。
  2. 堆栈溢出

    • 当项目代码量较大时,如果默认的堆栈设置过小,或者程序中存在大量的函数调用和局部变量,可能导致堆栈溢出,使程序跑飞。
  3. 不合理的内存操作

    • 内部Flash存储操作不当:不合理的Flash内存操作也可能导致程序死机。
    • 数组越界:如果在使用数组时没有控制好下标,导致数组越界,可能会意外修改系统的寄存器或数据,造成程序失控。
  4. 死循环

    • 程序中存在的无条件的死循环(如while(1)循环中缺少跳出条件)也可能导致程序无法继续执行后续操作。
  5. 看门狗未喂或未关闭

    • 如果使用了看门狗功能但没有在适当的时候喂狗,或者看门狗被意外开启但没有关闭,都可能导致程序被频繁复位。

二、调试工具

我们要发现程序在哪跑飞了,肯定是要借助调试工具了,以下几个工具是我们需要用到的。

2.1Registers工具

(1)通用寄存器(R0~R12)

  • R0~R7:这些是低组寄存器,所有指令都可以访问。它们的大小为32位,复位后的初始值不定。
  • R8~R12:这些是高组寄存器,只有部分的16位Thumb指令可以访问,而32位Thumb-2指令则不受限制。它们的大小同样为32位,复位后的初始值也不定。

(2)特殊功能寄存器

  • 堆栈指针(SP):也称为R13,在Cortex-M4内核中,有两个堆栈指针——主堆栈指针(MSP)和进程堆栈指针(PSP)。MSP用于异常服务例程和需要特权访问的应用程序代码,而PSP则用于常规的应用代码。
  • 连接寄存器(LR):即R14,主要作用是保存子程序的返回地址,以便在执行完子程序时恢复现场。
  • 程序计数器(PC):即R15,用于指示当前执行的指令地址。在Cortex-M系列中,由于采用指令流水线技术,读取PC会返回当前指令地址+4(以兼容Thumb代码)。

(3)程序状态寄存器(xPSR)

xPSR是程序状态寄存器,它又被分为三个子状态寄存器:

  • 应用程序状态寄存器(APSR)
  • 中断状态寄存器(IPSR)
  • PRIMASK:只有1个位,置1时关闭所有可屏蔽的异常。
  • FAULTMASK:只有1个位,置1时只有NMI(非屏蔽中断)可以响应。
  • BASEPRI:8位寄存器,定义了被屏蔽优先级的阈值。

(4)控制寄存器(Control)

控制寄存器用于控制FPU(浮点单元)的激活、堆栈指针的选择以及线程模式的特权级等。

2.2 Memory工具

Memory Window是Keil调试环境中的一个窗口,它提供了对程序内存的直接访问。通过这个窗口,你可以查看内存中的字节、字、双字等数据,并可以实时修改这些数据以测试程序的行为。这对于调试和验证程序中的内存访问、堆栈使用、变量存储等问题非常有帮助。

2.3 Disassembly工具

在Disassembly窗口中,你可以看到程序的反汇编代码。这些代码是程序在CPU上实际执行的指令的文本表示。你可以滚动窗口来查看不同的部分,或者使用窗口中的搜索功能来定位特定的代码或地址。

2.4 Call Stack工具

Call Stack(调用堆栈)界面是一个关键的调试工具,它允许开发者查看程序执行过程中函数调用的顺序和当前的位置。Call Stack窗口将显示当前函数调用的堆栈。这包括每个函数的调用顺序、每个函数的名称(如果可用)以及调用该函数的地址。你可以看到程序是如何从main函数开始,逐步调用其他函数,直到达到当前执行点的。

三、找到程序跑飞位置

介绍完了程序跑飞的原因以及调试工具以后,接下来我为大家说一下如何找到程序跑飞的位置,有两种方式。

方式一、

(1)在HardFault_Handler这个函数里面打上断点,程序跑飞都会进入这个中断。

(2)在Registers工具中找到R13的值。

(3)在Memory工具中搜索刚才R13的值,然后找到0800开头的值。

(4)在Disassembly工具中右键选择Show Disassembly at Address,然后将0x08001548复制进去,点GO TO,就找到程序在哪跑飞了

方式二、

 (1)和上面第一步一样,在HardFault_Handler这个函数里面打上断点。

(2)程序进入断点以后,先点继续运行,然后停止运行程序,打开Call Stack工具,找到HardFault_Handler,然后右键选择 show Caller Code就可以找到跑飞之前运行的代码了。

注意:

(1)方式一和方式二都需要先在HardFault_Handler打断点才能进行

(2)方式二不停止程序不会出现show Caller Code

(3)如果是堆栈溢出方式一二均无效,因为这两个方式都是通过堆栈进行寻址的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1972536.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑桌面便签软件哪个好,桌面便签如何显示在桌面?

在繁忙的工作日里,一款优秀的电脑桌面便签软件就像是一位贴心的小秘书,帮助你记录重要事项,提醒你不要错过任何细节。那么,哪个电脑桌面便签软件可以帮助我们更好地记录和管理日常工作和学习中的事项呢?又如何将桌面便…

16.搜索框滑块和简单验证

一、一些简单的验证 邮箱验证 <!-- 邮件验证 --><p>邮箱&#xff1a;<input type"email" name"email"></p>邮箱验证框的type是email&#xff0c;在框内&#xff0c;它会自动检测输入内容的格式 &#xff0c;若格式非邮箱格式&…

从分散到整合,细说比特币发展史

原文标题&#xff1a;《Layered Bitcoin》 撰文&#xff1a;Saurabh Deshpande 编译&#xff1a;Chris&#xff0c;Techub News 古往今来&#xff0c;货币在社会中都具有三个关键的功能&#xff1a;财富的储存手段、交换媒介和计量单位。虽然货币的形式在不断变化&#xff0c…

一文了解一下 MindSpeed,MindSpeed 是专为华为昇腾设备设计的大模型分布式加速套件。

https://gitee.com/ascend/MindSpeed Gitee Ascend/MindSpeed 项目&#xff0c;MindSpeed 是针对华为昇腾设备的大模型加速库。 MindSpeed 是专为华为昇腾设备设计的大模型加速库&#xff0c;旨在解决用户在大模型训练过程中遇到的显存资源不足等挑战。该库借鉴了 Megatron、D…

如何理解分布式光纤测温DTS的“实时在线监测”的概念?

实时在线监测是相对于非实时在线监测而言的一种高要求的监测方式。在非实时监测中&#xff0c;我们可以使用手持红外测温仪等设备&#xff0c;在需要时进行开机测量&#xff0c;而在不需要时则可以关机。然而&#xff0c;实时在线监测的目标是要求连续、全天候、每秒都不间断地…

检索增强生成RAG系列10--RAG的实际案例

讲了很多理论&#xff0c;最后来一篇实践作为结尾。本次案例根据阿里云的博金大模型挑战赛的题目以及数据集做一次实践。 完整代码地址&#xff1a;https://github.com/forever1986/finrag.git 本次实践代码有参考&#xff1a;https://github.com/Tongyi-EconML/FinQwen/ 目录 …

我的cesium for UE 踩坑之旅(一)

我的小小历程 创建过程场景搭建引入cesium for UE插件创建空白关卡并添加SunSky照明和FloatingPawn进行场景设置设置cesium token重设场景初始点位置顶层菜单窗口 —>打开cesium ion Assets &#xff0c;从而加入自己的资产 UI制作前端UI页面制作顶部菜单打开内容浏览器窗口…

第100+19步 ChatGPT学习:R实现朴素贝叶斯分类

基于R 4.2.2版本演示 一、写在前面 有不少大佬问做机器学习分类能不能用R语言&#xff0c;不想学Python咯。 答曰&#xff1a;可&#xff01;用GPT或者Kimi转一下就得了呗。 加上最近也没啥内容写了&#xff0c;就帮各位搬运一下吧。 二、R代码实现朴素贝叶斯分类 &#xf…

人工智能ai聊天都有哪些?分享4款智能软件!

在这个科技日新月异的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经悄然渗透到我们生活的方方面面&#xff0c;其中最令人兴奋的莫过于那些能够与人类进行流畅对话的AI聊天软件。它们不仅让交流跨越了物种的界限&#xff0c;更在娱乐、教育、客服等多个领域展现出无…

苹果电脑可以玩什么小游戏 适合Mac电脑玩的休闲游戏推荐

对于游戏爱好者而言&#xff0c;Mac似乎并不是游戏体验的首选平台。这主要是因为相较于Windows系统&#xff0c;Mac上的游戏资源显得相对有限。不过&#xff0c;这并不意味着Mac用户就与游戏世界绝缘。实际上&#xff0c;Mac平台上有着一系列小巧精致且趣味横生的小游戏&#x…

苍穹外卖项目day12(day09)---- 查询历史订单、查询订单详情、取消订单、再来一单(用户端)

目录 用户端历史订单模块&#xff1a; - 查询历史订单 产品原型 业务规则 接口设计 user/OrderController OrderService OrderServiceImpl OrderMapper OrderMapper.xml OrderDetailMapper 功能测试&#xff1a; - 查询订单详情 产品原型 接口设计 OrderControll…

安卓常用控件(下)

ImageView ImageView是用于在界面上展示图片的一个控件&#xff0c;它可以让我们的程序界面变得更加丰富多彩。 属性名描述id给当前控件定义一个唯一的标识符。layout_width给控件指定一个宽度。match_parent&#xff1a;控件大小与父布局一样&#xff1b;wrap_content&#x…

【两数相加】python刷题记录

R3-链表-链表高精度加法 目录 递归法 迭代 递归法 l1.vall2.valcarry&#xff0c;得到的和&#xff0c;%10为当前位存储的值&#xff0c;除以10为当前的进位值 # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # …

SpringMVC和Spring

1.AOP 1.基础内容 AOP是面向切面的的编程&#xff0c;AOP 是一种编程思想&#xff0c;是面向对象编程&#xff08;OOP&#xff09;的一种补充。 面向切面编程&#xff0c;实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术&#xff08;增强代码&#xff09;&…

【开源项目】基于RTP协议的H264播放器

基于RTP协议的H264播放器 1. 概述2.工程3.测试4.小结 1. 概述 前面记录了一篇基于RTP协议的H264的推流器、接收器的实现过程&#xff0c;但是没有加上解码播放&#xff0c;这里记录一下如何实现解码和播放&#xff0c;也是在前面的基础之上实现的。前一篇的记录为【开源项目】…

完成QT上位机(八)

一. 正式开始设计界面 这一章节我们将完成QT上位机的设计&#xff0c;如果有同学对QtCreater的使用不太熟悉的&#xff0c;可以参考下面的链接 Qt 快速入门系列教程 Qt 快速入门系列教程 (gitbooks.io)https://wizardforcel.gitbooks.io/qt-beginning/content/ 二. 数据库处…

从零开始的MicroPython(五)PWM

上一篇&#xff1a;串口 文章目录 定义ESP32代码 定义 要理解一个定义&#xff0c;就要引申一个已经掌握的概念&#xff0c;PWM是什么&#xff1f;我们或许可以用“周期”的概念来理解。 高电平出现的占比是占空比。 PWM&#xff08;脉冲宽度调制&#xff09;是一种调节信号…

022.(附加)chromedriver编译-绕过selenium机器人检测

有小伙伴说使用selenium没能绕过机器人检测&#xff0c;盘他。 一、selenium简介 Selenium 是一个强大的工具&#xff0c;用于Web浏览器自动化&#xff0c;更常被用于爬虫但selenium需要通过webdriver来驱动chrome&#xff0c;每次运行selenium时&#xff0c;都要先找到对应版…

VMware Workstation17 安装 Ubuntu 操作系统

今天给伙伴们分享一下VMware Workstation17 安装 Ubuntu 操作系统 &#xff0c;希望看了有所收获。 我是公众号「想吃西红柿」「云原生运维实战派」作者&#xff0c;对云原生运维感兴趣&#xff0c;也保持时刻学习&#xff0c;后续会分享工作中用到的运维技术&#xff0c;在运维…

企业邮箱有哪些便捷功能

企业邮箱有哪些便捷功能?一、消息流实现社交式互动&#xff1b;二、邮件委托轻松分担工作&#xff1b;三、音视频通话即时沟通&#xff1b;四、邮件定时发送与提醒确保重要信息不遗漏&#xff1b;五、邮件召回与延迟发送提供反悔机会&#xff1b;六、离线阅读邮件实现无缝工作…