ARM Cortex-M底层技术(十四)KEIL MDK 调试技术-1 【调试技术简介】
ARM Cortex-M底层技术(十四)KEIL MDK 调试技术-1 【调试技术简介】
最近懒癌上身,N久都没有写东西了,我对不起祖国,对不起党,刚好赶在十一,祖国都69(注意是岁数不是姿势……)了,我实在不好意思再偷懒了,行了,不瞎BB了,进入正题,承接之前~,其实关于分散加载还有一些东西木有说清楚,煮药是分散加载的点太碎,也木有在事先构建好一个体系,所以呢可能说的有点乱,以后我再想想把分散加载的一些东西做一个“拾遗”吧(其实是人懒,不想写了~~~~~,写两篇爽了就撤了……,以后哪天责任感上头的时候再补吧)。
先看一个总视图
相信大家都是有基础滴,最基本的东西我就不废话了,很多初级选手做ARM Cortex-M调试基本都停留再使用上图5界面里面打断点看变量的老套路里面,当然这是最通用的调试技术,但对于我们这些有追求的小伙儿们这样的粗陋手段显然是不够高效的,接下来的几篇文章我们将以Keil为蓝本,深入调试技术的内部,掌握更深层次的调试技术,本篇先进行简单介绍。
调试视图(简的不能再简)简介
(1)Logic Analyzer窗口,虚拟逻辑分析仪,跟真实的逻辑分析仪功能一样,可以看到变量或外设的值的变化趋势。
(2)System Analyzer窗口,可以看到系统能耗;
(3)Performance Analyzer窗口,分析工程内,每个函数执行所占用的时间以及CPU占用率
(4) 操作系统相关的事件记录等功能,关联操作系统,需要专门插件才能执行,后文再介绍(看缘分了~)
- 核心寄存器试图,你所用的MCU的内核最核心的寄存器的信息都在这里,这个是最重要的调试信息,但很多人其实调试的时候根本不看这些核心寄存器。举例来说,这些寄存器组可以提供的几个常用功能:一是,当芯片发生硬件错误的时候也就是进入HardFault-Handler()函数的时候(如果你都没有注意过这个,真得好好补补课了),通过这些寄存器组可以迅速定位到出错的程序的位置,精确到具体哪一行,无须你在界面5里面打断点自己慢慢找;二是,可以直观的看到函数的入口参数,程序跑飞的时候60%以上的问题是由指针的错误使用造成的,而函数入口没把好关就是一个重要的错误来源,你可以通过这些通用寄存器方便的看到函数入口参数,如果其中有空指针/野指针可以马上发现;三是,堆栈溢出,这类错误往往比较隐蔽,表象是程序经常不在同一个函数体里面跑飞或者崩溃,有时甚至看起来无规律的,但这类错误可以通过核心寄存器组快速发现;四是,一些数学运算的错误,比如除0错误,进位/借位错误,溢出错误等,直接可以发现;当然其他还有很多,这里不一一介绍了。
- 这里因为没有办法把Keil所有的功能都截图下来,只截图了一个反汇编窗口,其实这类功能性窗口还有n多,反汇编想必大家都知道是啥了,不多废话了;下面看一下其他几个常用的:
- 命令窗口,Keil支持很多的调试命令,作为断点调试的强有力补充手段,比如用于显示特定Memory的Display命令/用于显示当先Symbol的dir命令/用于调用逻辑分析仪的LA命令/用于下一些特殊断点的BreakSet命令等,大概30-40个左右,这些命令的功能实际上非常强大,之后的博客里面我们会慢慢说到。
- Call Stack and locals窗口:显示当前堆栈里面的元素,实际也是很有用的一个窗口,可以看到当前堆栈内部情况尤其可以看出函数的调用关系,这点用处不小,后面博文慢慢细说;
- 其他窗口,实在不知道该咋简介了,如Memory窗口/Symbols窗口等,也都是非常常用的辅助调试窗口,后面博文都会慢慢讲到,不过这两个窗口的功能比较常用,估计大多数人都用过,就不简介了~;
其他乱七八糟调试技术的碎碎念:
SHELL:其实Shell是一种很高效的辅助调试方式,Linux常用的调试技巧,只是再嵌入式MCU里面不是很常用,小编我在很久很久以前写过一个简单的Shell,运行效果如下(当然建议大家找个更靠谱的Shell或者自己写一个),还蛮好用的(写的时候充分考虑了可移植性),在不方便连接调试器的时候或者产品定性后,修改参数或者快速定位故障很有用。后文再慢慢唠吧……
软仿真:其实软仿真单独自己的功能不是很实用,但是Keil为软仿真提供了仿真函数、信号函数、虚拟串口等机制来辅助进行功能仿真,有时比外部硬件还要好用。
JLINK附属辅助调试软件:JLINK有很多附属的辅助调试软件,很好用,如下图,后面的博文也会有专门介绍。
哎,一口气给自己挖了这么多坑,以后有的写了~…………………………,具体见以后博文吧~