如果你在嵌入式系统行业花时间开发一个产品或者一个DIY项目,你就会知道很多时间都花在了调试上。嵌入式开发人员花费多达50%甚至更多的时间调试他们的应用程序代码并不罕见!有很多策略可以帮助你减少调试时间。让我们来探索五种策略,你可以用它们来减少你花在调试上的时间。
策略 1 —— 不要从一开始就将bug放在代码中
如果你不在你的软件中放入bug,你就不必花时间去移除它们。减少调试时间的第一个方法是不要在代码中放入bug!
当然,将bug排除在代码之外是具有挑战性的。你不能把它们都排除在外,但是你可以尽量减少进入代码的数量。最小化bug从拥有合理的、可追踪的需求开始。如果开发人员知道他们正在构建什么以及它应该如何表现,那么创建这些特性就更容易了。
了解你的需求并锁定它们会有所帮助,但这不是保证。开发人员需要定义良好的流程来防止错误。如果一个bug真的出现了,我们希望能尽快捕捉到它们。如果我只是添加了一行代码,然后发现我破坏了系统,我知道应该查看哪一行代码。
也许第一个策略可以表述得更清楚:“开发流程和纪律,以避免将错误注入代码”。
策略2 —— 使用测试驱动的开发
测试驱动开发是敏捷运动中产生的一项令人兴奋的技术。核心思想是,在嵌入式开发人员编写任何生产代码之前,编写一个测试,使它失败,然后编写生产代码,使它通过。然后这个过程无限重复。
拥有一个我们证明失败了并且能够检测到失败的测试是一个有效的调试工具。随着每个测试的创建,我们可以重新运行旧的测试。如果我们的新代码破坏了某些东西,测试就会失败,并直接指向我们破坏的东西。在这一点上,我们知道我们刚刚写了什么代码破坏了它,我们破坏了什么。显而易见,在这些情况下,我们应该能够显著减少调试时间。事实上,调试大大减少。
测试驱动开发可以应用于嵌入式系统。可以用它来测试从底层硬件中分离出来的应用程序代码。通过解耦,你可以轻松地注入数据、探测结果,并验证代码是否按预期工作。测试驱动开发也可以用于底层驱动和中间件开发。由于编程周期的原因,这要慢得多。然而,这可能是一个很好的方式来建立和证明驱动程序在各种条件下工作。最终结果是我们花在调试上的时间更少了。
策略 3 —— 使用仿真器
仿真器和模拟器在减少调试时间方面非常有用。由于对嵌入式目标进行编程所涉及的编程周期,调试时间通常会增加。仿真器或模拟器可以在主机环境中执行,无需对嵌入式目标进行编程。结果是嵌入式开发人员可以快速迭代、测试和调试他们的代码。
策略4——跟踪你的应用程序代码
跟踪技术对于理解嵌入式系统的帮助非常大。跟踪工具,例如 Percepio 的 Tracealyzer,可以帮助你了解代码时序、CPU 利用率、状态等等。例如,当系统开始出现异常行为时,开发人员通常会跳入其中并随机四处寻找问题可能出在哪里。使用跟踪工具,开发人员可以可视化随时间推移执行的内容,并查看它们是否达到了诸如优先级反转、任务匮乏或其他问题之类的瓶颈。
开发人员可以利用许多跟踪技术,例如Arm Cortex -M处理器上的串行线查看器。在这些跟踪接口上,开发人员可以发送调试信息,从而最大限度地减少实时交互,并帮助更快地找到问题的根源。
策略5–了解CPU寄存器和指令集
开发人员偶尔会遇到超级bug。突然出现的bug会导致硬故障或其他灾难性的行为。该bug可能是由于堆栈溢出或指针不正常,并试图在不存在的内存区域执行代码造成的。当这种情况发生时,开发人员通常必须卷起袖子,深入研究微控制器硬件。理解CPU、外设寄存器和指令集对于解决这些棘手的问题至关重要。
结论
开发人员永远不会实现没有bug的软件。我们今天设计和建造的系统太复杂了,但这并不意味着我们没有可以用来减少调试时间的策略和工具。正如我们在这篇文章中所看到的,我们可以建立适当的程序来防止大多数bug进入软件。尽管如此,当他们这样做时,嵌入式开发人员可以使用测试驱动的开发、跟踪、模拟器和其他技术来帮助我们最大限度地减少调试时间。
发表评论 取消回复