keil调试专题篇
迪丽瓦拉
2025-06-01 21:59:07
0

调试的前提是需要连接调试器比如STLINK。

然后点击菜单或者快捷图标均可进入调试模式。

如果前面工程配置里选择了复位调试,则进入调试后,会停在main函数头部

示意:

 

相关指令

上面一行红框内,从左到右分别是:打断点(断点最多只能打7个)、失能单个断点、失能所有断点、取消所有断点。

下面一行红框内,从左到右:

复位(Reset):对程序进行复位操作,根据烧录器不同的复位方式配置会触发不同的复位类型。

全速运行(Run):使当前程序开始正常全速运行,直到程序遇到断点时停止。

停止运行(Stop):当程序全速运行时,点击此按键可停止程序运行。点击停止时程序执行到哪了就停在哪。

单步调试(Step)F11:根据当前调试的窗口的语言,执行单条语句。如果遇到函数,则会进入函数内部。如果是在反汇编窗口中,则只执行一条汇编指令。

单步跳过调试(Step Over)F10:如果是在C语言窗口中,则是按单条语句执行,与单步调试不同的是,遇到函数不会进入函数内部,而是直接全速运行函数,并跳到下一条语句。

单步返回调试(Step Out):如果是在C语言窗口中,则是直接全速运行当前函数后面所有内容,直到函数返回上一级。

全速运行到光标所在行(Run to Cursor Line)

变量查看窗口——Watch1,Watch2

也可通过view菜单内对应子菜单选择。

Watch窗口如下:

 

通过选中一个变量,右键添加入对应的Watch窗口,可以追踪查看当前变量的变化状态。

注意,只有全局变量可以全程监视,临时变量只有在进入当前函数中才可监视到其数据,用static关键词修饰的变量无法监视。

如果当前变量没有实时更新,则需要点击"View->Periodic Window Update"将其勾选上。

在"Watch"窗口中,可以查看当前变量名称、值、数据类型,如果当前变量类型为结构体,则可以以对应的结构形式进行展开查看。

 

变量值默认是以十六进制来显示的,可以在变量名上右键,取消十六进制显示,则会以十进制进行显示。

内存查看窗口——Memory

通过"View->Memory Windows->Memory1/2/3/4"打开Memory窗口,也可以通过工具栏打开

 

在Memory窗口中输入想要查看内存的起始地址,另外右上角的锁可以把当前界面锁定下来,也就不能上下滚动了。

 

另外如果查看的是Ram的地址,那其中的数据也可以直接通过此窗口进行修改。

同样,右键可以选择以什么数据形式来显示。 

系统视窗——System Viewer Windows

可以在"Peripherals"选项栏中选择"System Viewer"系统视窗中对应的外设,选择"Core Peripherals"则是内核调试窗口。另外系统视窗也可以通过工具栏打开。

 

这个根据不同芯片会有不同的展示。

这个窗口用于查看当前单片机外设及内核寄存器的值,在调试外设底层时经常会使用到。

以GPIOA为例:

在这个窗口中可以直接修改外设寄存器的值,当然部分只读寄存器是无法修改的,有些则是需要在特定条件下才可以设置生效,具体就得看对应的芯片手册里寄存器的说明了。

调度关系窗口——Call Stack Window

可以在"View->Call Stack Window"打开此窗口,也可以在工具栏中打开。

 

这个窗口用于查看当前程序调度关系,当出现有进入硬件错误异常调试时可以快速定位到是哪里触发的异常。这个窗口的调度关系是从当前程序堆栈里获取的数据并将其图形化,所以如果当前堆栈数据被破坏,则此窗口也将无法查看调度关系。
该窗口里显示的调度关系是从下至上调用的,最上面的表示当前程序所处的函数。展开对应的函数,可以查看各层调用函数跳转之前保存的一些临时变量等信息。

寄存器窗口——Register Window

该窗口可在"View->Registers Window"处打开,也可以在工具栏打开。

 

这个窗口用于查看当前内核的相关寄存器,如汇编里常说的15个通用寄存器。当然调试中比较常用的是其中的SP、LR、PC三个寄存器。SP为当前栈的地址位置,PC为当前程序地址,LR为函数跳转前的地址,即当前函数返回的地址。

另外"Banked"中的MSP为当前程序系统主栈,PSP则为操作系统的任务栈,这两者的区别是,如果使用了操作系统,则当前任务中的所有调度关系使用的是任务栈,而类似中断这种内核的操作使用的是主栈;如果未使用操作系统,则只会使用主栈,不会使用任务栈。

 

通过"Internal"可以查看当前是处在中断还是任务中,Mode为"Thread"表示是在线程/任务中,或者是函数中(非中断),为"Handle"表示是在中断中;Privilege为"Privelege"表示当前处于特权模式。Stack为"PSP"表示当前使用的是任务栈,为"MSP"则表示使用的是主栈。

 

反汇编调试窗口——Disassembly Window

该窗口在"View->Disassembly Window"中可以打开,也可以在工具栏中打开。

 

该窗口是通过bin文件(即二进制文件)反汇编出来的汇编文件(汇编跟二进制原本就是一一对应的关系)。当设置了优化等级后,部分C语言的调试会变得困难(汇编跟C语言不是一一对应,而程序运行又是完全根据汇编来走的),此时可能需要使用汇编窗口进行调试。

函数地址表——Symbols Window

该窗口在"View->Symbols Window"中打开,也可能在工具栏打开。

可以查看当前所有程序的函数调用关系及其所在地址。 

其他窗口

命令窗口——Command Window

该窗口在"View->Command Window"中可以打开,也可能在工具栏中打开。

这个窗口可用来输入一些控制命令。  

串口调试窗口——Serial Windows

该窗口在"View->Serial Windows"中打开,也可以在工具栏打开。

暂略。

逻辑分析窗口——Analysis Windows

这个貌似只能在软件模拟仿真中使用。 

跟踪窗口——Trace Windows

 

暂略。

更多总结

直接参考:

【工具使用】Keil5软件使用-进阶调试篇_keil5调试_知识噬元兽的博客-CSDN博客

注意事项

待补充。

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...