STM32卡死、跑飞如何调试确定问题
目录
前言
一、程序跑飞原因
二、调试工具
2.1Registers工具
2.2 Memory工具
2.3 Disassembly工具
2.4 Call Stack工具
三、找到程序跑飞位置
方式一、
方式二、
前言
我们初学STM32的时候代码难免会出现疏忽,导致程序跑飞,不再正常运行,那么都是什么情况会导致STM32程序跑飞呢?
一、程序跑飞原因
软件导致STM32跑飞(程序失控或死机)的原因有多种,主要包括以下几个方面:
-
中断处理不当:
- 未响应或清除中断标志:如果打开了某个中断但没有及时响应和清除中断标志,程序可能会持续进入中断,造成死机假象。
- 中断变量处理不妥:如果定义了某些会在中断中修改的全局变量,但没有正确管理这些变量(如使用
volatile
关键字声明,或在读取前关闭全局中断),可能会导致数据不一致或程序异常。
-
堆栈溢出:
- 当项目代码量较大时,如果默认的堆栈设置过小,或者程序中存在大量的函数调用和局部变量,可能导致堆栈溢出,使程序跑飞。
-
不合理的内存操作:
- 内部Flash存储操作不当:不合理的Flash内存操作也可能导致程序死机。
- 数组越界:如果在使用数组时没有控制好下标,导致数组越界,可能会意外修改系统的寄存器或数据,造成程序失控。
-
死循环:
- 程序中存在的无条件的死循环(如
while(1)
循环中缺少跳出条件)也可能导致程序无法继续执行后续操作。
- 程序中存在的无条件的死循环(如
-
看门狗未喂或未关闭:
- 如果使用了看门狗功能但没有在适当的时候喂狗,或者看门狗被意外开启但没有关闭,都可能导致程序被频繁复位。
二、调试工具
我们要发现程序在哪跑飞了,肯定是要借助调试工具了,以下几个工具是我们需要用到的。
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)如果是堆栈溢出方式一二均无效,因为这两个方式都是通过堆栈进行寻址的。
相关文章:
STM32卡死、跑飞如何调试确定问题
目录 前言 一、程序跑飞原因 二、调试工具 2.1Registers工具 2.2 Memory工具 2.3 Disassembly工具 2.4 Call Stack工具 三、找到程序跑飞位置 方式一、 方式二、 前言 我们初学STM32的时候代码难免会出现疏忽,导致程序跑飞,不再正常运行&#…...
代理模式和Spring MVC
Spring是一个分层的轻量级的开源Java框架。核心是IOC(Inverse of Control 控制反转)和AOP(Aspect Oriented Programming 面向切面编程) AOP 面向切面 AOP (Aspect Orient Programming),直译过来就是 面向切面编程,AOP 是一种编程思想&#x…...
深入理解Vue slot的原理
文章目录 前言为什么需要插槽作用域插槽插槽的原理总结 前言 插槽是Vue中一个重要的特性,它有很多种用法:默认插槽、具名插槽、作用域插槽。尤其作用域插槽,还有一堆特性,比如解构prop,解构prop的时候还可以进行属性名…...
git fetch作用与用法
目录 git fetch作用 git fetch用法 git fetch作用 git fetch 命令在 Git 版本控制系统中扮演着重要的角色。其主要作用是从远程仓库获取最新版本的项目文件,但不会自动合并或修改你当前的工作。这意味着,使用 git fetch 后,你需要手动合并…...
pycharm如何查看git历史版本变更信息
通过名字查看不同版本 查看版本不同地方...
【2.2 python中的变量】
2.2 python中的变量 在Python中,变量是存储数据值的容器。Python是一种动态类型语言,这意味着你不需要在声明变量时指定变量的类型;Python会根据你赋给变量的值自动确定其类型。下面我将详细介绍Python中的变量,包括保留字&#…...
Python软体中找出一组字符串的最长公共前缀:算法与实现
Python软体中找出一组字符串的最长公共前缀:算法与实现 在处理字符串数据时,寻找多个字符串之间的共同特征是一个常见的需求。特别是在文件名、URL、或其他文本数据中,找到最长公共前缀(Longest Common Prefix, LCP)可以帮助我们进行更高效的搜索和分类。本文将详细介绍如…...
git lfs使用(huggingface下载大模型文件)-教程记录
写的比较清楚的教程,用于之后有需求时查找用: https://blog.csdn.net/flyingluohaipeng/article/details/130788293...
1. 什么是操作系统
文章目录 1.1 从功能上来看操作系统1.2 硬件资源 1.1 从功能上来看操作系统 对用户来说,操作系统是一个控制软件,可以用来管理应用程序,它可以限制不同的程序来占用的资源。对内部的软件来说,操作系统是一个管理外设和分配资源的…...
数据科学 - 数据预处理 (数据清洗,结构化数据)
1. 前言 数据清洗与结构化数据在数据分析和机器学习项目中扮演着至关重要的角色。随着大数据时代的到来,数据的质量、准确性和可用性成为决定项目成功与否的关键因素。 数据清洗提高数据质量,保证数据集的一致性;促进数据分析与挖掘…...
基于SpringBoot+Vue的校车调度管理系统(带1w+文档)
基于SpringBootVue的校车调度管理系统(带1w文档) 基于SpringBootVue的校车调度管理系统(带1w文档) 如今,因为无线网相关技术的快速,尤其是在网上进行资源的上传下载、搜索查询等技术,以及信息处理和语言开发技术的进步,同时编程语…...
基于改进拥挤距离的多模态多目标优化差分进化(MMODE-ICD)求解无人机三维路径规划(MATLAB代码)
一、无人机多目标优化模型 无人机三维路径规划是无人机在执行任务过程中的非常关键的环节,无人机三维路径规划的主要目的是在满足任务需求和自主飞行约束的基础上,计算出发点和目标点之间的最佳航路。 1.1路径成本 无人机三维路径规划的首要目标是寻找…...
opencascade AIS_Trihedron源码学习 绘制三轴坐标系
opencascade AIS_Trihedron 前言 //! 创建一个可选择的三轴坐标系 //! 该三轴坐标系包括一个原点,三个轴线和三个标签。 //! 标签的默认文本为 “X”, “Y”, “Z”。 //! 可以更改原点和任意轴线的颜色,箭头和标签的颜色也可以改变。 //! 可视化呈现可…...
【C++】C++应用案例-通讯录管理系统
目录 一、整体介绍 1.1、需求和目标 1.2、整体功能描述 二、页面及功能描述 2.1 主菜单 2.2 添加联系人菜单 2.3 显示联系人菜单 2.4 修改联系人菜单 2.5 退出功能 三、流程设计 3.1 主流程 3.2 添加操作流程 3.3 显示联系人操作流程 3.4 修改联系人操作流程 四…...
使用Python自动批量提取增值税发票信息并导出为Excel文件
要批量提取增值税发票的关键信息并将其导出为 Excel 文件,可以使用 Python 脚本结合 pdfplumber(用于解析 PDF 内容)、pandas(用于处理数据并导出 Excel)等库来实现。以下是实现这一目标的详细步骤。 1. 环境设置 首…...
vitis (eclipse) 的Indexer不能搜索、不能跳转到函数和变量定义和声明不能打开调用层次的解决方法
在使用vitis(2021.1) 过程中,有一个非常方便实用的功能,就是在函数或变量等源代码上通过右键菜单或快捷键F3、F4、CtrlAltH,也可以按住Ctrl键然后鼠标停留在函数名或变量名上,点击出现的链接,可以跳转到函数或变量的定…...
最佳HR软件指南:11款高效管理工具
文章介绍了11款人力资源管理工具:Moka、友人才、北森HRSaaS、同鑫eHR、i人事、红海eHR、BambooHR、Skuad、Hibob、OrangeHRM、Verint。 在选择人力资源管理软件时,选错不仅浪费时间和金钱,还会影响团队的工作效率和员工满意度。本文总结了11款…...
家长为孩子出国留学择校的四个步骤
如何为孩子选择最好的学校?无论您是选择公立或私立学校还是在家上学,无论您是否支付学费,都必须仔细规划。在为孩子选择学校的过程中,以下部分有供您考虑的问题。 写下对你来说最重要的五件事 在考虑选择学校时,您可…...
数据挖掘可以挖掘什么类型的模式?
一、挖掘频繁模式、关联和相关性 频繁模式(frequent pettern)是在数据中频繁出现的模式。 频繁项集一般是指频繁的在事务数据集中一起出现的商品的集合。 频繁出现的子序列,如顾客倾向于先买相机,再买内存卡这样的模式就是一个…...
JAVA中的隐式参数this
在Java中,this 关键字是一个非常重要的隐式参数,它代表当前对象的引用。通过 this,你可以访问类中的字段(属性)、方法以及构造函数中的参数(当参数名与字段名相同时,用于区分)。虽然…...
ThreadLocal 使用和详解避坑
在多线程编程中,每个线程都有自己的线程栈和线程本地存储。线程栈用于存储方法调用的信息,而线程本地存储则是每个线程私有的存储空间,用于存储线程的局部变量。ThreadLocal类提供了一种简单的方式来实现线程本地存储,它允许将线程…...
Python中使用类方法的返回值在其他方法中继续调用,return self进行链式调用
文章目录 return self进行链式调用继续思考,以下内容可以不看如果self中没有初始化valueself中定义其他变量,调用类方法外的函数 return self进行链式调用 在Python中,可以使用类方法的返回值在其他方法中继续调用。这通常通过返回类实例&am…...
基于IOT架构的数据采集监控平台!
LP-SCADA数据采集监控平台是蓝鹏测控推出的一款聚焦于工业领域的自动化数据采集监控系统, 助力数字工厂建设的统一监控平台。 为企业提供从下到上的完整的生产信息采集与集成服务,从而为企业综合自动化、工厂数字化及完整的"管控一体化”的解决方案…...
初见scikit-learn之基础教程
初见scikit-learn之基础教程 scikit-learn 基础教程 1. scikit-learn 简介1.1 什么是 scikit-learn?1.2 scikit-learn 的主要功能 2. 安装 scikit-learn2.1 安装方法2.2 验证安装 3. scikit-learn 基本使用3.1 数据加载与预处理3.1.1 加载数据集3.1.2 数据拆分3.1.3…...
基于STM32的嵌入式深度学习系统教程
目录 引言环境准备嵌入式深度学习系统基础代码实现:实现嵌入式深度学习系统 数据采集与预处理深度学习模型训练与优化模型部署与推理实时数据处理与反馈应用场景:智能物联网设备常见问题与解决方案收尾与总结 引言 随着深度学习在各种应用中的广泛采用…...
hive udf去掉map中的一个或者多个key
实现一个hive udf,可以将Map中的某一个或者多个key去掉,这里要继承GenericUDF 这个抽象类,然后Override evaluate这个函数即可,可以把执行这个udf前初始化的一些内容放在initialize方法内,比如参数的判断,函数的返回值类型等等。 代码写好之后,可以用如下方法创建这个函…...
模型量化技术综述:揭示大型语言模型压缩的前沿技术
大型语言模型(LLMs)通常因为体积过大而无法在消费级硬件上运行。这些模型可能包含数十亿个参数,通常需要配备大量显存的GPU来加速推理过程。 因此越来越多的研究致力于通过改进训练、使用适配器等方法来缩小这些模型的体积。在这一领域中&am…...
一文掌握Prompt:万能框架+优化技巧+常用指标
👉目录 1 写在前面 2 Prompt 万能框架 3 框架的细化 4 在框架上增加更多信息(RAG) 5 让大模型更好的思考(CoT) 6 附加技巧 7 优化方式及常用指标 8 写在最后 随着大模型在2023年横空出世,“Prompt 工程” 应…...
Vue 常用组件间通信方式
Vue 常用组件间通信方式 1. 父子组件通信 1.1 Props 父组件通过 props 向子组件传递数据,子组件通过 props 接收数据。 <!-- ParentComponent.vue --> <template><ChildComponent :message"parentMessage"></ChildComponent>…...
NineData云原生智能数据管理平台新功能发布|2024年7月版
本月发布 12 项更新,其中性能优化 3 项、功能优化 8 项、安全性发布 1 项。 1. 性能优化 数据复制 - SQL Server 增量性能优化 调整读取和写入方式,让 SQL Server 增量复制的性能轻松达到 5000 RPS 以上。 数据复制 - Doris|SelectDB|StarRocks 性能优…...
wordpress+无插件主题/seo自动推广软件
引言 前面我们介绍了 Mongoose所有的几个主要的数据结构mg_context、mg_connection、mg_request_info,还有Mongoose的 生命主线。有了这些基础就可以来看看Mongoose的核心处理工作是怎样的。如果你还没有阅读前面的文章,你可以通过下面的隧道直通&#x…...
盐城网站推广哪家好/免费seo工具汇总
认识主机板煮 鸡板....咳!「主机板」(Motherboard)不算电脑里最先进的零组件,但绝对是塞最多东西的零组件。事实上,现在新的主机板简直像怪物,上面 可能有数十个长长短短、大大小小、圆的方的、各式各样的插…...
陕西省建设造价协会网站/优化营商环境条例全文
上一次在面试官:来说说MySQL的常见优化方案……中说到 MySQL 性能优化的方案很多,因此它可以全面地考查一个程序员的经验是否丰富。当然对于这个问题的回答也是可深可浅,不同的岗位对此问题的要求也是不同的。MySQL 可以引申出更多的面试问题…...
企业一般用什么邮箱?/如何利用seo赚钱
https://github.com/rgrove/lazyload/ 转载于:https://www.cnblogs.com/byksj/p/8438580.html...
泰州市建设监理协会网站/网络营销活动案例
作为一只linux菜的不能更菜的鸟,在linux前台运行了一个服务后,我必须退出后才能执行其他命令,可是我的服务需要一直运行,于是我同事就给我在该命令后加了">/dev/null 2>&1"据说是这条命令就可以转向后台了&am…...
wordpress如何安装专题/长沙网站推广排名优化
深入了解分布式分布式事务分布式事务概念分布式事务产生的原因事务的ACID特性分布式理论CAP理论BASE理论分布式事务的应用场景常见的分布式事务解决方案两阶段提交TCC编程模式TCC开源框架-tcc-transactionTCC使用关键技术分析分布式项目使用tcc-transaction框架发布服务调用服务…...