1. 新开发模块尽量多加调试打印信息
为了方便调试,对于新开发的代码,要尽量多加一些调试打印信息。对于每一个条件分支,都加一条打印信息。对于每一个return语句返回的地方,都加一句打印信息。等功能调试完毕确认没有问题后,可以去掉部分打印,只保留最重要的一些打印。比如返回false的分支要保留,因为它表明这个函数执行出错了。一些业务流程中的关键步骤的打印也要保留,方便在运行过程中确认这些关键步骤确实执行到了。
2. 每个模块的打印信息添加统一的字符串标识
对于某一个模块,在打印信息中都加入一个统一的标识字符串,这样在查看日志信息的时候,通过搜索这个统一的标识字符串,就可以一次性过滤出所有的相关打印了。举个例子,比如我们现在要开发一个LED点灯的模块,那么我们在这个模块里的所有打印中都加入LED这个字符串,那么代码运行起来后,只需在日志中搜索LED,即可过滤出所有我们想要的信息了。
3. 代码设计时就要考虑单元测试的问题
编写完成一个函数后,要对它进行单元测试。在整个开发过程中,越是在早期进行测试,发现bug的难度越小,越是在晚期进行测试,发现bug的难度越大。所以千万不要等到系统集成测试的时候才去尝试定位问题,单元测试才是发现问题的最好时机。
对于嵌入式系统开发来说,单元测试可能面临额外的问题,就是有些函数并不适合做单元测试,因为它们可能涉及操作硬件寄存器,或者涉及网络协议。
所以我们在代码设计的时候,就要考虑这个问题。一种可行的方式是要尽量把函数拆分成不同的类别,第一类函数只涉及操作硬件寄存器,第二类只涉及协议,第三类则与硬件无关且与协议无关。
第三类函数可以进行完全的单元测试,它们甚至可以不用下载到实际的硬件上,而只需在开发环境就可以进行充分的测试了。
对于第一类函数,基本上只是读或写寄存器,逻辑很简单,基本不需要做单元测试。
对于第二类函数,也可以针对协议本身进行完整的测试,可以在开发环境进行测试。