如何灵活运用keil工具进行问题分析(1)— 解决日常程序卡死问题

前言

(1)如果有嵌入式企业需要招聘湖南区域日常实习生,任何区域的暑假Linux驱动实习岗位,可C站直接私聊,或者邮件:zhangyixu02@gmail.com,此消息至2025年1月1日前均有效
(2)最近看到很多网友询问一个问题,在开发程序的时候,遇到一些bug就卡死了,然后就不知所措了。反复看到他们问类似的问题,而我最近又学习了韦东山老师的栈回溯相关的知识,因此做一个分享。
(3)这里需要注意一点,韦东山老师的方法个人认为太原始,门槛太高了。Keil其实已经集成了相关的操作,但是韦东山老师却硬要手动回溯代码。为了让debug更加的方便和入门,我在此将会结合keil工具来进行讲解。

keil配置

(1)TARMSTM.DLL
pSTM32F103C8这里选择你的芯片型号

在这里插入图片描述

(2)然后是Debug的一些窗口,按照这个教程打开如下四个窗口:
C站:KEIL5中Debug调试

在这里插入图片描述

debug过程

查看当前卡死位置

(1)首先程序全速跑,复现一次bug,然后停止调试。之后在上方的Disassembly中右键,点击图中所示信息。

在这里插入图片描述

(2)看一下左侧的RegistersPC指针,看一下当前是卡死在哪个位置。

在这里插入图片描述

(3)最终发现是卡死在portmacro.h文件中的vPortRaiseBASEPRI()函数,portmacro.h不是我们编写的程序,所以似乎这并不是有效的信息。

在这里插入图片描述

查看调用卡死函数的位置

(1)一般程序卡死,大概率不是卡死位置出现故障,很可能是函数A在调用卡死函数B时候,存在错误操作。因此,此时我们就需要看LR寄存器。LR寄存器存放程序的返回地址,用通俗一点的话来说,就是我们C语言调用return的时候,就会根据LR寄存器进行跳转。
(2)通过LR寄存器我们可以发现,我们似乎是调用了xQueueGenericSend()函数,然后才导致的程序卡死。
(3)熟悉FreeRTOS的朋友应该很快就能够意识到问题所在,xQueueGenericSend()不就是一个队列函数吗?那么,我们是不是可以推断出,是哪个函数调用了队列函数,那么这个很可能就是问题所在。

在这里插入图片描述

栈回溯

