当前位置: 首页 > news >正文

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 样式选择器&#xff0c;用于选中页面中的 html 元素&#xff0c;以便添加 CSS 样式。 按渲染性能由高到低 依次是&#xff1a; ID 选择器 #id 通过元素的 id 属性选中元素&#xff0c;区分大小写 <p id"p1" >第一段</p>#p1{color: red; }但不推荐使…...

CMakeLists.txt编写思路

近期在linux编写CMakeLists.txt文件&#xff0c;整理了一些思路。 一、编写CMakeLists.txt的基本步骤和思路&#xff1a; 初始化CMake&#xff1a; 使用cmake_minimum_required指令指定CMake的最小版本要求&#xff0c;以确保兼容性。使用project指令定义项目名称和可选的语言…...

红日靶场----(三)2.漏洞利用

上期的通过一句话木马实现对目标主机的持久后门 我使用的是蚁剑&#xff0c;蚁剑安装及使用参考&#xff1a; 下载地址&#xff1a; GitHub - AntSwordProject/AntSword-Loader: AntSword 加载器 安装即使用&#xff1a; 1. 快速入门 语雀 通过YXCMS的后台GETSHELL 利用…...

LeetCode HOT100(三)滑动窗口

子数组最大平均数 I &#xff08;非hot100&#xff0c;但是滑动窗口的思想可以很好的体现&#xff0c;入门滑动窗口很好的题&#xff09; 给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。 请你找出平均数最大且 长度为 k 的连续子数组&#xff0c;并输出该最大平均数…...

数学系C++ 排序算法简述(八)

目录 排序 选择排序 O(n2) 不稳定&#xff1a;48429 归并排序 O(n log n) 稳定 插入排序 O(n2) 堆排序 O(n log n) 希尔排序 O(n log2 n) 图书馆排序 O(n log n) 冒泡排序 O(n2) 优化&#xff1a; 基数排序 O(n k) 快速排序 O(n log n)【分治】 不稳定 桶排序 O(n…...

记一下blender曲线阵列

先说一下如何正常使用这个 这一次我是用来贴瓷砖 随便创建一个mesh 然后添加一个阵列修改器&#xff0c;然后再给他添加一个curve修改器&#xff0c;使用constant offset去偏移他 这里有个小细节 我第一次创建的curve 我选取之后&#xff0c;死活无法沿着曲线阵列&#xff…...

Windows电脑安装Python结合内网穿透轻松搭建可公网访问私有网盘

文章目录 前言1.本地文件服务器搭建1.1.Python的安装和设置1.2.cpolar的安装和注册 2.本地文件服务器的发布2.1.Cpolar云端设置2.2.Cpolar本地设置 3.公网访问测试4.结语 前言 本文主要介绍如何在Windows系统电脑上使用python这样的简单程序语言&#xff0c;在自己的电脑上搭建…...

react hooks antd 父组件取子组件form表单的值

在React中&#xff0c;父组件可以使用ref来访问子组件的方法或属性。子组件包含一个表单&#xff0c; 使用forwardRef、useImperativeHandle&#xff1a;forwardRef允许组件使用ref将 DOM 节点暴露给父组件&#xff0c;使用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)可以通过不同的方式进…...

大数据如何推动工业数字化发展?

随着工业领域的深刻变革&#xff0c;数字化成为了驱动行业前行的核心力量。在这一转变中&#xff0c;大数据扮演着不可或缺的角色。它不仅为企业提供了洞察市场趋势、消费者行为等关键信息的窗口&#xff0c;还为企业优化生产流程、提升产品质量以及推动创新提供了强有力的支持…...

计算机网络浅谈—什么是 OSI 模型?

开放系统通信&#xff08;OSI&#xff09;模型是一个代表网络通信工作方式的概念模型。 思维导图 什么是 OSI 模型&#xff1f; 开放系统互连 (OSI) 模型是由国际标准化组织创建的概念模型&#xff0c;支持各种通信系统使用标准协议进行通信。简单而言&#xff0c;OSI 为保证…...

