STM32崩溃问题排查
文章目录
- 前言
- 1. 问题说明
- 2. STM32(Cortex M4内核)的寄存器
- 3. 崩溃问题分析
- 3.1 崩溃信息的来源是哪里?
- 3.2 崩溃信息中的每个关键字代表的含义
- 3.3 利用崩溃信息去查找造成崩溃的点
- 3.4 keil5中怎么根据地址找到问题点
- 3.5 keil5上编译时怎么输出map文件
- 4. 参考链接
前言
近期发现合并了一些其它平台上的代码到STM32上后,出现了崩溃问题,于是想要整体梳理下STM32上崩溃问题排查的原理。
1. 问题说明

上述是一段崩溃打印信息,后经排查发现是FreeRTOS的定时器栈深度设置的多小,定时器运行函数中运行的内容过多,各个局部变量申请的内存来不及释放,最终出现了崩溃情况。
这里说一下FreeRTOS中的定时器,实际上可以理解为是一个task任务,相当于创建了一个线程在不停的计时,然后轮询查询当前的定时器列表,发现哪个定时器运行时间到了,就去执行它。
所以对于定时器也需要配置所使用的内存大小。
2. STM32(Cortex M4内核)的寄存器

R0~R12为通用目的寄存器
R13为栈指针,物理上存在两个栈指针:主栈指针(MSP)为默认的栈指针,在复位后和处理器处于处理模式时,会被选择使用;另一个栈指针为进程栈指针(PSP),只能用于线程模式(有RTOS时)
R14为链接寄存器(LR),用于函数或子程序调用时返回地址的保存。在函数或子程序结束时,程序控制可以通过将LR的数值加载程序计数器(PC)中返回调用程序处并继续执行,在异常处理期间,LR会自动更新为特殊的EXC_RETURN(异常返回)数值。
例如a调用了b,这个时候pc指针中放的是b子函数的地址,LR中方的是a的地址,b执行完之后,从LR中将a的地址放入到PC指针去执行
3. 崩溃问题分析
3.1 崩溃信息的来源是哪里?
arm中崩溃实际上也是一种异常中断,当中断来临时,处理器会将当前的任务状态保存到栈中。
-
栈帧

栈帧(Stack Frame)是指在函数调用过程中,用于保存函数参数、局部变量、返回地址等信息的一块内存区域。当一个函数被调用时,STM32会为其分配一个栈帧,栈帧的大小取决于参数数量、局部变量数量以及编译器的优化设置等因素
结合上面的信息我们可以知道,想要获取函数崩溃时在哪个函数崩溃的,我们就需要找到异常中断触发时,被压栈的栈帧,而这个栈帧就在R13(Stack point)栈指针里面存放着。
我们在崩溃处理函数HardFault_Handler()中想办法获取到R13寄存器的指针所指向的内容,然后将其打印出来即可。
3.2 崩溃信息中的每个关键字代表的含义
STM32 微控制器采用了 ARM Cortex-M 核,该核有两个栈指针,一个是主栈指针(MSP),另一个是进程栈指针(PSP)。
MSP (Main Stack Pointer): 主栈指针 主要用于操作系统内核或者中断服务程序。
PSP (Process Stack Pointer): 进程栈指针 主要用于用户应用程序。
当 Cortex-M 内核退回到 Thread mode 后,根据 CONTROL 寄存器的设置,可以切换回主栈指针 MSP 或者进程栈指针 PSP。
PSP 里面存储的是所运行的用户应用程序相关的上下文。具体包括以下内容:
一些或全部的通用寄存器的值,这些寄存器在用户程序运行时会使用。Program Counter(PC):指向下一条将要执行的指令。Processor Status Register(PSR)的值:包含标志位状态。
栈指针:保存上一个栈帧的位置。
通常,在切换任务(或称为上下文切换)时,这些信息会被保存到栈中,新的任务开始,它的上下文信息则会从栈中恢复。
需要注意的是,具体保存了哪些内容,会根据具体的调度策略和操作系统设计有所不同。
3.3 利用崩溃信息去查找造成崩溃的点
确定LR/PC指针的值

