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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

技巧#9:代码注释

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

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

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

网友评论

@ DickB

我不支持关于中断程序的建议。在使用德州仪器(TI)MSP430低功耗微控制器时,主代码经常只用于将处理器置于睡眠状态。当处理器处于激活状态时,所有工作都在中断程序中完成。

@ The Real Dr Bob

从我的经验看,也许这篇文章的标题应为“软件工程师的10大技巧”。

我在面试一名软件工程师时曾问过这样一个问题:如何为一个新项目写软件?

回答是:着手写软件代码!

我以为他会说“先阅读规范,然后将软件分解成小模块并为它们设计流程图”之类的话。

当然,我没录用他。

@ Thinking_J

一切都很好。

但我还想增加一条:让管理层学习Agile。

最重要的是,在项目的开始阶段就为项目的完成设定一个现实的目标(这是反复强调的)。而且,项目一开始就应安排好适当的人力和流程,而不是后来才补上。

IT技术分享社区

个人博客网站:https://programmerblog.xyz

文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识

程序人生:硬件工程师应记住的10个技巧相关推荐

  1. 嵌入式硬件工程师应具备哪些基本技能?

    设计是产品制作的第一关,那些硬件工程师既是产品设计者,又是质量把关者,对产品的质量与性能起着决定作用.那么,嵌入式硬件工程师应具备哪些基本技能? 一.硬件工程师应具备的基本技能 1.有需求分析.总体方 ...

  2. c语言goto语句用法_硬件工程师必知的10个C语言技巧

    硬件设计师最常见的工作内容是通过写代码来测试硬件.这10个C语言技巧(C语言仍然是常见的选择)可以帮助设计师避免因基础性错误而导致某些缺陷的产生并造成维护方面的困扰. 为了成功的推出一个产品,软件开发 ...

  3. 作为程序员中的绅士,这10个技巧会让你的代码更加优雅

    大家好,这里是为代码封神的封神榜(有点吹牛皮了,哈哈).还是新人初来乍到,希望大家多多指教. 前言 现在写代码的门槛非常低了,少儿都开始编程了,但从代码的风格一眼看出编码水平.是的,写代码是容易的,写 ...

  4. 程序人生:提高编程逻辑的 10 种最“疯狂”的方法

    如今,大部分学生对编程表现出了兴趣.甚至每个人都想成为一名程序员.编程为程序员提供了许多工作机会.除了那些最新的编程语言之外,与老式的机器级语言相比,它是相当简单的. 这些语言是 Forton.COB ...

  5. 程序人生:我最真实的10年软件测试感悟...【建议收藏】

    从大学毕业进入外包给微软做测试开始, 直至现在已有10年,时间过得很快. 长期的测试工作让我对软件测试有了较深入的认识,但我至今仍是一个底层测试人员.以下看法如有错误,欢迎评论区指出. 1.测试人员应 ...

  6. 程序人生:摆脱情绪低潮的10种方法

    每个人都可能经历情绪低潮期,如果你的情绪总是起起伏伏.抑郁难调,长期处于忧伤的心境,会影响到你的工作效率和正常生活.为了克服抑郁情绪困扰,请看看以下10种有效克服抑郁的方法. 1. 设定目标 当一些特 ...

  7. 程序人生:提高代码运行效率的9个技巧

    我们写程序的目的,就是使它在任何情况下都可以稳定工作.一个运行的很快但结果错误的程序,并没有任何用处.在程序开发和优化的过程中,我们需要考虑代码使用的方式,以及影响它的关键因素.通常,我们要在程序的简 ...

  8. 转载 电子工程师的程序人生历程

    电子工程师的程序人生历程 这些日子我一直在写一个实时操作系统内核,已有小成了,等写完我会全部公开,希望能够为国内IT的发展尽自己一份微薄的力量.最近看到很多学生朋友和我当年一样没有方向 ,所以把我的经 ...

  9. 40 岁编程经验 30 年!支付宝资深工程师的程序人生

    作者 | 蚂蚁金服科技 责编 | 伍杏玲 出品 | 程序人生(ID:coder_life) 一直以来,程序员这个职业被一部分人贴上了"青春"的标签,甚至在码农界,流传着35岁不转行 ...

最新文章

  1. PCB 线宽与电流关系
  2. python第三方工具箱_我的Python笔记——标准库、第三方工具包
  3. DeepLearning.AI第一部分第四周:深层神经网络
  4. 模块之re模块 —— 正则
  5. 通过cookie保存并读取用户登录信息实例
  6. 实现100倍加速!谷歌开源超强张量计算库TensorNetwork
  7. help/Makefile.am:21: error: USE_NLS does not appear in AM_CONDITIONAL
  8. java方面的文献综述怎么写_java论文参考文献
  9. 数据存储与容灾(第2版)主编 鲁先志 武春岭综合训练答案
  10. 用javascript实现一个打乱文字小程序
  11. NodeJS 搭建图形识别功能
  12. 直接从Google Play下载apk(附源码)
  13. 幼儿园手工之自制时钟_幼儿园亲子手工之自制时钟玩教具,这样教孩子时间观念效果才明显...
  14. 【天光学术】中国哲学论文:以老子为例看中国哲学的思辨体系
  15. 文件存储、块存储还是对象存储?
  16. 【免杀前置课——Windows编程】五、窗口控件——什么是控件、Windolws 窗口两大类、Windows标准控件/通用控件、控件响应的接收、创建窗口制作不同控件
  17. 城市交通拥堵问题matlab,城市交通拥堵问题的分析与治理
  18. 手机App-手机端QQ群文件下载失败,使用WiFi可以下载但是流量就不行
  19. 中国医科大学22春《计算机基础与应用 》在线作业【标准答案】
  20. 在一个国家仅有1分,2分,5分硬币,将n(n=5)分钱兑换成硬币有很多种兑法。请你编程序计算出10分钱共有多少种兑法,并列出每种兑换方式。

热门文章

  1. 五轴加工的RTCP技术
  2. opencv 文件模块 解析
  3. 【数据结构】——快速排序
  4. 华为服务器故障灯不开机_华为服务器日常维护及故障处理介绍V.ppt
  5. c ajax定时获取,ajax的定时调用每5秒调用一次
  6. 为什么只看重结果_猫很现实?猫只是看重结果
  7. jQuery安装和语法
  8. ECMA6--字符串/数组
  9. Python基础—06-函数基础
  10. vue created 生命周期