0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式软件减少调试时间的技巧

Linux阅码场 来源:Linux阅码场 作者:许庆伟 2022-06-30 10:01 次阅读

工程师喜欢解决问题。当然,这就是我们的工作。但不如人愿的是,嵌入式软件工程师最大的问题之一是我们自己制造了很多问题,然后花大量的时间来解决这些问题,最后使自己成为英雄(在调试上!)。有很多公司嵌入式软件工程师把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%时间,那么请在本周花一个小时时间确定您在以上哪些方面可以立即调整优化,以控制花在调试上的时间。

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模块
    +关注

    关注

    7

    文章

    2740

    浏览量

    47829
  • 嵌入式软件
    +关注

    关注

    4

    文章

    242

    浏览量

    26778
  • 驱动开发
    +关注

    关注

    0

    文章

    130

    浏览量

    12125

原文标题:减少嵌入式软件调试时间的三个技巧

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式机器学习的应用特性与软件开发环境

    设备和智能传感器)上,这些设备通常具有有限的计算能力、存储空间和功耗。本文将您介绍嵌入式机器学习的应用特性,以及常见的机器学习开发软件与开发环境。 嵌入式机器学习的应用特性与优势 由于嵌入式
    的头像 发表于 01-25 17:05 214次阅读
    <b class='flag-5'>嵌入式</b>机器学习的应用特性与<b class='flag-5'>软件</b>开发环境

    如何提高嵌入式代码质量?

    嵌入式系统的发展已经深刻地影响了我们日常生活的方方面面,从智能家居到汽车控制系统,再到医疗设备和工业自动化等领域,嵌入式系统无处不在。嵌入式软件的质量直接关系到系统的安全性、稳定性和性
    发表于 01-15 10:48

    嵌入式系统开发与硬件的关系 嵌入式系统开发常见问题解决

    嵌入式系统开发与硬件的关系 嵌入式系统是专为特定应用设计的计算机系统,它们通常嵌入在所控制的设备中。这些系统的关键特点是它们与硬件的紧密集成,这意味着软件必须为特定的硬件平台量身定制。
    的头像 发表于 12-09 09:38 472次阅读

    什么是嵌入式?一文读懂嵌入式主板

    在现代科技浪潮中,嵌入式技术已成为支撑各种智能设备和系统运行的核心力量。那么,究竟什么是嵌入式嵌入式系统,顾名思义,是将计算机的硬件和软件嵌入
    的头像 发表于 10-16 10:14 1708次阅读

    EsDA,一站嵌入式软件

    ,旨在提高嵌入式软件开发的效率、性能和可扩展性。EsDA全称是嵌入式系统设计自动化,它是一个由AWorksLP、AWStudio、AXPI、AWTK、ZWS等多种软件
    的头像 发表于 09-15 08:10 381次阅读
    EsDA,一站<b class='flag-5'>式</b><b class='flag-5'>嵌入式</b><b class='flag-5'>软件</b>

    嵌入式开发常用软件有哪些?

    用于编写、编译和调试嵌入式系统软件。它提供了一个集成的开发环境(IDE),包括代码编辑器、编译器、调试器和仿真器等组件,这些组件可以方便地进行配置和管理,提供了高效的开发体验。Keil
    发表于 09-09 15:22

    嵌入式系统中的实时操作系统

    嵌入式RTOS是嵌入式应用程序运行、相互交互和与外界通信的底层软件机制。在本节中,您将了解嵌入式软件开发人员使用哪些流行RTOS以及它们运行
    的头像 发表于 08-20 11:28 570次阅读

    嵌入式软件开发与AI整合

    嵌入式软件开发与AI整合是当前技术发展的重要趋势之一。随着人工智能技术的快速发展,嵌入式系统越来越多地集成了AI算法,以实现更复杂的智能功能。以下是关于嵌入式
    的头像 发表于 07-31 09:25 903次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>软件</b>开发与AI整合

    嵌入式系统怎么学?

    系统设计与调试:需要掌握嵌入式系统的设计方法和调试技术,包括硬件设计、软件设计、电路调试等,以确保系统的稳定性和可靠性。 随着技术的不断进
    发表于 07-02 10:10

    如何提升嵌入式编程能力?

    代码以提高性能,包括减少内存使用、提高处理速度等。 16. 调试技巧:掌握嵌入式系统的调试技巧,包括使用调试器、日志记录和性能分析工具。 1
    发表于 06-21 10:01

    从事嵌入式方向,一定要软硬件通吃?

    软件工程师的职责嵌入式软件工程师的主要职责是为嵌入式系统编写和调试代码,确保系统按预期工作。他们需要处理底层硬件接口、实时操作系统(RTOS
    的头像 发表于 06-05 08:10 1313次阅读
    从事<b class='flag-5'>嵌入式</b>方向,一定要软硬件通吃?

    嵌入式软件工程师和硬件工程师的区别?

    、机器人等。 定义和工作职责 嵌入式软件工程师的主要职责包括但不限于:设计、开发、测试和调试嵌入式软件应用程序,以满足特定硬件和
    发表于 05-16 11:00

    嵌入式产品的低功耗调试实用技巧

    嵌入式产品的低功耗调试是一件较麻烦的事情,因为它既涉及到硬件又涉及到软件,影响因素非常多。但是又十分重要,因为它关系到产品的实际使用时长。
    发表于 04-28 10:23 406次阅读
    <b class='flag-5'>嵌入式</b>产品的低功耗<b class='flag-5'>调试</b>实用技巧

    嵌入式软件设计的原则分享

    嵌入式软件开发如果具有更好的阅读性、扩展性以及维护性,就需要考虑很多因素。今天给大家分享几个嵌入式软件设计的原则。
    发表于 02-25 10:54 765次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>软件</b>设计的原则分享

    嵌入式软件开发应该掌握哪些知识?

    知识点学习 熟悉 Linux 的基本使用对于嵌入式软件开发至关重要。包括文件系统的管理、用户权限的控制、软件包管理等。嵌入式开发人员需要能够在 Linux 环境下进行开发、
    发表于 02-19 11:23