【工具使用】Keil5软件使用-进阶调试篇

article/2025/11/5 8:03:44

一、概述

    本文面向已经懂得软件基本操作的职业老手,如果是未使用过该软件的小鲜肉,请移步基础篇。这里以STM32芯片为例对工具进行讲解,其他品牌的芯片在调试方面上可能存在差异。

二、软件说明

    Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。
    目前软件对中文的支持不友好,不建议安装网上的一些汉化包之类的。另外建立的工程文件路径也尽量不要存在中文,否则可能会出现一些异常。
演示版本:5.24a

三、软件使用

3.1 基本调试操作

    首先点击"Debug->Start/Stop Debug Session"或下图2位置,进入调试。
在这里插入图片描述
    如果前面工程配置里选择了复位调试,则进入调试后,会停在main函数头部
在这里插入图片描述

    复位(Reset):对程序进行复位操作,根据烧录器不同的复位方式配置会触发不同的复位类型。
在这里插入图片描述

    全速运行(Run):使当前程序开始正常全速运行,直到程序遇到断点时停止。
在这里插入图片描述
    停止运行(Stop):当程序全速运行时,点击此按键可停止程序运行,停的是当前点击时的程序运行位置。
在这里插入图片描述

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

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

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

    插入/移除断点:如果当前光标所在行未有断点,则插入断点(前提是当前行可以插入,如果无法插入会显示一个感叹号),在有断点的情况下则是移除断点。插入断点后,当前行前面会有个红圆表示断点位置。也可以通过直接点击红圆位置进行插入/移除断点的操作。另一种断点方式,是通过指令来控制,当然也可以使用Keil提供的界面化操作,设置某个变量读或写时触发断点。不过目前貌似有部分芯片不支持这种操作。注:断点最多只能打7个。
在这里插入图片描述

    使能/禁止断点:开启或禁止当前光标所在行的断点。禁止后红圆变成白圆。
在这里插入图片描述

    禁止所有断点:禁止当前所有的断点。
在这里插入图片描述

    删除所有断点:删除所有断点。
在这里插入图片描述

3.1 调试窗口

  • 变量查看窗口——Watch1,Watch2

    通过"View->Watch Windows->Watch1、Watch2"可以选择打开Watch窗口,也可以在工具栏在这里插入图片描述这里打开。再点击一次则可以关闭。

在这里插入图片描述

    通过选中一个变量,右键添加入对应的Watch窗口,可以追踪查看当前变量的变化状态。注意,只有全局变量可以全程监视,临时变量只有在进入当前函数中才可监视到其数据,用static关键词修饰的变量无法监视。
在这里插入图片描述

    如果当前变量没有实时更新,则需要点击"View->Periodic Window Update"将其勾选上。
在这里插入图片描述
    在"Watch"窗口中,可以查看当前变量名称、值、数据类型,如果当前变量类型为结构体,则可以以对应的结构形式进行展开查看。
在这里插入图片描述

  • 内存查看窗口——Memory

    通过"View->Memory Windows->Memory1/2/3/4"打开Memory窗口,也可以通过工具栏Memory窗口
这个图标打开。打开的状态下再按一次则可关闭。

在这里插入图片描述
    在Memory窗口中输入想要查看内存的起始地址,另外右上角的锁可以把当前界面锁定下来。
在这里插入图片描述
    另外如果查看的是Ram的地址,那其中的数据也可以直接通过此窗口进行修改。
在这里插入图片描述

  • 系统视窗——System Viewer Windows(这个根据不同芯片会有不同的展示)

    可以在"Peripherals"选项栏中选择"System Viewer"系统视窗中对应的外设,选择"Core Peripherals"则是内核调试窗口。另外系统视窗也可以通过工具栏中在这里插入图片描述这个位置可以打开。
    这个窗口用于查看当前单片机外设及内核寄存器的值,在调试外设底层时经常会使用到。
    在这个窗口中可以直接修改外设寄存器的值,当然部分只读寄存器是无法修改的,有些则是需要在特定条件下才可以设置生效,具体就得看对应的芯片手册里寄存器的说明了。
