通过仪器提高固件质量 ,收益和限制
扫描二维码
随时随地手机看文章
代码仪器涉及将其他代码添加到程序中以监视,测量和分析其执行过程中的行为。本文涉及手动源代码仪器,程序员确定记录哪些信息以及何时登录的信息。随着系统变得越来越复杂,仪器变得越来越重要。 C ++由于其效率和接近硬件的功能而占主导地位的嵌入式系统开发。本文研究了仪器C/C ++代码的实践,强调了其优势和缺点,以帮助开发人员做出明智的决定。嵌入式系统对于现代技术至关重要,可以为各个行业提供动力。
为什么源代码仪器很重要
嵌入式系统变得越来越复杂,相互联系,难以理解和调试。许多项目依靠第三方,记录不足或过时的代码,使开发人员对他们正在更新或测试的内容有限。实时系统也不能在不影响结果或造成损害的情况下暂停。借助快速生成的数据,固件必须包括数据记录以捕获实时信息,分析行为,提高性能并解决问题。传统的调试方法不再足以用于所有复杂的嵌入式系统测试和调试挑战。
记录的历史记录对于分析难以复制的故障至关重要,因为它有助于识别根本原因,而不仅仅是解决症状。问题也可能是由硬件或外部因素引起的。与全局变量采样或其他异步方法相比,Code Instrumentation提供了对固件执行的更详细的见解。简单的同步方法,例如ARM Cortex SWV数据跟踪,由于其较小的可变范围提供了有限的见解。复杂的错误通常涉及硬件软件交互,仅通过黑盒测试就难以解决。由于嵌入式系统是互连的,因此记录的历史记录对于有效解决问题至关重要。即使是简短的历史记录也可以提供有关错误或次优性能的真正原因的重要信息。
嵌入式系统设计人员经常使用本地仪器,例如定时测量或类似printf的功能来解决问题。但是,通常在解决问题后删除该仪器,因此无法分析未来问题。即使它保留在代码中,它也不全面,也不提供对系统的完整视图。
示波器,逻辑分析仪和功率分析仪等仪器捕获了通过嵌入式模块控制或监测的系统值。代码仪器有助于我们了解软件如何解释测量方法,尤其是在电气嘈杂的环境中。例如,在电力电子中,了解噪声如何影响模拟输入测量至关重要。同样,固件对噪声和故障的鲁棒性无法外部测量。
嵌入式系统中的仪器带来了许多好处,包括改进的调试,性能分析和更有效的测试。这有助于更高的软件和整体系统质量。以下一节简要介绍了其中一些好处,以使您了解可以使用哪种仪器。但是,仪器也有一些开发人员应意识到的局限性。这些也简要介绍在单独的部分中。然而,仪器是嵌入式系统设计人员的宝贵工具,可以进行早期故障检测和系统优化。
源代码仪器的好处
1。绩效优化:减少潜伏期,确定临时性能降解的原因,识别瓶颈(测量执行时间和资源使用情况),定位性能热点以及轨道改进,以确保有效的优化响应性和性能。
2。高级监视和可观察性:提供对应用程序行为,性能,时机和资源使用情况的实时可见性,从而实现主动的问题解决。它跟踪函数调用,可变值,系统状态和代码覆盖范围,以确保正确性并更好地理解复杂的交互。深入研究系统的运行方式通常会揭示最初不考虑的事物(不是规格的一部分)。
3。提高调试:加速故障排除和调试,减少停机时间并尽早发现潜在的问题。它还确保系统满足设计和操作要求。
4。找到难以生产的错误:即使是简短的历史记录也可以揭示原因。也可以用于压力测试和/或模糊来复制错误和日志历史记录以识别实际原因。
5。避免延迟延迟:项目早期的仪器代码可以尽早发现错误和效率低下。同时,它可以防止需要晚期重新设计。
6.提高固件质量:更好地了解固件可以帮助更快地识别剩余问题,消除瓶颈,提高可靠性和安全性,减少错误警报等。
7。测试质量保证:启用测试自动化,回归测试,故障注射(例如,仪器可以在故障注射后捕获内部行为),代码覆盖范围分析等。
8。更好的代码理解:通过将仪器点放置在复杂或记录不足的代码中,开发人员可以分析代码的逻辑并确定问题领域。
9.文档支持:生成可用作系统行为参考材料的日志和报告;包括确认进行测试。
10。提高安全性:记录的历史记录可以提供有关出了问题的宝贵见解(例如,意外操作员错误或事件的意外组合),并允许改善安全算法。
11.提高能源效率:优化不必要地加载CPU或延迟睡眠的代码片段可以显着降低功耗,这是电池动力系统的关键因素。
限制源代码仪器的因素
1。性能开销:添加仪器可以减慢程序的执行,从而使其不适合至关重要或硬实时系统。
2。代码复杂性:仪器提高了复杂性,这可能会使维护更加困难。
3.资源使用:仪器会消耗额外的内存和处理能力,在资源约束环境中可能会过时。
4.行为修改:仪器改变程序行为,包括时间。不应在发布中将其删除,因为可能会在用仪器代码测试期间检测到的时序问题。
5。安全风险:仪器可以暴露敏感数据或创建可剥削的漏洞。
6。有限的可伸缩性:在大型或分布式系统中,管理和分析数据可能是复杂且资源密集的。在没有深入了解其运营历史的情况下测试此类系统也很具有挑战性。
7.上下文依赖性:可能需要针对不同的平台或环境定制仪器。
8.缺乏标准化使得很难重复使用仪器模块。
9.来自多核或分布式系统的日志数据汇总困难。
可以通过选择正确的仪器库并正确实施上述大多数限制可以避免或最小化。不能保证测试人员将拥有所需的记录数据来分析难以重复的问题,或者将历史记录在足够的时间内可用。对主机的日志内存和带宽是有限的,只有仪器的代码的一部分才能提供历史记录。不太了解的仪器代码可能会导致数据收集不正确。单个错误可能导致几种不同的失败症状。尽管有历史记录,但确定实际原因并不总是那么容易。但是,记录增加了找到失败的真正原因的可能性。
代码仪器不适合简单项目,除非我们需要学习新的仪器工具包,或者它是实时控制系统,并且我们希望同步从系统中收集数据,而不必担心如何将数据从嵌入式系统导出到CSV文件或传播表格。对于落后于计划的项目而言,这也不是理想的选择,因为它需要时间来启动大型代码库和学习新工具。
那些对当前仪器方法缺点的人感兴趣的人应参考附录1中此主题的概述。
灵活和微不足道的仪器的特征
为仪器添加的任何代码(数据记录功能和/或宏),无论多么最佳,都会影响代码尺寸和执行速度。这些效果必须最小化。轻质和灵活仪器的关键要求是:
1。 尽可能快地运行,以最大程度地减少对固件的影响。
2。 使用最小的堆栈空间来最大程度地减少代码仪器后堆栈溢出的可能性,从而使解决方案适合集成到现有项目中。
3。 小型程序内存足迹,以使集成到资源受限的系统中。
4。 有效地编码并将数据存储在圆形缓冲区中,以最大化相同的缓冲区大小的历史记录。开发人员需要足够的上下文来确定问题,同时最大程度地减少内存使用情况。这减少了上传时间,并降低了云方面的运营成本,尤其是对于物联网警报或按需消息传递和存储。
5。时间戳:必须对记录数据进行时间戳,因为时间对于大多数嵌入式系统很重要。
6。 综合数据收集:所有类型的数据和事件的日志(从应用程序数据到RTOS事件)。
7。 允许过滤在嵌入式系统中记录的数据,并在主机上解码期间对数据进行分类/选择数据以管理数据泛滥。过滤还可以使您可以在更详细和更短的历史或更详细且更长的历史记录之间进行选择。
8。 要便携式,以便开发人员可以在其所有或大多数项目上使用它。
9。 适用于大多数嵌入式系统,从裸金属到基于RTOS的系统,包括资源受限的系统。
10。与特定硬件或软件(例如调试探针,特定IDE或RTOS) 无关。
11。 允许对已记录信息有效分析。
12。 易于学习和使用。