gzyueqian
13352868059

嵌入式开发:减少调试时间的3个技巧

更新时间: 2022-12-27 09:39:30来源: 粤嵌教育浏览量:5145

工程师喜欢解决问题这是我们的工作,但是,嵌入式软件工程师最大的问题之一是我们制造了很多问题,然后通过花费大量的时间来修复它们(调试!)嵌入式软件工程师花20–40%的时间进行调试的公司非常常见!令人欣慰的是,嵌入式开发团队可以做出很多潜在的改变来减少他们花费在调试上的时间,并使其达到个位数的百分比。在本文中,我们将研究几个减少调试时间的技巧。

 

技巧 1——拥抱测试驱动开发(TDD)

测试驱动开发是一种技术,它允许开发人员增量地构建他们的生产软件,他们依靠测试来规定他们编写的代码。例如,TDD让开发人员首先编写一个测试用例,让它失败,然后只编写允许该测试用例通过的代码。然后重复该过程。

 

传统上,嵌入式软件开发人员会在测试之前编写完整的代码模块。在几周内编写成千上万行代码是可能的。那么,到了测试的时候,如果不行的话问题出在哪里呢?开发人员必须费力地回顾代码,发现问题所在并修复它这样做所需的时间可能相当长。

 

另一方面,对于使用TDD的开发者来说,如果犯了错误,在代码中注入了bug,测试用例会立刻告诉嵌入式开发者!因为他们是增量地编写代码,所以他们更有可能确切地知道他们更改了什么,并且可以立即修复问题。TDD可能看起来需要花更多的时间来实践,但是它创建了一个可以在回归测试中运行的测试用例集合,以确保一切按预期运行。TDD一举两得减少调试时间和自动化测试。

 

技巧2——尽可能远离目标

当一个项目开始时,几乎每个嵌入式软件开发人员的第一反应都是拿到开发板,开始编写嵌入式代码。是,在许多情况下,嵌入式代码并不是我们产品中的区分器;这是应用程序代码。虽然许多应用程序代码最终需要与硬件交互,但许多模块可以脱离目标开发,即在主机上开发。

开发偏离目标的代码为开发人员提供了许多减少每个调试周期花费时间的机会。例如,为了编写和测试目标微控制器的代码,嵌入式开发人员必须

交叉编译代码

启动调试会话

通过SWD对器件进行编程

在目标上运行代码

通过在目标上运行代码来验证代码是否有效(还必须拥有所有底层代码)

 

如果代码是在主机上开发的,开发人员必须为主机编译它,然后使用单元测试工具、模拟器或自定义程序来运行开发中的代码。如果发现问题,修复、重新编译并再次运行会快得多。在嵌入式目标上,仅仅是对目标编程就可能给每个周期增加几十秒,更不用说单步执行代码的诱惑了。


技巧3——掌握调试策略

人类已知的最低效的调试方法是单步调试代码行。不要误会,是有时间和地点的,但往往会浪费很多时间。不幸的是,嵌入式开发人员默认使用断点和单步调试。为了更好地调试,开发人员需要掌握现代微控制器上可用的其他调试策略。

如今,至少有八种不同的调试技术可供开发人员使用。从最简单到最复杂,这些技术包括

 

监视/表达式:为开发人员提供检查CPU和外围寄存器的能力。它们通常可用于监视变量、执行计算或在更改时停止CPU

 

断点:为开发人员提供在特定代码行上停止CPU执行的能力。高级断点可用于设置条件语句。

 

printf:为嵌入式开发人员提供将字符数据打印到映射的串行接口的能力。根据实现情况,这可能会或可能不会影响实时性能。

 

断言:这些是用于在程序中的特定点验证假设的条件语句。断言失败通常会使CPU停止,并提供失败断言的文件和行位置。

 

统计分析:在应用程序运行的同时,对应用程序中的各种寄存器进行定期采样。通常不会影响实时性能。例如,可能需要对程序计数器(PC)进行采样,以了解正在执行的代码模块。

 

数据分析:对包含变量数据的各种内存位置进行定期采样。当与实时可视化工具一起使用时,数据分析可以很好地监控系统的状态、感兴趣的变量变化等。

 

任务和数据跟踪:为嵌入式开发人员提供在实时操作系统应用程序中跟踪事件的能力。因此,开发人员可以深入了解应用程序性能、任务延迟、运行时间等。

 

指令跟踪:为开发人员提供记录处理器上执行的每条指令的能力。这可用于了解测试期间的代码覆盖率、调试编译器问题等。

 

掌握所有这些技术并知道何时使用它们可以显著减少缺陷进入系统时调试所花费的时间。

 

结论

可能要花很多时间调试嵌入式软件。有时候,调试时间就是无法避免;然而,在许多情况下,开发人员可能会花费比他们需要的更多的时间。我们已经探索了几个领域,可以进一步研究以减少嵌入式开发团队花费在调试上的时间。如果你花了20%以上的时间调试,本周花一个小时来确定你可以立即开始做什么改变来控制你花在调试上的时间。

免费预约试听课