在这里插入图片描述

  • 调度关系窗口——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语言不是一一对应,而程序运行又是完全根据汇编来走的),此时可能需要使用汇编窗口进行调试。

  • 命令窗口——Command Window

    该窗口在"View->Command Window"中可以打开,也可能在工具栏在这里插入图片描述这个位置打开。
在这里插入图片描述
    这个窗口可用来输入一些控制命令,比如保存输出当前内存地址等。在命令窗口中输入如下导出指令,按下回车即可导出数据

save filename startAddr,endAddr

filename:导出数据的文件名,无论后缀是什么,导出的格式都是十六进制文件。没有输入路径时,文件自动保存在当前工程根目录下。
startAddr, endAddr:需要导出数据的起始地址和结束地址,也可以通过表达式写出来。

例如:

save ExportData.hex 0x08000000, 0x08000000+0x2000

  • 函数地址表——Symbols Window

    该窗口在"View->Symbols Window"中打开,也可能在工具栏在这里插入图片描述这个位置打开。
在这里插入图片描述

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

  • 串口调试窗口——Serial Windows

    该窗口在"View->Serial Windows"中打开,也可以在工具栏在这里插入图片描述这个位置打开。
在这里插入图片描述
暂未使用过,后续再添加。

  • 逻辑分析窗口——Analysis Windows

    该窗口在"View->Analysis Windows"中打开,也可以在工具栏在这里插入图片描述这个位置打开。
在这里插入图片描述
    这个貌似只能在软件模拟仿真中使用,如果使用硬件调试,需要硬件支持。

  • 跟踪窗口——Trace Windows

    该窗口可以在"View->Trace Windows"中打开,也可以在工具栏在这里插入图片描述这个位置打开。
暂时未使用过,后续再添加。

四、调试应用

  • HardFault(硬件错误)

    这个可以算是最常见的一个问题了,在开发过程中多多少少会遇到过程序死机的问题,而死机的大部分原因都是进入的HardFault中断,即常说的硬件错误中断。要想知道这个怎么调试,首先得清楚这是什么,怎么触发。
    触发原因:内存溢出,堆栈溢出,数组越界,中断错误,除0(在某些编译器下会有错误)等。前面三个,可以归结为都是内存异常操作导致,但因为其出现方式不一样,所以调试方式也不同。
    从现象反推,当出现这个错误时,第一时间查看函数的调度关系,看最后是死在哪个位置。如果不是堆栈溢出,一般来说是可以直接查到进入硬件错误前的最后执行的代码位置的。当然内存溢出跟数组越界也有可能导致无法查看调度关系,因为这个调度关系就是从程序运行栈里取出数据进行展示,所以当栈数据被破坏,则无法使用此方式进行调试。
    知道死机位置后(其实大概率就是因为某个异常指针的引用导致的问题),此时就去查找异常指针出现的原因。首先从逻辑层面看,异常指针是否是因为某个逻辑给指针赋了个错误值。
    其次是数据越界的角度来看,在Map文件中查找该指针的内存地址,查看其内存前后是否存在一些数组或结构体,然后去检查前后数组或结构体的操作是否存在下标溢出,指针偏移错误等问题。
    还有最后一种,就是直接从内存里获取数据作为指针地址进行引用,此类用法一般是在日志操作或GUI中比较常用,这种情况就要去内存数据来源是否存在问题。
    除以上三种可能性外,还有一种可能对一些人是涉及知识盲区的,就是引用地址没有地址对齐。这一部分是涉及内核的一些知识。这里简单讲下,对于M0内核,指针引用地址需要根据其引用的数据类型进行对齐。比如以下代码:

int main(void)
{uint32_t *p = 0x20000001;*p = 20;	/* 这句一执行就会导致异常 */
}