浪潮服务器内存物理插槽位置

浪潮服务器内存物理插槽位置 如下图所示...

windows node降级到指定版本

要在Windows上将Node.js降级到指定版本&#xff0c;你可以使用nvm&#xff08;Node Version Manager&#xff09;来管理和切换不同的Node.js版本。以下是使用nvm降级Node.js的步骤&#xff1a; 如果尚未安装nvm&#xff0c;请访问https://github.com/coreybutler/nvm-windows …...

EXSI 实用指南 2024 -编译环境 Mac OS 安装篇(一)

1. 引言 在现代虚拟化技术的快速发展中&#xff0c;VMware ESXi 作为领先的虚拟化平台&#xff0c;凭借其高性能、稳定性和丰富的功能&#xff0c;广泛应用于企业和个人用户。ESXi 能有效地提高硬件资源利用率&#xff0c;并简化 IT 基础设施的管理。然而&#xff0c;如何在 V…...

断电的固态硬盘数据能放多久?

近日收到一个网友的提问&#xff0c;在这里粗浅表达一下见解&#xff1a; “网传固态硬盘断电后数据只能放一年&#xff0c;一年之后就会损坏。但是我有一个固态硬盘已经放了五六年了&#xff08;上次通电还是在2018年左右&#xff0c;我读初中的时候&#xff09;&#xff0c;…...

Neo4j安装

下载地址&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 1.安装jdk&#xff0c;Neo4j 3.0需要jdk8&#xff0c;2.3.0之前的版本建议jdk7。Neo4j最新版本5.21.2&#xff0c;对应jdk版本17 2.将下载的zip文件解压到合适路径。 3.设置环境变量NEO4J_H…...

基于Java+SpringMvc+Vue技术的就医管理系统设计与实现系统(源码+LW+部署讲解)

目录 界面展示 第六章 部分代码实现 6.1 Spring boot 配置代码 6.2 用户管理及登录登出代码 6.3 Md5 加密算法代码 6.4 部分数据库代码 六、论文参考&#xff1a; 七、其他案例&#xff1a; 系统介绍&#xff1a; 就医管理系统&#xff0c;也称为医院管理系统&#…...

Transformer学习过程中常见的问题与解决方案 - Transformer教程

在机器学习领域&#xff0c;Transformer模型已经成为了处理自然语言处理&#xff08;NLP&#xff09;任务的主流工具。然而&#xff0c;在学习和使用Transformer的过程中&#xff0c;很多人会遇到各种各样的问题。今天我们就来聊一聊Transformer学习过程中常见的问题以及对应的…...

Linux进程间通信:匿名管道 命名管道

Linux进程间通信&#xff1a;匿名管道 &命名管道 一、进程间通信目的二、什么是管道三、匿名管道创建3.1 系统调用原型3.2 匿名管道创建 四、内核创建匿名管道过程五、匿名管道性质5.1 匿名管道的4种特殊情况5.2 匿名管道的5种特性5.3 测试源代码 六、命名管道6.1 创建命名…...

MATLAB单双目标定实战:逐图解析重投影误差的提取与评估

1. 重投影误差的底层逻辑与MATLAB实现 第一次用MATLAB做相机标定时&#xff0c;盯着那个总均方根误差&#xff08;Total RMS Error&#xff09;数值看了半天&#xff0c;总觉得少了点什么。后来才明白&#xff0c;就像考试不能只看总分&#xff0c;标定质量评估也需要细化到每张…...

GPU-CPU混合向量检索框架的技术突破与应用

1. 项目概述&#xff1a;GPU-CPU混合向量检索框架的技术突破在当今大规模信息检索和推荐系统领域&#xff0c;向量相似度计算已成为核心瓶颈。传统方案通常面临两难选择&#xff1a;要么完全依赖CPU导致响应延迟居高不下&#xff0c;要么全量使用GPU造成资源严重浪费。VECTORLI…...

