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

news2024/11/24 11:04:57

前言

(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权威指南

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

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

相关文章

山脉数组的峰顶索引 ---- 二分查找

题目链接 题目: 分析: 我们很明显, 可以从峰值位置将数组分成两段, 具有"二段性", 所以可以用二分查找因为arr是山峰数组, 不存在相等的情况如果arr[mid] > arr[mid 1], 说明mid的位置可能是峰值, 移动right mid如果arr[mid] < arr[mid 1], 说明mid的位置…

Java基础之异常(简单易懂)

异常 1.JAVA异常体系 &#xff08;1&#xff09;Throwable类(表示可抛)是所有异常和错误的超类&#xff0c;两个直接子类为Error和Exception,分别表示错误和异常;其中异常类Exception又分为运行时异常和非运行时异常&#xff0c;这两个异常有很大区别&#xff0c;运行时异常也…

【分享笔记】符尧:预训练、指令微调、对齐、专业化——论大语言模型能力的来源

分享时间&#xff1a;2023.2 目录 模型家族scaling law和涌现能力模型不同阶段pretrainingintruction tuningalignment upper bound和lower bound 模型家族 看模型要从演化家族来看&#xff0c;而不能单独看&#xff0c;很多人认为一些能力并不是RLHF激发出来的&#xff0c;而…

【区块链】智能合约漏洞测试

打开Ganache vscode打开智能合约漏洞工程 合约内容 pragma solidity >0.8.3;contract EtherStore {mapping(address > uint) public balances;function deposit() public payable {balances[msg.sender] msg.value;emit Balance(balances[msg.sender]);}function with…

前端工程化07-常见的包管理工具npm、yarn、cnpm、npx、pnpm

8、包管理工具 8.1、包管理工具概述 npm包管理工具、在安装node的时候这个东西就已经安装过了&#xff0c;通过npm去管理包的时候这个时候回有一个配置文件叫做package.json,他是以json的方式来书写对应的一个配置文件&#xff0c;这个配置文件是可以添加特别多的一些字段的&…

d3dx9_41.dll是个什么东西?d3dx9_41.dll文件丢失的解决方法

随着软件技术的不断发展&#xff0c;电脑用户可能会遇到各种系统错误和问题&#xff0c;其中之一就是动态链接库&#xff08;DLL&#xff09;文件的丢失。d3dx9_41.dll文件丢失是一个常见的问题&#xff0c;它通常会在运行依赖于DirectX图形技术的游戏或应用程序时被报告。这个…

MySQL中如何知道数据库表中所有表的字段的排序规则是什么?

查看所有表的字段及其排序规则&#xff1a; 你可以查询 information_schema 数据库中的 COLUMNS 表&#xff0c;来获取所有表的字段及其排序规则。以下是一个示例查询&#xff1a; SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, COLLATION_NAME FROM information_schema.COL…

影视解说5.0版零基础视频课程

课程简介 现在还能做解说吗、不会写解说文案怎么解决、不会配音怎么解决、如何找到合适的素材资源、如何变现…这是很多想做解说的伙伴最关心的几大问题。比如文案&#xff0c;我们推荐一个网站&#xff0c;10分钟搞定一篇文案&#xff0c;配音可以真人配音也可以软件配音。5.…

Windows11的这个地方暴露着你的隐私,把它关掉避免尴尬

前言 现在的电脑真的是越来越智能化&#xff01;现在有很多小伙伴都是用着Windows11的吧&#xff01;用习惯了Windows11之后&#xff0c;突然发现它还是挺顺手的。 但不知道你有没有发现&#xff0c;Windows11上面有个地方暴露着你的隐私。这个隐私可能是某个小姐姐的图片&am…

Android 12系统源码_多窗口模式(二)系统实现分屏的功能原理

前言 上一篇我们具体分析了系统处于多窗口模式下&#xff0c;Android应用和多窗口模式相关方法的调用顺序&#xff0c;对于应用如何适配多窗口模式有了一个初步的认识&#xff0c;本篇文章我们将会结合Android12系统源码&#xff0c;具体来梳理一下系统是如何触发多窗口分屏模…

StringMVC

目录 一&#xff0c;MVC定义 二&#xff0c;SpringMVC的基本使用 2.1建立连接 - RequestMapping("/...") ​编辑 2.2请求 1.传递单个参数 2.传递多个参数 3.传递对象 4.参数重命名 5.传递数组 6. 传递集合 7.传递JSON数据 8. 获取url中数据 9. 传递文…

mysql实战——异步复制(gtid复制)

一、搭建前准备 主库 192.168.1.76 从库 192.168.1.78 二、搭建 1、编辑配置文件 主库 server-id76 gtid_modeon enforce_gtid_consistencyon log_binmaster-binlog log-slave-updates1 binlog_formatrow 从库 gtid_modeon enforce_gtid_consistencyon server_id7…

huggingface笔记:LLama 2

1 前提tip 1.1 使用什么数据类型训练模型&#xff1f; Llama2模型是使用bfloat16训练的 上传到Hub的检查点使用torch_dtype float16&#xff0c;这将通过AutoModel API将检查点从torch.float32转换为torch.float16。在线权重的数据类型通常无关紧要&#xff0c;这是因为模型…

基于springboot+vue+Mysql的校园台球厅人员与设备管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

在docker中运行SLAM十四讲程序

《十四讲》的示例程序依赖比较多&#xff0c;而且系统有点旧。可以在容器中运行。 拉取镜像 docker pull ddhogan/slambook:v0.1这个docker对应的github&#xff1a;HomeLH/slambook2-docker 拉下来之后&#xff0c;假如是Windows系统&#xff0c;需要使用XLaunch用于提供X11…

Playwright 隐藏浏览器指纹特征:注入stealth.min.js

引言 浏览器指纹技术通过分析用户的浏览器和操作系统信息来识别用户&#xff0c;这包括浏览器类型、版本、插件、屏幕分辨率等。在自动化测试和爬虫操作中&#xff0c;这些信息可能会暴露脚本的身份&#xff0c;导致被目标网站阻止。Playwright是一个跨浏览器的自动化库&#…

Spring Security整合Gitee第三方登录

文章目录 学习链接环境准备1. 搭建基本web应用引入依赖ThirdApp启动类创建index页面application.yml配置访问测试 2. 引入security引入依赖ProjectConfig访问测试 第三方认证简介注册gitee客户端实现1引入依赖application.yml配置文件创建index.html页面启动类InfoControllerPr…

html中table表格的行、列怎么进行合并

在HTML中&#xff0c;使用 <table> 元素来创建表格&#xff0c;而行&#xff08;tr&#xff09;和列&#xff08;td或th&#xff09;的合并可以通过 colspan和 rowspan 属性来实现。这两个属性允许单个表格单元格&#xff08;td或th&#xff09;跨越多个列或行。 colspa…

【FixBug】超级大Json转POJO失败

今天遇到了一个问题&#xff1a;使用Jackson将一个超级大的JSON字符串转换POJO失败&#xff0c;debug看没问题&#xff0c;将JSON字符串粘贴到main方法中测试&#xff0c;提示错误信息如下&#xff1a; 自己猜测是因为字符串超长导致转换时先截断字符串导致JSON格式不正确&…

QT5.15.2及以上版本安装

更新时间&#xff1a;2024-05-20 安装qt5.15以上版本 系统&#xff1a;ubuntu20.04.06 本文安装&#xff1a;linux-5.15.2 下载安装 # 安装编译套件g sudo apt-get install build-essential #安装OpenGL sudo apt-get install libgl1-mesa-dev# 下载qt安装器 https://downl…