还有一种是操作指针本身的地址没有4字节对齐,也会出现问题。如下代码:

/* 实际这样子定义编译器会报错(在Keil中编译),这里只是为了直观表示 */
uint32_t *p __attribute__((at(0x20000001)));
int main(void)
{p = 0x20000010;	/* 这句一执行就会导致异常 */
}
  • 复位

    复位有几种类型,一是看门狗复位,二是软件复位,三是硬件复位。复位类型可以通过芯片自带的复位寄存器进行查看。不过查看前需要手动清除所有复位标志,不然其复位标志会一直保留着。
    先讲下看门狗复位,当单片机开启看门狗后,很多问题都会变成复位问题,比如上面说的HardFault,因为HardFault也是一个中断,只是默认中断里是一个While(1)的死循环,所以当进入中断后,一段时间没有喂狗操作,就会触发复位。或者一些操作陷入死循环的,均是同理。这里我们把这一类问题都归为死循环问题。处理方式,先把看门狗关掉,然后调试看停在哪个死循环中,如果是HardFault,那就看上面硬件错误的处理方式。如果是其他死循环,那就看是什么条件触发的。死循环的问题相对来说比较好找。
    另外一种比较难处理的看门狗复位问题,莫过于某些操作时间过长,导致喂狗不及时。比如读写Flash时,通常会关闭中断,当大量读写时,其操作时间不可小靓,未开看门狗的情况下会有肉眼可见的程序卡顿,开了看门狗的情况下则通常会触发程序复位。这种类型的问题,通过关闭看门狗可能也无法定位到具体位置,因为程序还可以正常执行,只是在某些程序段会变得比较卡顿。对于这种问题,最好的方式是通过代码对比,通过对比原本没出问题的代码和出问题代码的差异性,锁定问题大体出现的位置,再通过程序执行时间进行估算。也可以借助一个独立的定时器,在一些时间操作较长的可疑之处计时。比如程序调用了某个底层未开源函数,那可以在调用前后打印定时器的计数,来计算函数运行的时间。当然也可以通过Keil自带的调试计数值来计算运行时间。
    软件复位就比较好找了,一般是需要人为调试内核的复位接口进行复位,所以只要查看是哪些位置触发的调用复位函数的条件就可以锁定问题点。
    硬件复位就只能从外围电路进行切入了,考虑干扰、连锡等问题。当然有些硬件复位是通过一个硬件看门狗进行复位的,如果是这种应用,那参考内部看门狗的问题排查方式。

  • 逻辑时序类调试

    时序类的用断点调试法就很难做到了,特别是那种时序要求很严格的。就比如Modbus通信,协议是规定了一帧数据中每两个字节间隔时间不能超过1.5字符。所以想要在一帧数据中,按一个字节一个字节断点调试从机是不可能的,主机不会给你休息的时间。这时候就必须得添加一些测试代码了,添加测试代码最重要的一个原则,是不能变更原本的功能。所以一般在数据流向的关键路径上添加一些监控变量,通过监控变量的变化来识别时序是否出现错误。
    另外也可以使用逻辑分析窗口,把对应的变量添加进窗口中,通过时间变化查看变量对应的变化关系,以此来判断逻辑时序是否正常。

  • 内存调试

    如果有涉及boot或日志记录功能的编写,那肯定会涉及大量内存的对比及调试,这时候可以利用上面提到的小技巧,在命令窗口那里输入save filename.hex StartAddr, EndAddr把对应的内存数据打印出来。

  • 底层外设调试

    这个打开对应外设的寄存器界面,对着芯片用户手册查看每个寄存器的功能进行调试,只有对寄存器功能熟悉了才有对应的调试手段。

五、注意事项

1、有时候在watch窗口中,变量值不会刷新,这时候就需要查看一下"View->Periodic Window Update"是否已勾选,如果没勾选,变量只有在第一次添加或停止调试时才会刷新。另外当窗口里一次性加载了一个很大的数组,当展开数组时,变量刷新也会变得很慢,并且软件会变卡顿。