从‘亮灯’到‘定位’:一个真实商用车J1939故障排查全记录(含DM1多包传输解析)

从‘亮灯’到‘定位’&#xff1a;一个真实商用车J1939故障排查全记录&#xff08;含DM1多包传输解析&#xff09; 1. 故障现象与初步诊断 那是一个普通的周二早晨&#xff0c;维修车间接到一辆6x4牵引车的报修单——仪表盘上的MIL&#xff08;故障指示灯&#xff09;持续点亮。…...

DevEco Studio预览器(Previewer)的3个隐藏技巧:从实时预览到多设备联调

DevEco Studio预览器的3个隐藏技巧&#xff1a;从实时预览到多设备联调 在鸿蒙应用开发中&#xff0c;DevEco Studio的Previewer功能早已超越了简单的UI查看工具。对于已经掌握基础操作的中级开发者而言&#xff0c;如何将这个看似简单的预览窗口转变为高效调试利器&#xff0…...

168MHz Cortex-M4+FPU+1MB Flash:STM32F405RGT6的高性能工业MCU参数解析

STM32F405RGT6&#xff1a;168MHz Cortex-M4工业MCU的高性能标杆在工业控制、电机驱动和物联网网关等嵌入式应用中&#xff0c;微控制器需要在处理性能、存储容量和外设集成度之间取得平衡。STM32F405RGT6是意法半导体STM32F4系列中的经典型号&#xff0c;基于ARM Cortex-M4内核…...

告别仿真报错!手把手教你用Quartus II 21.1和ModelSim 2022.1创建Testbench(附完整代码)

Quartus II与ModelSim联合仿真实战&#xff1a;从零构建高可靠性Testbench 在数字电路设计领域&#xff0c;仿真验证环节往往决定着项目成败。据统计&#xff0c;超过60%的FPGA开发时间消耗在功能验证阶段&#xff0c;而其中近半问题源于Testbench编写不当或仿真环境配置错误。…...

2026年主流云平台对ONNX Runtime的支持情况

ONNX Runtime作为微软开源的跨平台推理引擎&#xff0c;凭借跨框架兼容性、低延迟、高吞吐量的核心优势&#xff0c;已成为2026年AI推理场景的核心支撑工具——据IDC 2026年Q1 AI推理市场报告显示&#xff0c;ONNX Runtime在云平台推理引擎使用率达68%&#xff0c;较2025年提升…...

电脑自动干活不是梦|OpenClaw小龙虾本地AI智能体Windows部署详细步骤

核心亮点&#xff1a;零代码门槛&#xff5c;全程可视化&#xff5c;无需手动配环境&#xff5c;内置所有依赖&#xff5c;28 万 Tokens 额度 下载地址&#xff1a;OpenClaw Windows 一键部署包 v2.7.5 文章标签&#xff1a;#OpenClaw #小龙虾 AI #本地 AI 智能体 #Windows 一键…...

Opensmile实战:从零到一的音频特征提取指南

1. 为什么选择Opensmile处理音频特征&#xff1f; 第一次接触音频分析时&#xff0c;我被各种专业工具搞得眼花缭乱。直到实验室的师兄推荐了Opensmile&#xff0c;这个开源工具彻底改变了我的工作效率。它最吸引我的地方在于三点&#xff1a;全流程覆盖&#xff08;从特征提取…...

重建二叉树-C++

分享一个大牛的人工智能教程。零基础&#xff01;通俗易懂&#xff01;风趣幽默&#xff01;希望你也加入到人工智能的队伍中来&#xff01;请轻击人工智能教程https://www.captainai.net/troubleshooter // 面试题7&#xff1a;重建二叉树 // 题目&#xff1a;输入某二叉树的前…...