首先我们要确定是否使用了RTOS,如果使用了,那么我们的崩溃信息应该就是存放PSP中。
我们需要先将这些信息读出来,然后当知道了LR和PC的值后,可以通过keil5中Debug的方式去寻找崩溃点或者通过编译过程中产生的map文件,找到对应的崩溃点。

3.4 keil5中怎么根据地址找到问题点
在Disassembly窗口单击右键—>选择Show Didassembly at Address—>输入地址
3.5 keil5上编译时怎么输出map文件

打开 Keil Vision。
在菜单中选择 "File" -> "Open Project...",然后选择你的项目文件。在 Keil Vision IDE 中,点击 "Project" 菜单,选择 "Options for Target"。在弹出的对话框中,选择 "Listing" 选项卡。在 "Generate Map File" 选项旁边,确保选中了 "Create ROM/FLASH Map" 和 "Create Object Module List"。
重新编译你的项目。
4. 参考链接
【STM32】HardFault问题详细分析及调试笔记
MDK5(keil)编译信息含义(占用sram,flash空间)与 MAP文件
相关文章:
STM32崩溃问题排查
文章目录 前言1. 问题说明2. STM32(Cortex M4内核)的寄存器3. 崩溃问题分析3.1 崩溃信息的来源是哪里?3.2 崩溃信息中的每个关键字代表的含义3.3 利用崩溃信息去查找造成崩溃的点3.4 keil5中怎么根据地址找到问题点3.5 keil5上编译时怎么输出…...
CSS 【详解】样式选择器(含ID、类、标签、通配、属性、伪类、伪元素、Content属性、子代、后代、兄弟、相邻兄弟、交集、并集等选择器)
CSS 样式选择器,用于选中页面中的 html 元素,以便添加 CSS 样式。 按渲染性能由高到低 依次是: ID 选择器 #id 通过元素的 id 属性选中元素,区分大小写 <p id"p1" >第一段</p>#p1{color: red; }但不推荐使…...
CMakeLists.txt编写思路
近期在linux编写CMakeLists.txt文件,整理了一些思路。 一、编写CMakeLists.txt的基本步骤和思路: 初始化CMake: 使用cmake_minimum_required指令指定CMake的最小版本要求,以确保兼容性。使用project指令定义项目名称和可选的语言…...
红日靶场----(三)2.漏洞利用
上期的通过一句话木马实现对目标主机的持久后门 我使用的是蚁剑,蚁剑安装及使用参考: 下载地址: GitHub - AntSwordProject/AntSword-Loader: AntSword 加载器 安装即使用: 1. 快速入门 语雀 通过YXCMS的后台GETSHELL 利用…...
LeetCode HOT100(三)滑动窗口
子数组最大平均数 I (非hot100,但是滑动窗口的思想可以很好的体现,入门滑动窗口很好的题) 给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。 请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数…...
数学系C++ 排序算法简述(八)
目录 排序 选择排序 O(n2) 不稳定:48429 归并排序 O(n log n) 稳定 插入排序 O(n2) 堆排序 O(n log n) 希尔排序 O(n log2 n) 图书馆排序 O(n log n) 冒泡排序 O(n2) 优化: 基数排序 O(n k) 快速排序 O(n log n)【分治】 不稳定 桶排序 O(n…...
记一下blender曲线阵列
先说一下如何正常使用这个 这一次我是用来贴瓷砖 随便创建一个mesh 然后添加一个阵列修改器,然后再给他添加一个curve修改器,使用constant offset去偏移他 这里有个小细节 我第一次创建的curve 我选取之后,死活无法沿着曲线阵列ÿ…...
Windows电脑安装Python结合内网穿透轻松搭建可公网访问私有网盘
文章目录 前言1.本地文件服务器搭建1.1.Python的安装和设置1.2.cpolar的安装和注册 2.本地文件服务器的发布2.1.Cpolar云端设置2.2.Cpolar本地设置 3.公网访问测试4.结语 前言 本文主要介绍如何在Windows系统电脑上使用python这样的简单程序语言,在自己的电脑上搭建…...
react hooks antd 父组件取子组件form表单的值
在React中,父组件可以使用ref来访问子组件的方法或属性。子组件包含一个表单, 使用forwardRef、useImperativeHandle:forwardRef允许组件使用ref将 DOM 节点暴露给父组件,使用useImperativeHandle暴露方法给父组件。 子组件&#…...
【ARMv8/v9 GIC 系列 1.7 -- GIC PPI | SPI | SGI | LPI 中断使能配置概述】
请阅读【ARM GICv3/v4 实战学习 】 文章目录 GIC 各种中断使能配置PPIs(每个处理器私有中断)SPIs(共享外设中断)SGIs(软件生成的中断)LPIs(局部中断)GIC 各种中断使能配置 在ARM GICv3和GICv4架构中,不同类型的中断(如PPIs、SPIs、SGIs和LPIs)可以通过不同的方式进…...
大数据如何推动工业数字化发展?
随着工业领域的深刻变革,数字化成为了驱动行业前行的核心力量。在这一转变中,大数据扮演着不可或缺的角色。它不仅为企业提供了洞察市场趋势、消费者行为等关键信息的窗口,还为企业优化生产流程、提升产品质量以及推动创新提供了强有力的支持…...
计算机网络浅谈—什么是 OSI 模型?
开放系统通信(OSI)模型是一个代表网络通信工作方式的概念模型。 思维导图 什么是 OSI 模型? 开放系统互连 (OSI) 模型是由国际标准化组织创建的概念模型,支持各种通信系统使用标准协议进行通信。简单而言,OSI 为保证…...
浪潮服务器内存物理插槽位置
浪潮服务器内存物理插槽位置 如下图所示...
windows node降级到指定版本
要在Windows上将Node.js降级到指定版本,你可以使用nvm(Node Version Manager)来管理和切换不同的Node.js版本。以下是使用nvm降级Node.js的步骤: 如果尚未安装nvm,请访问https://github.com/coreybutler/nvm-windows …...
EXSI 实用指南 2024 -编译环境 Mac OS 安装篇(一)
1. 引言 在现代虚拟化技术的快速发展中,VMware ESXi 作为领先的虚拟化平台,凭借其高性能、稳定性和丰富的功能,广泛应用于企业和个人用户。ESXi 能有效地提高硬件资源利用率,并简化 IT 基础设施的管理。然而,如何在 V…...
断电的固态硬盘数据能放多久?
近日收到一个网友的提问,在这里粗浅表达一下见解: “网传固态硬盘断电后数据只能放一年,一年之后就会损坏。但是我有一个固态硬盘已经放了五六年了(上次通电还是在2018年左右,我读初中的时候),…...
Neo4j安装
下载地址:Neo4j Deployment Center - Graph Database & Analytics 1.安装jdk,Neo4j 3.0需要jdk8,2.3.0之前的版本建议jdk7。Neo4j最新版本5.21.2,对应jdk版本17 2.将下载的zip文件解压到合适路径。 3.设置环境变量NEO4J_H…...
基于Java+SpringMvc+Vue技术的就医管理系统设计与实现系统(源码+LW+部署讲解)
目录 界面展示 第六章 部分代码实现 6.1 Spring boot 配置代码 6.2 用户管理及登录登出代码 6.3 Md5 加密算法代码 6.4 部分数据库代码 六、论文参考: 七、其他案例: 系统介绍: 就医管理系统,也称为医院管理系统&#…...
Transformer学习过程中常见的问题与解决方案 - Transformer教程
在机器学习领域,Transformer模型已经成为了处理自然语言处理(NLP)任务的主流工具。然而,在学习和使用Transformer的过程中,很多人会遇到各种各样的问题。今天我们就来聊一聊Transformer学习过程中常见的问题以及对应的…...
Linux进程间通信:匿名管道 命名管道
Linux进程间通信:匿名管道 &命名管道 一、进程间通信目的二、什么是管道三、匿名管道创建3.1 系统调用原型3.2 匿名管道创建 四、内核创建匿名管道过程五、匿名管道性质5.1 匿名管道的4种特殊情况5.2 匿名管道的5种特性5.3 测试源代码 六、命名管道6.1 创建命名…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
