工程师喜欢解决问题。当然,这就是我们的工作。但不如人愿的是,嵌入式软件工程师最大的问题之一是我们自己制造了很多问题,然后花大量的时间来解决这些问题,最后使自己成为英雄(在调试上!)。有很多公司的嵌入式软件工程师把20 - 40%的时间花在调试上。值得庆幸的是,从团队的角度可以做出很多潜在的改变,以减少他们花在调试上的时间,并将时间百分比压缩到个位数。在本文中,我们将研究一些减少调试时间的技巧。
技巧1-测试驱动开发(TDD)
测试驱动开发是一种允许开发人员增量地构建他们的产品软件,并依赖测试来规定他们编写代码的技术。例如,开发人员首先编写一个测试用例,如果测试失败,则编写以通过测试为目的新代码。然后重复这个过程。
传统上来讲,嵌入式软件开发人员会在测试之前编写整个软件代码模块。 可能会在几周内编写数千行代码。 当到了测试代码的时候,如果发现它不起作用,问题在哪里? 只有天知道! 开发人员必须煞费苦心地回顾代码并发现问题所在并修复它。 执行此操作所需的时间可能相当长。
另一方面,对于使用TDD的开发人员来说,如果出现了错误并且在代码中注入了bug,测试用例将立即告诉开发人员!由于是逐步编写代码的流程,所以更有可能确切地知道更改了程序的什么部分,并且能够立即修复问题。TDD似乎需要更多的时间来验证,但通过创建一系列的测试用例,可以在回归测试中运行这些用例,以确保一切都按照预期工作。TDD功能实现了一石二鸟的目的:减少调试和自动化测试的时间。
技巧2-尽可能无机器依赖的开发
当一个项目开始时,几乎每个嵌入式软件开发人员的第一反应就是获得一块开发板然后开始编写代码。 但不如人愿的是,在许多情况下嵌入式软件代码并不是和对手之间产品的差异化因素,差别在于应用程序代码。 虽然许多应用程序代码最终需要与硬件交互,但许多模块可以不依赖于主机器环境来进行开发。
实施无机器依赖的代码开发,为开发人员提供了许多减少每个调试周期所花费时间的机会。 例如,通常要为目标微控制器编写和测试代码,开发人员必须做以下工作:
1.交叉编译代码
2.启动调试会话
3.通过 SWD 对设备进行编程
4.在目标机器上运行代码
5.通过在目标机上运行来验证代码是否有效(同样的必须拥有所有Low-Level代码)
如果代码是在主机上开发的,开发人员必须在主机上编译代码,然后使用单元测试工具、仿真器或自定义程序来运行正在开发的代码。 如果发现问题,会更加快速的修复、重新编译并重新开始测试。
在嵌入式板子上,仅对目标程序进行编程就会使每个周期增加几十秒,更不用说单步执行代码了。
无机器依赖的开发/调试可能会产生特定的错误。从我现在写了大约 75% 的相关代码的例子上来看,发现会有速度更快、效率更高的效果。 我可以快速定位代码中的问题,确定原因并修复它,然后继续调试,而不是只能在嵌入式板子上跟踪问题。 当然,有些问题会出现在主机上不会出现的板子环境上。
技巧3-掌握调试策略
我们已知效率最低的调试方法就是单步调试代码。 但不要误会我的意思,有具体的程序运行时间和发生位置,往往更加会造成很多时间上的浪费。 不幸的是,嵌入式软件开发人员通常默认使用断点和单步调试的方案。 为了更好地调试,开发人员还需要掌握现代微控制器上可用的其他调试策略。
目前至少有八种不同的调试技术可供开发人员使用。 这些技术从最简单到最复杂的顺序排列如下:
- Watch / Expressions:为开发人员提供检查 CPU 和外设寄存器的能力。它们通常可用于监视变量、执行计算或在更改时停止 CPU。
- 断点:为开发人员提供在特定代码行上停止 CPU 执行的能力,高级断点功能可用于设置条件语句的情况。
- 打印:为开发人员提供将字符数据打印到映射的串行接口的能力,有一定概率会影响实时性能。
- 断言:用于验证程序中特定点假设的条件语句。断言失败通常会停止 CPU 并提供失败断言的文件和行位置。
- 统计分析:对在运行中应用程序中的各种寄存器进行定期采样。 通常不会影响实时性能。 例如,您可能想要对程序计数器 (PC) 进行采样以了解正在执行的代码模块。
- 数据分析:对包含可变数据的各种内存位置进行定期采样。当与实时可视化工具一起使用来监控系统状态、感兴趣的变量变化等时,数据分析会非常有用。
- 任务和数据跟踪:使开发人员能够跟踪实时操作系统应用程序中的事件。因此,开发人员可以深入了解应用程序性能、任务延迟、运行时间等等。
- 指令跟踪:使开发人员能够记录在处理器上执行的每条指令。这可用于了解测试期间的代码覆盖率、调试编译器问题等。
掌握所有这些技术并知道何时使用它们,可以大大减少当异常发生进入系统时用于调试的时间。
结论
我们在开发阶段可能会花费大量时间调试嵌入式软件代码。 有时调试时间是不可避免的; 但在许多情况下,开发人员可能会花费超出预期更多的时间。 我们已经探索了几个您可以进一步调查的领域,以减少您和您的团队花费在调试上的时间。 如果您在调试上花费超过整体软件周期的20%时间,那么请在本周花一个小时时间确定您在以上哪些方面可以立即调整优化,以控制花在调试上的时间。