大家好,我是乔德先生。
这次我将分享一些调试嵌入式软件的经验和一些有用的工具。
需要说明的是,这不是一篇大师教你如何成为大师的文章,因为我还不是大师; 是一个普通嵌入式软件工程师从无经验到有一点经验的调试总结,非常基础。
我们常说软件要分三部分写,七部分协调写。 在实际开发中,确实是这样的。 我工作了好几年了,对此的体会也越来越深。 每当需求出现时,我可以很快地写出代码,但是调试需要花费大量时间。
这里需要明确的是,调试的目的不仅仅是为了调整整个功能需求。 调整功能是最基本的需求,还需要优化、逻辑完善、异常处理等。 所以,这需要很长时间。
我记得我毕业时参与的第一个项目。 该项目的硬件架构比普通产品更加复杂:
我负责的部分是D芯片的软件。 D芯片的作用与产品功能比较相似。 当时数据通过A发送,经过B、C,再到D,产品功能无法正常运行。 我当时的第一反应是我负责的D芯片逻辑可能有问题。
A、B、C均由经验相对丰富的工程师负责,C负责人为组长级别。 大家也觉得应该是我负责的D芯片的代码有问题,因为我是一个刚毕业的新人。 我觉得问题很大可能出在我身上。
他们没有检查这是否是他们的问题。 他们只是每天来看我是否发现问题。 我花了几天时间才终于找到它。 C芯片发给我的数据有问题~
由于当时缺乏调试经验,无法快速定位问题。 如果现在做的话,这种问题很快就能被发现。 因为现在我积累了一些经验:
调试经验
在正常的开发和调试过程中,可能会出现两种情况:
1. 自主开发
对于一些小项目,如果整个项目都是我们自己开发的话,调试起来会更容易。 因为是我们自己开发的,所以我们会比较熟悉。
我的习惯是模块化开发。 每个模块开发完成后,我首先想办法测试该模块。 如果没有问题的话,就集成到项目中去。 在模块的初始开发和测试期间,代码可以是任意的。 调整后,可以重新组织代码并集成到项目中。
自测方法:有些代码直接对应功能,可以直接测试看功能是否正常; 可以通过日志打印一些代码,看看是否正常; 有的可能需要在线调试看看是否符合预期; 有些需要数据输入。 是的,你可以自己模拟一些数据等等。
2. 协同开发
协同开发可能会比较麻烦。 特别是有时甚至需要跨部门调试。
我的习惯是:先开发并自测自己的模块; 然后模拟对方,简单自测一下通讯情况。
自测自己的模块的方式和上面独立开发一样。 当我们模拟对方进行测试时,我们需要考虑是否会花费更多的时间。 如果太花时间,算了,等到联调吧。
如果花的时间少,可以自测通讯。 可能有三种情况:
当然,协作开发不需要沟通自测,要看个人习惯。
我模拟了自测通信,以便对自己模块的通信有一定程度的控制。 当联调出现问题时,我可以很快指出对方的问题。 当然,这并不是为了推卸责任,而是为了更好地分析和解决联调问题。
例如,在我最近的项目中,设备连接到了手机APP。 APP局域网内的网络分配功能和设备通讯功能。 我负责设备端,充当服务端; 另一方充当客户。
在和对方联合调试之前,我已经写了一个客户端运行在PC或者设备上,模拟对方的手机APP,对我的模块进行了基本的自测,也测试了我的模块的一些问题。
那么在和对方正式联调的过程中,出现的问题大部分都是在对方这边,所以这个时候我就可以帮助对方分析问题,提高联调的效率。
上面我分享了一些我的经验和想法。 我们来看看一些具体的调试方法和工具:
调试方法1.LOG
在我的实际工作中,日志打印和调试已经解决了我的大部分问题。 对于一般问题,可以通过分析日志来定位问题。 不过,日志记录也需要很多关注,我们需要打印出有助于我们调试的信息。
例如:
带有时间戳、函数名、行号等可以帮助分析问题的信息。 例如:
[func:100]
当然,实际情况中,可能不仅仅包含上述信息,还可以根据需要进行添加。
这样,你就可以清楚地知道程序到达分支判断时的执行流程。
手术从哪里开始一目了然。
例如,在统一的日志格式中添加特定的标签,例如“BUSINESS”。 喜欢:
[BUSINESS][func:100]
因为业务逻辑一般是整个项目的最顶层,其他模块为它服务。
当我们查看日志时,可以在编辑器中搜索关键字“BUSINESS”,只列出与业务逻辑相关的日志。 我们只要看这些日志嵌入式系统软件教程,就可以大致知道程序的运行过程。
当然,也可以根据需要标记其他模块。
处理数据的模块可能需要打印一些数据来分析源数据是否正常。 您可以稍微控制打印频率,在不影响数据分析的情况下打印尽可能少的日志。
否则,某些日志文件很容易达到数百MB,使分析变得令人头疼。 特别是当需要将日志保存在flash上时,为了防止日志填满flash,往往需要限制日志文件的大小并进行滚动日志覆盖。 此时嵌入式系统软件教程,如果无效日志过多,则可能会覆盖有效日志。
之前有关日志调试的文章:
C语言和嵌入式中的几种非常实用的宏技术
无法修复bug?使用log方法
2、在线调试
在线调试可以让您看到程序运行的更多细节。 你应该了解基础知识。
GDB此前相关推文:
GDB调试器原来这么简单
一步一步教你如何使用VSCode + gdb + gdbserver调试ARM程序原创
3.其他调试工具
之前我们也分享过很多有用的调试相关工具:
(1)虚拟LCD
这是一个实用的液晶模拟器。 如果你手头没有LCD或者处于开发初期,需要经常下载程序来验证效果,可以使用VirtLCD来提高我们的开发调试效率。
VirtLCD介绍及简单使用:
手头没有 LCD,但急于开发 UI? 了解 LCD 模拟器
(2)Wireshark
Wireshark是一款网络数据包分析软件。 例如,当我们在调试socket通信时,可以使用Wireshark监控来查看自己是否发送了数据,或者是否收到了对方发送的数据。
wireshark介绍及简单使用:
详解wireshark抓包工具的使用
(3)VSPD
Virtual Serial Port Driver (VSPD) 是一个虚拟串口软件。 虚拟串口软件是模拟物理串口的软件。 它完全复制了硬件COM接口的功能,并且将被操作系统和串行应用程序识别为真正的端口。
编写串口上位机时,需要进行调试。 一种方式是与下位机通讯进行测试; 另一种方法是使用虚拟串口软件进行测试。
VSPD介绍及简单使用: