历史上的今天
返回首页

历史上的今天

今天是:2026年02月03日(星期二)

正在发生

2023年02月03日 | 硬件工程师应记住的10大软件技巧

2023-02-03 来源:zhihu

嵌入式系统设计不仅需要了解硬件,还需了解软件是如何影响硬件并与硬件进行交互的。设计硬件所需的范式可能与设计软件完全相反。当从硬件设计转向包含软件的设计时,硬件工程师应牢记以下十个技巧。

技巧#1:流程图第一,实现第二

当工程师首次迈入软件开发领域时,会有一种强烈的诱惑力促使他们立刻投入工作并开始写代码。这种做法就好比在电路逻辑图还未完成前就试图设计印刷电路板(PCB)。在着手开发软件时,抑制一上来就想写代码的冲动至关重要,应首先用流程图制定一个软件架构图。这样的方法会使开发人员对应用所需的不同部分与组件形成一个概念,就像电路逻辑图可以告诉工程师需要哪些硬件元件一样。这样可确保程序整体建立在良好的组织和深思熟虑之上,减少程序调试时间,从长期看,这样做还可以节省时间、省去麻烦。

技巧#2:使用状态机控制程序流程

状态机是20世纪最伟大的软件发明之一。一个应用程序往往可被分为多个状态机,每个状态机都控制该应用程序的特定部分。这些状态机都拥有自己的内部状态和状态转换,从中可看出软件如何与各种激励相互作用。用状态机来设计软件,可简化软件的开发,使之模块化、可维护,并易于理解,相关文章请移步此处:谈谈单片机编程思想——状态机。现在已经有多种资源来演示状态机理论和算法。

技巧#3:避免使用全局变量

在函数式编程的年代,函数要先于形式,程序员的唯一目标是尽可能地让程序按预期方式快速运行,而不用考虑程序结构或可重用性。这种编程范式会毫无顾虑地使用全局性变量,程序中的任何函数都可能修改它。其结果就造成了变量被破坏的几率增加或变量被误用。在新推荐的面向对象的范式中,应在最小的范围内定义变量并封装它们,以防止其他函数的误用或破坏。因此,建议限制使用全局变量的数量。在C语言中可用外部关键字标识这些变量。

技巧#4:充分利用模块化特性

无论问哪一名工程师,项目的哪部分最有可能延迟交付并超出预算,答案都是软件。软件往往是复杂的,且难以开发和维护,尤其是当整个应用都存在于单个文件或松散关联的多个文件中时。为了改善可维护性、可重用性及复杂性,强烈建议程序员充分利用现代编程语言的模块化特性,将常用功能分解成模块。以这样的方式分解代码,程序员就能着手建立函数与特性库,然后在一个接一个的应用中重用它们,从而通过连续测试而改善代码质量,同时也减少了开发时间,降低了开发成本。

技巧#5:保持中断服务例程的简单性

中断服务例程用来中断处理器对当前代码的执行,而去处理刚刚触发中断的外围设备。无论何时执行中断,都需要一定的开销,用于保存当前程序的状态并运行中断,然后将处理器回归原程序状态。现代处理器要比多年前的处理器快得多,但仍需要考虑此花销。一般情况下,程序员都想把中断运行时间降至最低,以避免干扰主代码。这意味着中断应该短而简单。中断中不应调用函数。此外,如果中断变得过于复杂或耗时,那么就应该只在必要时利用中断做最少量的工作,例如,将数据载入缓冲区并设置一个标志,然后让主代码处理输入的数据。这样做可保证大多数处理器的时间用于运行应用,而不是处理中断。

技巧#6:使用处理器示例代码进行测试

设计硬件时,构建原型测试电路总是有益的,这样可确保工程师对电路有正确的理解,然后再做电路板布局。这在设计软件时也同样适用。硅片制造商通常都有示例代码,可用来测试微处理器的各个部分,这样工程师们就可判定该部分的工作情况。此方法使人们明确知道应该如何设计软件体系架构,以及可能碰到的任何问题。在设计初期了解可能存在的障碍,比在产品交付前的最后几小时才发现它们要好得多。这是预先测试一段代码的好方法,但需提醒的是,制造商代码往往不是模块化的,要经过彻底的修改才可用于实际应用。随着技术的进步,也许某一天芯片供应商会提供可用于生产的代码。

技巧#7:限制功能复杂度

工程学中有一个旧词叫“KISS”——保持简单和直接。无论在处理何种复杂的工作时,最简单的方法就是把它分解为更小、更简单、更易处理的任务。随着工作或功能变得越来越复杂,人们要准确无误地记录所有的细节也变得更困难。在写一个函数时,其复杂度在当时看似适中,然而还必须考虑到,6个月后当工程师进行维护时,还需要查看代码。测量函数复杂度(如循环复杂度)的方法很多,现在已经有工具可以自动计算某个函数的循环复杂度。由经验可知,函数的循环复杂度保持在10以下是最理想的。

无论在处理何种复杂工作时,最简单的方法就是把它分解为更易处理的任务。

技巧#8:使用源代码存储库并频繁提交代码

人都是会犯错误的,写代码时也会犯错。这就是为什么开发人员使用源代码存储库是如此重要。源代码存储库可使开发人员“存入”一个好的代码版本,并描述对该基础代码所做的修改。这不仅使开发人员可以复原或追溯到的旧版代码,还可以比较旧版代码之间的不同。如果开发人员做的一系列修改破坏了系统,只需点击一下即可恢复好代码版本!请谨记,如果不频繁提交代码,存储库就不会达到预期目的。如果做了不可修复的改变,过两周才提交代码再恢复的话,就会造成大量工作和时间的损失!

技巧#9:代码注释

在紧张的软件开发中,开发人员很容易把注意力集中在编写和调试代码上,而忽略做详细的注释。在压力之下,注释工作往往拖到最后,因为开发人员认为这是最后的一件事。然而,趁代码在你脑中记忆犹新时就做注释是至关重要的,这样做可使其他开发人员或以后你自己读懂注释,理解代码是如何工作的。

技巧#10:使用Agile开发流程

无论做何种类型的工程设计,都建议先设定并遵守某种流程,以便质量和成本都保持稳定的并能按时交付。软件开发人员已成功使用Agile开发流程开发高质量软件,这一流程可按任务的优先顺序做开发。优先级别最高的任务在指定的时间内首先完成,这被称为迭代。这种方法的好处是可以使软件开发流程保持顺畅,还可以根据结果和客户的需要,使需求和任务适应每一次迭代并做相应的修改。


推荐阅读

史海拾趣

问答坊 | AI 解惑

TSB41

我想要四相四拍步进电机的相关资料,知道的,分享一下,谢谢!…

查看全部问答>

关于复测中的基础知识测验

经专家商定的原则是,一等奖候选队复测期间首先进行基础知识测验。基础知识测验采用闭卷笔试方式,时间2小时,每队选派1名同学参加。笔试内容包括基础知识、分析设计两部分测验内容。“基础知识”主要涵盖模拟、数字电子电路(技术)等技术基础课程 ...…

查看全部问答>

电源的合理运用

电源的合理运用电源的合理运用 1.接触电阻      当电源输出端与负载连接时,连线两端的良好接触很重要。在负载电流大的情况下,良好的接触尤其重要。由于接触不良而引起的数mΩ至十多mΩ的接触电阻和太长或太细的不合适连接 ...…

查看全部问答>

超高频射频识别系统的研究与标签设计

射频识别是一种非接触的自动识别新技术,它成功地实现了多目标的跟踪与识别,以非接触性、识别速度快、可以多卡识别等优于其他自动识别技术的特性受到广泛重视。 近年来,超高频频段射频识别系统应用的要求推动了超高频读写器和电子标签的研究和开 ...…

查看全部问答>

视频监控技术发展中看安防需要应用发展

随着时代的发展,以及用户对安全防范要求的日益提高,监控光端机在安防领域得到越来越广泛的运用,视频监控已成为一种普通的需求。下面就视频监控系统的构建和未来发展趋势展开探讨。互联网技术及应用的飞速发展影响到了视频监控领域,利用廉价的IP ...…

查看全部问答>

从事s3c6410开发的朋友进来签个名,方便以后大家交流

产品规格: 1.        处理器与内存 ?        CPU:S3C6410,主频667M ?        RAM:128M ?        FLASH:1Gbit ?        MicroSD卡 ...…

查看全部问答>

有关驱动的一个问题,请大家帮忙看一下

Microsoft (R) Windows Debugger  Version 6.7.0005.1 Copyright (c) Microsoft Corporation. All rights reserved. Opened \\\\.\\COM1 Waiting to reconnect... Connected to Windows XP 2600 x86 compatible target, ptr64 FALSE ...…

查看全部问答>

接口4线的SWIM,仿真环境IAR,怎么查看寄存器的值

为什么我的程序在运行后,我查看寄存器的值都是0啊,看不到变化。 比如我查看寄存器PE_ODR的值,程序暂停后,我watch寄存器PE_ODR的值总是为0x00,而实际上我用示波器测的话,是0xaa,跟我设定的一样。 我想问一下,是不是用SWIM接口,只能 ...…

查看全部问答>

菜鸟问之一:LM3S811PWM产生的问题

#include    \"hw_types.h\"#include    \"hw_memmap.h\"#include    \"hw_ints.h\"#include    \"hw_gpio.h\"#include    \"hw_pwm.h\"#include    \ ...…

查看全部问答>