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文件

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

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

相关文章

【NTN 卫星通信】Starlink基于终端用户的测量以及测试概述

1 概述 收集了一些starlink的资料,是基于终端侧部署在野外的一些测试以及测量结果。 2 低地球轨道卫星网络概述 低地球轨道卫星网络(lsn)被认为是即将到来的6G中真正实现全球覆盖的关键基础设施。本文介绍了我们对Starlink端到端网络特征的初步测量结果和观测结果&…

STM32-ADC+DMA

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. ADC模拟-数字转换器1.1 ADC模拟-数字转换器1.2 逐次逼近型ADC1.3 ADC框图1.4 ADC基本结构1.5 输入通道1.6 规则组的转换模式1.6.1 单次转换,非扫描模式1.6.2 连续转换,非扫描模式1.6.3 单次…

Tabu Search — 温和介绍

Tabu Search — 温和介绍 目录 Tabu Search — 温和介绍 一、说明 二、什么是禁忌搜索以及我可以在哪里使用它? 三、禁忌搜索原则 四、短期记忆和积极搜索: 五、举例时间 六、结论: 七、参考: 一、说明 最近,我参加了…

在DevEco运行typeScript代码,全网详细解决执行Set-ExecutionPolicy RemoteSigned报出的错

目录 基本思路 网络推荐 本人实践 如下操作,报错: 基本思路 //在DevEco运行typeScript代码 /** * 1.保证node -v出现版本,若没有,配置环境变量(此电脑-属性-高级系统变量配置-path-粘贴路径);DevEco在local.properties中可看到当前nodejs的路径 * 2.npm install …

海外仓一件代发功能自动化:海外仓WMS系统配置方法

根据数据显示,2014-2019年短短几年之间,跨境电商销售总额增长了160%以上。这为跨境电商商家和海外仓,国际物流等服务端企业都提供了巨大的发展机遇。 然而,作为海外仓,要想服务好跨境电商,仓库作业的每一个…

车载测试之-CANoe创建仿真工程

在现代汽车工业中,车载测试是确保车辆电子系统可靠性和功能性的关键环节。而使用CANoe创建仿真工程,不仅能够模拟真实的车辆环境,还能大大提升测试效率和准确性。那么,CANoe是如何实现这些的呢? 车载测试中&#xff0…

刷题之合并两个有序数组(leetcode)

因为换了手机号码,之前leetcode的账号登不上去了,正好太久不刷题,很多思路都没了,所以重新开始刷leetcode! 这道题很简单,指针模拟一下,从后往前考虑,先看最大值。 class Solution…

【大语言模型系列之Transformer】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

PLC电源模块

PM电源模块 为CPU信号模块及 其他的扩展设备、其他用电设备(如传感器)提供工作供电 接线和开关 状态显示 灯的闪烁示意看手册 PS电源模块 为CPU信号模块及其他的扩展设备提供工作供电。PS(System Power Supply) 外形与PM电源模块类似,状…

常用的MRI分析软件

MRI(磁共振成像)分析软件种类繁多,涵盖了从基础图像处理到高级数据分析的各个方面。这些软件广泛应用于临床诊断、研究和教育等领域。以下是一些常用的MRI分析软件: 开源软件 商用软件 特殊用途软件 在线工具和云平台 这些软件各…

MATLAB制作一个简单的函数绘制APP

制作一个函数绘制APP,输入函数以及左右端点,绘制出函数图像。 编写回调函数: 结果:

图片高效管理神器,随机高度切割,一键生成灰色图片,个性化处理随心所欲

在数字化时代,图片已成为我们生活和工作中不可或缺的一部分。然而,面对海量的图片资源,如何高效管理、快速处理,成为了许多人头疼的问题。今天,我们为您带来了一款全新的图片高效管理神器_——首助编辑高手&#xff0c…

Nginx 报错问题汇总

目录 一、nginx: [emerg] invalid number of arguments in "include" directive in C:\Program Files\nginx-1.15.4/conf/nginx.conf:61 总结: 二、nginx: [error] OpenEvent("Global\ngx_reload_2152") failed (5: Access is denied) 解决…

51-3 内网信息收集 - 获取RDP密码信息(没有实验成功)

获取常见应用软件凭据 注意: %USERPROFILE% 是环境变量。在使用系统权限时,可以将 %USERPROFILE% 替换为绝对路径,或使用其他用户的令牌进行操作。 获取 RDP 保存的凭据(远程桌面) 为了避免每次连接服务器都进行身份验证,经常使用 RDP 远程桌面连接远程服务器的用户可能…

ubuntu下运行程序时提示缺库问题的有效解决方法

目录 一、问题现象二、解决方式三、总结 一、问题现象 当我们平时在ubuntu上运行一个程序时时长会遇到如下情况,含义为本机缺少执行程序需要的库 这时候我们可能会根据缺少的库使用apt install 库名的模糊名字 进行安装,然后再去运行,此时可…

网页生成二维码、在线演示

https://andi.cn/page/621504.html

【OJ】运行时错误(Runtime Error)导致递归爆栈问题

在进行OJ赛时, 题目:给你一个整数n,问最多能将其分解为多少质数的和。在第一行输出最多的质数数量k,下一行输出k个整数,为这些质数。 出现运行时错误 代码如下: def main():# code heren int(eval(input()))list …

AI中药处方模型构建与案例

在中医领域,人工智能(AI)可以生成各种指令来辅助诊断、治疗和研究。 1. 诊断辅助指令: 根据患者的症状和体征,自动分析并生成可能的中医证候诊断建议。利用中医望闻问切四诊信息,智能识别关键症状,提供对应的中医辨证思路。2. 治疗建议指令: 根据辨证结果,自动推荐相应…

Java语言程序设计篇一

Java语言概述 Java语言起源编程语言最新排名名字起源Java语言发展历程Java语言的特点Java虚拟机垃圾回收Java语言规范Java技术简介Java程序的结构Java程序注意事项:注释编程风格练习 Java语言起源 1990年Sun公司提出一项绿色计划。1992年语言开发成功最初取名为Oak…

维护el-table列,循环生成el-table

1、lib/setting.js(维护table列) const columns[{ label: 类型, prop: energyName, width: 150, isText: true },{ label: 消耗量(t或10⁴m), prop: inputNum, isInput: true },{label: CO₂,children: [// { label: 核算因子, prop: co2FactorValue, w…