(1)既然有了思路,那么我们就需要找到当前卡死时候,函数的调用关系,然后知道被调用函数中,哪个任务会调用和队列相关的函数。那个就说问题所在。
(2)这个时候就需要涉及到栈回溯的相关知识了,因为这部分知识有一定的门槛,所以我不会进行介绍。
(如果想要学习了解的,可以看看韦东山老师的90天RTOS双架构双系统项目实战班的5-1-8栈回溯原理
(3)程序卡死的时候,我们可以通过栈知道程序的调用关系。在KeilDebug工具中,有一个Call Stack的工具能够看到被调用过的函数。
(4)通过上面分析,我们知道程序vPortRaiseBASEPRI()xQueueGenericSend()这两个函数大概率不是问题所在,因为这两个是FreeRTOS官方源码,出错概率微乎其微。
(5)然后我们就可以看看HAL_GPIO_EXTI_Callback()函数,大概率是这个函数导致的bug。按照下图方式可以快速定位到HAL_GPIO_EXTI_Callback()函数位置。
(6)如果status = xQueueSendToFront(KeilQueueHandle, &Buf, 0);被顺利执行,那么就会跳转到if (status == pdTRUE)中,此时我们利用FreeRTOS的知识可以知道,中断中必须使用FromISR后缀的函数。因此,我们可以推断出问题是在这里了。

在这里插入图片描述

总结

(1)栈回溯的一个很好的技巧,我们应当了解和掌握.在一些大型项目中,很少使用keil开发,所以掌握栈回溯的原理非常重要。
(2)可是,因为他的门槛过高,所以我个人建议先从keil开始,熟悉栈回溯的使用,饭要一口一口的吃,步要一步一步的走。

参考

(1)C站:STM32 触发HardFault_Handler如何查找原因
(2)C站:hardfault问题分析解决及记一次ucosIII环境下的hardfault解决
(3)C站:KEIL5中Debug调试
(4)CM3权威指南

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

支付宝支付-SpringBoot基于沙箱环境实现支付宝支付

目录 一、支付宝沙箱环境介绍 二、沙箱环境准备 2.1 注册入驻支付宝开放平台 2.2 配置沙箱环境 2.3 沙箱应用 三、SpringBoot 结合 支付宝沙箱 3.1 pom.xml 3.2 application.yml 3.3 对应的配置类 3.4 支付接口,和支付的回调接口 3.5 支付页面 apy.html 3…

做好智慧校园的顶层设计,助力教育信息化发展

教育信息化已被视为我国教育事业发展的重要支撑。随着国家教育信息化一系列重大工程的部署和实施,我国教育信息化进入快速发展时期,取得了显著成绩。我们认识到国家教育信息化正由初步应用融合阶段向着全面融合创新阶段过度,无论从国家地区的…

炫酷网页设计:HTML5 + CSS3打造8种心形特效

你以为520过去了,你就逃过一劫了?那不是还有分手呢,那不是还得再找对象呢,那不是还有七夕节呢,那不是还有纪念日呢,那不是还有各种各样的节日呢,所以呀,这8种HTML5 CSS3打造8种心形…

Java.lang.InterruptedException被中止异常解决方案

大家好!我是咕噜铁蛋!在Java编程的世界里,java.lang.InterruptedException是一个常见的异常,尤其是在处理多线程和并发任务时。这个异常通常表示一个线程在等待、休眠或其他占用时间不长的操作时被中断。作为一个资深的Java开发者…

Timeline

SignalTrack信号轨道和自定义带参数的Marker信号和轨道 MySignalReceiver using System; using System.ComponentModel; using UnityEngine.Playables; using UnityEngine.Events;namespace UnityEngine.Timeline { public class BaseSignalReceiver<T, Q> : MonoBeha…

04-Vue:ref获取页面节点--很简单

目录 前言在Vue中&#xff0c;通过 ref 属性获取DOM元素使用 ref 属性获取整个子组件&#xff08;父组件调用子组件的方法&#xff09; 前言 我们接着上一篇文章 03-02-Vue组件之间的传值 来讲。 下一篇文章 05-Vue路由 在Vue中&#xff0c;通过 ref 属性获取DOM元素 我们当然…

CTFHUB技能树——SSRF(三)

目录 URL Bypass 数字IP Bypass 302跳转 Bypass DNS重绑定 Bypass SSRF绕过方法&#xff1a; &#xff08;1&#xff09; http://abc.com127.0.0.1 &#xff08;2&#xff09;添加端口号 http://127.0.0.1:8080 &#xff08;3&#xff09;短地址 htt…

LabVIEW和ZigBee无线温湿度监测

LabVIEW和ZigBee无线温湿度监测 随着物联网技术的迅速发展&#xff0c;温湿度数据的远程无线监测在农业大棚、仓库和其他需环境控制的场所变得日益重要。开发了一种基于LabVIEW和ZigBee技术的多区域无线温湿度监测系统。系统通过DHT11传感器收集温湿度数据&#xff0c;利用Zig…

攻防世界-mobile-easy-app详解

序言 这道题网上很多分析&#xff0c;但是分析的都是arm版本的&#xff0c;我选了arm64的来分析&#xff0c;arm64相比arm难度高一些&#xff0c;因为arm64编译器搞了inline优化&#xff0c;看起来略抽象 分析 这道题逻辑很简单&#xff0c;输入flag然后一个check函数验证&a…

Python 造数据神器Faker

大家好&#xff0c;在编写代码过程中&#xff0c;我们经常需要一些假数据来进行测试或者演示。手动创建这些数据不仅耗时&#xff0c;而且容易出错。幸运的是&#xff0c;Python有一个非常有用的库叫做Faker&#xff0c;它可以生成各种类型的假数据&#xff0c;从名字、地址到公…

学习图形推理

学习图形推理 1.位置规律1.1平移1.2翻转、旋转2.样式规律2.1加减异同2.2黑白运算3.属性规律3.1对称性3.2曲直性3.3开闭性4.数量规律4.1面4.2线数量4.3笔画数4.4点数量4.5素数量5.空间重构5.1相对面5.2相邻面-公共边5.3相邻面-公共点5.4相邻面-画边法题型 一组图:从左往右找规律…

在代码中集成sentry项目

创建团队和项目 选择项目进入设置 选择错误跟踪选择对应的项目类型 根据配置和测试信息配置sentry项目到代码中并测试

如何用VSCode debug Python文件

诸神缄默不语-个人CSDN博文目录 需求&#xff1a;我其实一般都用print大法来“调试”程序&#xff0c;但是有时对于机械性比较强但是又有些复杂的程序&#xff0c;还是debug比较方便。 debug功能我之前用过NetBeans和eclipse&#xff0c;应该可以明显看出来我是Java转Python党…

虚拟ECU:彻底改变汽车软件开发与测试

汽车开发领域有着垂直性较强的一系列需求&#xff0c;其中最为瞩目的需求之一就是对安全高效的软件测试方法的需求。传统的汽车开发偏向使用硬件原型与真实ECU进行软件测试&#xff0c;但由于硬件设备往往在开发周期的中后阶段才生产完成&#xff0c;给汽车开发带来了成本与时间…

微软刚发布的Copilot+PC为什么让Intel和AMD尴尬?2024 AI PC元年——产业布局及前景展望

美国东部时间5月20日在微软位于华盛顿的新园区举行的发布会上&#xff0c;宣布将旗下AI助手Copilot全面融入Windows系统&#xff0c;能够在不调用云数据中心的情况下处理更多人工智能任务。 “将世界作为一个提示词就从Windows系统开始”。微软的新PC将是“CopilotPC”&#xf…

【SQL】外连接 LEFT JOIN

目录 一.内连接与外连接 1.内连接&#xff08;inner join&#xff09; 2.外连接&#xff08;outer join&#xff09; 二.两表连接 1.我们先来试试看内连接&#xff1a; 2.我们再来试试外连接 三.单表外连接 四.总结 一.内连接与外连接 先得介绍内连接和外连接两个概念&…

esp32(8266)如何在platformio中上传文件到单片机

本来认为这是基础内容&#xff0c;不用我来介绍&#xff0c;结果&#xff0c;在个人的单片机字库开源项目 GitHub - StarCompute/tftziku: 这是一个通过单片机在各种屏幕上显示中文的解决方案 中有两个人问到了&#xff0c;就特别来说明一下&#xff1a; 在platformio中新建一…

音视频开发7 音视频转换格式流程

先看条转换视频文件的命令 我们的目的是将 源文件 source_1920x1080.mp4 转换成 目标文件 dest_1280x720.flv ffmpeg -i source_1920x1080.mp4 -acodec copy -vcodec libx264 -s 1280x720 dest_1280x720.flv -acodec copy 的意思是&#xff0c;目标的 音频格式 使用和 源文…

vue 引入 emoji 表情包

vue 引入 emoji 表情包 一、安装二、组件内使用 一、安装 npm install --save emoji-mart-vue二、组件内使用 import { Picker } from "emoji-mart-vue"; //引入组件<picker :include"[people,Smileys]" :showSearch"false" :showPreview&q…

操作系统中的内存管理

虚拟内存 操作系统会提供一种机制&#xff0c;将不同进程的虚拟地址和不同内存的物理地址映射起来。如果程序要访问虚拟地址的时候&#xff0c;由操作系统转换成不同的物理地址&#xff0c;这样不同的进程运行的时候&#xff0c;写入的是不同的物理地址&#xff0c;这样就不会冲…