2、当选择了非0级优化时,调试可能会变得困难,具体表现在断点调试。比如现在下面的代码,代码优化的关系,有可能把case0、1、2里的return 1都合并成一行,导致运行调试时,无论当前程序进入了哪个分支,使用断点时都只会进其中一个。所以当开启代码优化等级后,需要注意断点调试将变得不可信。另外优化编译后,有部分代码也将无法打断点(被优化的代码)。

switch (xx)
{case 0:{do_something0();return 1;}case 1:{do_something1();return 1;}case 2:{do_something2();return 1;}default:{return 0;}
}

此时应该去看汇编的实现,其执行顺序与汇编一致。

3、目前发现有部分工程在一些电脑上调试时,打断点后在删除断点之前退出调试,会导致Keil崩溃,只能结束进程重启。

4、当开启内部看门狗并且未打开调试关看门狗功能时,停止运行一段时间后会复位。

5、在全速运行时,有时打断点会无效,取消断点也无效,貌似是Keil本身的问题。

六、相关知识

    Keil5软件使用-基础使用篇、Keil5软件使用-进阶工程配置篇、Keil软件包-知识宝藏库


http://chatgpt.dhexx.cn/article/99cphURn.shtml

相关文章

Keil uVision5软件的操作与编写基础(入门)

目录 👬一、如何新建一个空白文档 👬二、程序编写 👬三、编译程序 Keil uVision5是一款编写单片机程序的必备软件。其图标为: 一、如何新建一个空白文档 1.打开Keil uVision5,将会出现工作界面。如图所示:…

WIN10系统安装visio2016失败后修改系统设置,安全

首先下载visio2016,地址我忘记了,自己可以找一下 其次下载破解包,在链接中 最后一定要关闭电脑管家,并且还要把系统自带的windows defender给关闭了,具体方式如下: 1 :

安装64位visio时提示已安装32位office的解决办法

安装visio2013时出现以下错误: 解决办法: 1.打开开始菜单,搜索regedit命令运行 2.在第一个大文件夹下找到installer文件夹。 3.打开products文件夹,在前几个文件夹中,找到如下图所示的文件,将整个文件夹删…

Win10系统下Visio安装失败问题

最近换Win10系统,想安装一个Visio2013,出现提示:安装失败,正在回滚更改,如下图所示: 上网百度,在visio贴吧找到解决方案:贴吧404; 在官网重新下载下最新版本的Microsoft…

win10 Visio软件运行 闪退

win10 Visio软件运行 闪退 win10 Visio软件运行 闪退 问题 系统:Win10 版本:Visio 2016 错误应用程序名称: VISIO.EXE,版本: 16.0.4266.1001,时间戳: 0x55ba18c8 错误模块名称: VISLIB.dll,版本: 16.0.4266.1001&a…

Win10解决Visio无法提供快速搜索结果

查阅很多解决方式,都是要去控制面板中的‘打开或关闭Windows 功能’-->‘勾选【Indexing Service】和【Windows Search】两个选项’,但是win10的打开或关闭windows功能中并没有找到这两个选项。 解决方法: 1.在索引选项中添加Visio Conte…

visio安装问题总结

visio安装存在哪些问题 先在学校下载正版visio后,然后直接进行安装,出现如下问题 再试了几次之后,同样的问题,看来确实有问题。一顿查询之后,发现然后这个问题普遍存在,似乎还蛮火的。 具体原理可以看微软…

Office与Visio同事安装兼容问题

Visio从office套件中剥离了出去,如果使用visio需要独立下载安装。但是如果电脑已经安装了office 2016,是无法再装上visio2016的,可以装visio的其他版本。强迫症患者表示很不情愿,终于在网上搜了一系列教程之后,自己总结…

visio 2013安装失败正在回滚

