在嵌入式软件开发过程中,不可避免的会出现很多的 BUG,比如串口通信异常、定时器无法输出脉冲、IO 口无法输出、无法进入中断等等问题,导致这些问题的原因可能不仅仅只是某一个方面,也可能是综合的,可能是软件设计上的问题,也可能是硬件上的,如何锁定问题就成了关键。
学习 51 的时候,可能会采用 LED 灯、数码管、LCD 屏等方式进行辅助调试(关于这个【看不会 printf 怎么打印红外遥控数据?】),也可能会使用类似 printf 函数的方式将数据打印至串口调试助手调试,但无一例外的是,这些方法都要在合适的地方插入合适的代码才行,而且还有可能因为插入了这些调试代码而导致本来没有问题的程序出现了问题,这都是有可能的。
51 开发的时候没有办法,硬件仿真调试功能太弱,只能采用这些方式,但如果说你在进行 STM32 开发时还在使用这些方法,那真的是守着莫大财富而不自知了。
现在简单理解一下 STM32 仿真调试的原理是什么。我们知道程序的运行主要依靠 CPU 还有各种外设,这就相当于一个人在工作,除了需要你的大脑(CPU)外,还需要你的手、脚、躯干等部分协调配合才能将一件事完成,否则光有强大的大脑(CPU)是不行的。
那么调试功能又是怎么怎么一回事呢?它就像是你的同伴,当你在工作的时候,他会实时记录你的工作信息,当别人(调试者)需要知道你的工作情况还有工作细节的时候,由你的同伴告知就行了,这样就能在不耽误你(CPU)正常工作的前提下,又能知道你在干什么。你的同伴拥有以下功能或权限:
1、实时记录你的工作过程,把你工作时的所思所想都记录下来(注意这种记录是实时的,只保留当前的信息,之前的信息会被当前信息覆盖,所以如果你需要记录所有的信息的话,需要把它打印出来才行)。
2、控制你的工作流程,比如暂停你的工作,工作到什么地方的时候让你停下来等等类似功能,但是不能更改你的工作顺序和工作内容(这点很重要)。
STM32 调试过程中最常用的的就是利用 Watch 窗口查看变量的值,比如像这样:
你可以看到通过这个窗口,你可以查看 USART1 外设寄存器的值,也可以查看用户变量 num 的值,这样你就能实时的观察变量的变化,从而知道哪里有问题了。
还有很多时候我们需要看别人的代码,比如学长的代码,公司以前项目的代码,如果有相关文档和注释的话还好说,但是这些都没有的话,想要快速理解一个人的想法是很困难的事情。比如说一个变量变化了,那它是在哪个位置变化了?这个变量又在哪里被使用了?这些都是在看别人代码的时候经常会遇到的情况。常用的方法是用搜索功能搜索这个变量名,这样就就能把这个变量的所有出现的位置找出来,但是这里有一个问题,如果这个变量用的非常频繁,有的地方可能只运行一次就不再运行了,有的地方可能需要满足一定的条件才会运行,而有的地方可能会一直执行,这些情况怎么办?都打上断点吗?这确实是一种方法,但是接下来的系列文章将介绍一种更高效的方法,开启你不一样的调试之旅。
根据鱼鹰多年的嵌入式开发经验,把这个系列的文章分为三个部分,基础部分的内容相信大家或多或少的都了解过,但第二部分和第三部分的内容(第三部分其实已经发布了,就是 ITM)却很少人知道,比你盲目的调试和使用 printf 函数打印数据强的多,而且更加方便高效,相信当你掌握了这些调试方法后,你会爱上它的。
更多精彩,欢迎关注公众号:鱼鹰谈单片机