这次我将分享一些调试嵌入式软件的经验和一些有用的工具。
需要说明的是,这不是一篇大师教你如何成为大师的文章,因为我还不是大四的; 是一个普通嵌入式软件工程师从无经验到有一点经验的调试总结,非常基础。
我们常说软件要分三部分写,七部分协调写。 在实际开发中,确实是这样的。 工作了好几年了,对此的感触也越来越深。 每当需求出来时,我都能很快完成代码。 然而,调试需要花费大量时间。
这里需要明确的是,调试的目的不仅仅是为了调整整个功能需求。 功能调优是最基本的需求,还需要优化、逻辑完善、异常处理等。 因此,需要很长时间。
我记得我毕业时参与的第一个项目。 该项目的硬件架构比普通产品更加复杂:
我负责的部分是D芯片的软件。 D芯片的作用与产品功能类似。 当时数据通过A发送,经过B、C,再到D,产品功能无法正常运行。 我当时的第一反应是我负责的D芯片逻辑可能有问题。
A、B、C均由经验相对丰富的工程师负责,C的负责人仍为总监级别。 你也觉得问题应该出在我负责的D芯片的代码上,因为我是一个刚毕业的新人。 我认为这个问题更有可能是我的问题。
他们没有检查这是否是他们的问题。 他们每天晚上都来看看我是否发现了问题。 我花了几天时间才终于找到它。 C芯片发给我的数据有问题~
由于当时缺乏调试经验,无法快速定位问题。 如果是今天上位机软件调试程序,这些问题很快就能查出来。 感谢迄今为止积累的一些经验:
调试经验
在正常的开发和调试过程中,可能会出现两种情况:
1. 自主开发
对于一些小项目,如果整个项目都是我们自己开发的话,调试起来会更容易。 既然是我们自己开发的,我们就会更加熟悉。
我的习惯是模块化开发。 每个模块开发完成后,我首先想办法测试该模块。 如果没有问题的话,就集成到项目中去。 在模块的最初开发和测试期间,代码可以是随意的。 调整后,可以重新组织代码并集成到项目中。
自测方法:有些代码直接对应功能,可以直接测试看功能是否正常; 可以通过日志复制一些代码,看看是否正常; 有的可能需要在线调试看看是否符合预期; 有些需要数据输入。 是的,你可以自己模拟一些数据等等。
2. 协同开发
协同开发可能会比较麻烦。 特别是有时甚至需要跨部门调试。
我的习惯是:先开发并自测自己的模块; 然后模拟对方,简单自测一下通讯情况。
自测自己模块的方法与之前独立开发时相同。 当我们模拟对方进行测试时,我们需要考虑是否需要更多的时间。 如果太花时间,算了,等到联调吧。
如果花的时间少,可以自测通讯。 可能有三种情况:
其实协同开发并不需要沟通的自测,而是取决于个人的习惯。
我模拟了自测通信,以便对自己模块的通信有一定程度的控制。 当联调出现问题时,我可以快速突出对方的问题。 其实这并不是为了推责,而是为了更好地分析解决联调问题。
比如我最近的项目中,设备是连接到手机APP的。 APP局域网内的网络分配功能和设备通讯功能。 我负责设备端,充当服务端; 另一方充当客户。
在和对方联合调试之前,我已经写了一个客户端运行在PC或者设备上,模拟对方的手机APP,对我的模块进行了基本的自测,也检测到了我的模块的一些问题。
后来我们准备和对方联调的时候,出现的问题大部分都是在对方这边,所以这个时候我就可以帮助对方分析问题,提高联调的效率。
我分享了我的一些经验和想法。 我们来看看一些具体的调试方法和工具:
调试方法一、LOG
在我的实际工作中,日志拷贝调试已经解决了我的大部分问题。 对于常见问题,可以通过分析日志来定位问题。 而且,对于日志记录有很多要求,我们需要复制出有助于我们调试的信息。
例如:
带有时间戳、函数名、行号等可以帮助分析问题的信息。 例如:
[func:100]
事实上,在实际应用中,可能不仅包含上述信息,还可以根据需要进行添加。
这样就可以清楚地了解程序转到分支判断时的执行流程。
您可以清楚地知道操作从哪里开始。
例如,在统一的日志格式中添加特定的标签,例如“BUSINESS”。 喜欢:
[BUSINESS][func:100]
由于业务逻辑通常是整个项目的最低级别,其他模块为其服务。
当我们查看日志时,可以在编辑器中搜索关键字“BUSINESS”,只列出与业务逻辑相关的日志。 我们只要看那些日志,就可以大致了解程序的运行过程。
事实上,其他模块也可以根据需要进行标记。
处理数据的模块可能需要复制一些数据来分析源数据是否正常。 您可以稍微控制复制的频率,在不影响数据分析的情况下复制尽可能少的日志。
否则,某些日志文件很容易达到数百 MB,从而难以分析。 特别是,当需要将日志保存在flash上时,为了防止日志填满flash,往往需要限制日志文件的大小并进行滚动日志覆盖。 此时,如果无效日志过多,则可能会覆盖有效日志。
之前有关日志调试的文章:
2、在线调试
在线调试可以让您看到程序运行的更多细节。 您应该能够完成基础工作。
GDB此前相关推文:
关于keil调试相关的内容,推荐阅读好友Osprey写的文章(公众号:Osprey谈单片机)。 这方面他研究得很深入。
3.其他调试工具
之前我们的公众号也分享过很多有用的调试相关工具:
(1)虚拟LCD
这是一个实用的液晶模拟器。 如果您手上还没有LCD或者处于开发初期,需要频繁下载程序来验证功效,可以使用VirtLCD来提高我们的开发调试效率。
VirtLCD介绍及简单使用:
(2)Wireshark
Wireshark是一款网络数据包分析软件。 例如,当我们在调试socket通信时,我们可以使用Wireshark来监控,看看我们是否发送了数据,或者是否收到了对方发送的数据。
wireshark介绍及简单使用:
(3)VSPD
VirtualSerialPortDriver (VSPD) 是一个虚拟并行端口软件。 虚拟并行端口软件是模拟化学串行端口的软件。 它完全复制了硬件 COM 端口的功能,并将被操作系统和串行应用程序识别为真正的端口。
在对并口上位机进行编程时,需要进行调试。 一种方法是与下位机通讯进行测试; 另一种方法是使用虚拟并口软件进行测试。
VSPD介绍及简单使用:
(4)LVGLGUI引导器
GUIGuider是NXP为LVGL开发的上位机GUI设计工具。 它可以通过拖动控件来设计LVGLGUI页面,加速GUI设计。
相关文章:
(5)Jlink+JScope
J-Scope是SEGGER推出的一款波形显示软件,简单易用。 需要配合Jlink仿真器(V9或V10)使用。
J-Scope简介及简单使用:
(6)SEGGER_RTT
RTT的全称是RealTimeTransmit(实时传输),由SEGGER推出上位机软件调试程序,是与Jlink仿真器(V9或V10)配合使用的一种调试方法。
SEGGER_RTT介绍及简单使用:
(7) 厘米回溯
CmBacktrace(CortexMicrocontrollerBacktrace)是一个开源库,用于ARM Cortex-M系列MCU的错误代码的手动跟踪和定位以及错误原因的手动分析。
CmBacktrace介绍及简单使用:
(8)沃法+
VOFA+(威士忌)插件驱动的高自由度主机。 它是一个通用的数据调试工具,使图形调试像并口调试一样简单。 数据可视化可以通过复制字符串或发送十六进制补码来完成。
官方网站:
VOFA+介绍及简单使用:
(9)QEMU
QEMU是一个著名的开源模拟器(官方网站:)。 它可以在X86PC上运行,模拟Arm、MIPS、RISC-V等各种CPU和开发板,以及网卡、声卡、键盘、sdcard、emmc、USB等类型外设。
我还没用过QEMU。 我之前转载过的一篇文章:
(10)瓦尔格林德
Valgrind 是 Linux 下开源(GPLV2)仿真和调试工具的集合。
Valgrind介绍及简单使用:
(11)猎犬
Bushound 是一款用于 PC 笔记本电脑上总线数据包监视和控制的开发工具。 用于捕获合约数据包以及来自设备的输入输出操作,是一个功能强大的总线合约解析器。
之前是和USB上位机进行联调的。 该工具可以监控上位机发送的数据是否正确。 我们还没有在我们的官方账户上分享关于布什猎犬的文章,所以当我有机会时我会花点时间分享它。