问题:一开始安装的2016年版本的,电脑一直提示已有32位和64位安装冲突。同学给我发了2013版本的visio。安装时出现了安装失败,正在回滚,报错1: 1935 2: (BBC00726- F9C9-4C83-B6F0-C85B2C695753] 3: 0x80131049 4:lAssemblyCachelt…

win10 visio 2019 搜索形状无匹配的解决办法

新办法:直接下载最新版本的visio 2019版本即可 ---------------------------我是分割线------------------------------------------------------ 最近安装了visio 2019发现搜索有问题 输入a b c啥的单个字母可以搜索 输入中文就扫不到 试了百度上的各种方法 什…

安装visio2016出现无法安装

解决方案(来自微软官网) 不同版本visio与Microsoft办公软件兼容说明

win10安装Visual Studio 2019失败

小僧最近电脑总安装不上Visual Studio 2019,最后终于装上了,是由于系统版本不兼容。 这里给出两个链接: VS官网:下载Visual Studio 2019社区版Visual Studio 2019 系统要求:查看VS 2019支持的系统 链接2中截图如下&a…

【经验】win11上安装visio

1、问题描述 在win11上安装一个visio2016时报错,提示:要安装即点即用版本的Visio,或者卸载已经安装的好的office。 安装时的步骤如下: 1)使用WinRAR打开visio安装文件ISO: 双击setup.exe 2)无…

Win10 安装Visio2016和Offic2016安装出现即点即用无法安装问题

环境: Win10 专业版 Visio2016专业增强版 Offic2016专业增强版 问题描述: 安装Visio2016和Offic2016安装出现即点即用无法安装问题 解决方案: 1.网上改xml文件(未解决) 2.全部卸载,重新下载Office_…

RNA-seq数据分析(HISAT2+featureCounts+StringTie)

RNA-seq数据分析 简介1 生物基础1.1 中心法则1.2 RNA-seq Protocol1.3 RNA-seq总的路线图 2 数据分析2.1 前期准备2.1.1 创建目录&安装conda2.1.2 常用文件格式简介 2.2 软件安装2.2.1 conda安装软件2.2.2 预编译版本软件安装2.2.3 源码安装 2.3 数据下载 下载完成之后一定…

【1】RNA-seq 测序数据之Hisat2比对-featurecount计算-EdgeR分析

一、 拿到​​​​​​​测序数据之后,首先选择参考基因组及比对工具进行比对 1、Hisat比对:(6个G的测序数据耗时20分钟,比对率78.4%)##物种差异度大导致比对率低 ##build index hisat2-build -p 4 Pyrus_bretschneide…

RNA-seq——上游分析练习(数据下载+hisat2+samtools+htseq-count)

步骤 0. 练习前准备1. 找到文章对应的数据集2. 下载数据集3. 与参考基因组进行比对4. reads计数5. 踩过的一点小坑 写在前面——之前使用的数据是单端测序,但是现在的数据基本都是双端测序。所以又找了个双端测序的例子来练习。之前在单端测序数据中,因为…

测序比对软件的总结----hisat2

hisat2的官网的manual: https://github.com/DaehwanKimLab/hisat2/blob/master/MANUAL 在这里记载了详细用法和介绍,此处仅为学习笔记,和实例记录。 HISAT2 is a fast and sensitive alignment program for mapping next-generation sequenc…

【bioinfo】hisat2/bowtie2比对结果summary文件解读

hisat2/bowtie2比对后,比对结果基本信息统计的summary文件解读。 参考: https://www.cnblogs.com/leezx/p/8540862.htmlseqanswers 论坛上的一个问答 使用seqanswers上的一个结果文件示例: 以及对应的回答: 整理该汇总文件中…

Hisat2 Bowtie2比对结果解读

Bowtie的中文意思是:领结,蝴蝶结 Bowtie2用户手册: http://bowtie-bio.sourceforge.net/bowtie2/manual.shtml 在看比对结果前需要了解三个概念: 1.Aligned concordantly 合理比对 主要和比对参数:–fr/–rf/–ff 有…