构建稳健的嵌入式软件的五个基本技巧和窍门

        我所见过的几乎所有程序员都希望编写出坚如磐石的软件。如果你的工作是编写软件,你当然是希望软件能够正常运行。我从未见过有人在项目开始时说:“让我们编写人类已知的最糟糕的、紧密耦合的、有缺陷的、昂贵的代码吧。”(当然,“国际混淆 C 代码大赛IOCCC)除外)。

        我们都希望写出优秀的代码,使我们的产品能够无缝运行,并获得大众的称赞,或者至少是我们老板的称赞。

        不幸的是,编写嵌入式软件经常会陷入错误、或其他爬行动物的泥潭。因此,让我们来打破这个僵局!

        这篇文章将介绍构建坚如磐石的嵌入式软件的五个基本技巧和窍门,我发现这些技巧和窍门使我的客户、同事、学生、我自己受益匪浅,希望您也能从中受益。

技巧和窍门1 - 让您的产品尽早、频繁地进入客户手中

        您可能想知道,将产品尽早、频繁地交到客户手中与坚如磐石的嵌入式软件有什么关系。归根结底,决定您的产品是否坚如磐石的是您的客户。如果你在一个没有客户的孤岛上编写所有令人惊叹、优雅、改变世界的代码,你将会猛然醒悟。

        如今,许多团队都是在没有真正需求的情况下开始开发产品的。客户在接触、感受和使用产品之前,往往不知道自己想要什么。因此,如果开发人员不与客户密切合作,他们要么漫无目的地开发,要么开发他们认为客户需要的东西。即使团队有幸获得了需求,也并不意味着客户真正知道他们想要什么。他们往往认为自己知道,但却经常改变主意。我不了解你的情况,但尽管我拥有出色的学位和辛勤的工作,但客户经常让我感到惊讶。获得客户反馈至关重要,我知道这听起来很敏捷,但也许那些人毕竟还是有道理的。

        在我的咨询生涯早期,我有一个开发天窗的客户。他们需要我帮助对其产品进行系统测试,以确保其固件能够正常工作。一位自豪的工程师拿出了他们的原型样机,并向我展示了所有的花哨功能以及它的工作原理。作为客户,我做的第一件事就是同时按下两个按钮,结果系统瘫痪了。在震惊的表情转为愤怒之后,他问道:"谁会同时按两个按钮?”显然,我和其他顽皮的顾客想知道如果我同时按下这两个按钮会发生什么!在客户(非设计者)拿到产品之前,您根本不知道产品将被如何使用。

提示和技巧2 – 利用和采用现代测试技术

        构建坚如磐石的软件的关键是利用现代测试技术来提高代码的稳健性。在当今的行业中,嵌入式团队正大力推动采用 DevOps 等方法和 CI/CD 等工具。这些方法和工具能够测试软件的小单元(单元测试)、多模块集成(集成测试)和系统级(系统测试),以及许多其他可能的测试。测试使团队能够在特定的、可控的条件下发现软件中的问题。其结果是一个更强大的软件系统!

        Edsger Dijkstra 曾经说过:“测试只能证明错误的存在,而不能证明错误的不存在。” 圣人的智慧应该提醒您,构建稳健的软件需要的不仅仅是测试。采用单元测试和 CI/CD 来证明您拥有100%的代码覆盖率并且您的系统坚如磐石,这可能很诱人。不幸的是,这种想法是一个陷阱!是的,您必须采用现代测试技术来提高代码质量、测试系统并提高其稳健性。然而,您还需要采取额外的措施,例如执行代码审查、利用结对编程、架构性能和分析、指标监控等等。

提示和技巧3 – 应用静态代码分析工具来识别潜在的错误

        嵌入式软件开发人员日常使用的编程语言通常没有完全指定。有些结构或行为没有在语言标准中定义,而是编译器定义的行为。例如,如果在C语言中让整数循环滚动会发生什么?会得到什么值?这取决于编译器,因为C语言标准没有告诉你,所以编译器厂商决定了最佳的操作方案。

        静态代码分析是您实现强大固件所必须利用的工具。静态分析将帮助您识别代码中的潜在错误。静态分析可以指出不推荐的特定构造,检查您的代码是否符合您的编码标准,检测漏洞并提供代码指标等等。当我的代码存在潜在问题或者当我让复杂性变得杂乱无章时,我无法计算静态分析工具有多少次发现了这个问题。我无法充分强调设置静态分析工具并将其纳入正常的日常编码和 DevOps 流程的重要性。

提示和技巧4 – 使用代码分析工具来识别和优化性能瓶颈

        提到坚如磐石的嵌入式软件,您可能会想到该软件能够满足客户要求并且没有错误。然而,一个经常被忽视的重要组成部分是系统的最佳运行状态。对于需求来说,系统的响应速度与系统不崩溃或不出现丑陋的错误一样重要。

        我非常喜欢在产品构建过程中使用分析工具来监控和优化性能。有时候,我以为只是简单的代码修改,结果却大大增加了CPU的使用率。分析工具可以帮助您检查任务的周期性、执行时间、状态机行为、内部通信性能等等。您需要使用能够帮助您直观了解系统性能的工具,并捕捉那些会变成大问题的小问题。您不能依靠人为的系统监控来判断系统是否正常运行。我不想这么说,但我们无法捕捉和监控我们的工具所能做到的一切!(至少不是实时的)。

提示和技巧5 – 结合防御性编程技术来处理意外的输入和场景

        您可能是一名优秀的程序员或经理,其团队中也有优秀的程序员。然而,在我审查的嵌入式系统的所有代码中,我仍然发现团队最容易错过的成果之一是验证他们的输入和输出。许多开发人员似乎都跳过了它。我不确定开发人员是否过于专注于编写尽可能少的代码行,或者认为验证在某种程度上使他们的代码变得臃肿。如果您想编写坚如磐石的嵌入式软件,则必须结合基本的防御性编程技术来处理意外的输入和您可能意想不到的场景。

        一个简单的例子可能是检查函数中接收到的参数是否在预期范围内。另一个例子可能是假设循环中可能发生内存损坏,并将等值(C/C++中的==)改为大于或等于号(>=)。稳健的软件不是通过宏大的架构细节或巧妙、优雅的代码编写实现的。相反,它是通过仔细和近乎偏执地逐行管理代码细节来实现的。

编写坚如磐石的嵌入式软件的结论

        我们都想编写坚如磐石的高质量软件。不幸的是,当今的许多软件都远非如此。不要误会我的意思,我认为情况正在改善,但我们还有很长的路要走。

        我们已经探讨了五个关键的技巧和窍门,希望您在本周仔细考虑。您是否在您的开发过程中采用了其中的每一项?您是否关注细节?您的客户是否提前拿到了您的产品?您会发现,只需就这些技巧问自己几个简单的问题,就能帮助您找到需要进行的调整,从而开始编写和交付更加坚如磐石的嵌入式软件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值