嵌入式软件开发的10个技巧

一起学嵌入式 2023-08-29 07:50

扫描关注一起学嵌入式,一起学习,一起成长



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

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

文章来源于网络,版权归原作者所有,如有侵权,请联系删除。



扫码,拉你进高质量嵌入式交流群


关注我【一起学嵌入式】,一起学习,一起成长。


觉得文章不错,点击“分享”、“”、“在看” 呗!

一起学嵌入式 公众号【一起学嵌入式】,RTOS、Linux编程、C/C++,以及经验分享、行业资讯、物联网等技术知
评论
  • 当前,智能汽车产业迎来重大变局,随着人工智能、5G、大数据等新一代信息技术的迅猛发展,智能网联汽车正呈现强劲发展势头。11月26日,在2024紫光展锐全球合作伙伴大会汽车电子生态论坛上,紫光展锐与上汽海外出行联合发布搭载紫光展锐A7870的上汽海外MG量产车型,并发布A7710系列UWB数字钥匙解决方案平台,可应用于数字钥匙、活体检测、脚踢雷达、自动泊车等多种智能汽车场景。 联合发布量产车型,推动汽车智能化出海紫光展锐与上汽海外出行达成战略合作,联合发布搭载紫光展锐A7870的量产车型
    紫光展锐 2024-12-03 11:38 101浏览
  • 最近几年,新能源汽车愈发受到消费者的青睐,其销量也是一路走高。据中汽协公布的数据显示,2024年10月,新能源汽车产销分别完成146.3万辆和143万辆,同比分别增长48%和49.6%。而结合各家新能源车企所公布的销量数据来看,比亚迪再度夺得了销冠宝座,其10月新能源汽车销量达到了502657辆,同比增长66.53%。众所周知,比亚迪是新能源汽车领域的重要参与者,其一举一动向来为外界所关注。日前,比亚迪汽车旗下品牌方程豹汽车推出了新车方程豹豹8,该款车型一上市就迅速吸引了消费者的目光,成为SUV
    刘旷 2024-12-02 09:32 119浏览
  •         温度传感器的精度受哪些因素影响,要先看所用的温度传感器输出哪种信号,不同信号输出的温度传感器影响精度的因素也不同。        现在常用的温度传感器输出信号有以下几种:电阻信号、电流信号、电压信号、数字信号等。以输出电阻信号的温度传感器为例,还细分为正温度系数温度传感器和负温度系数温度传感器,常用的铂电阻PT100/1000温度传感器就是正温度系数,就是说随着温度的升高,输出的电阻值会增大。对于输出
    锦正茂科技 2024-12-03 11:50 106浏览
  • 遇到部分串口工具不支持1500000波特率,这时候就需要进行修改,本文以触觉智能RK3562开发板修改系统波特率为115200为例,介绍瑞芯微方案主板Linux修改系统串口波特率教程。温馨提示:瑞芯微方案主板/开发板串口波特率只支持115200或1500000。修改Loader打印波特率查看对应芯片的MINIALL.ini确定要修改的bin文件#查看对应芯片的MINIALL.ini cat rkbin/RKBOOT/RK3562MINIALL.ini修改uart baudrate参数修改以下目
    Industio_触觉智能 2024-12-03 11:28 84浏览
  • 光伏逆变器是一种高效的能量转换设备,它能够将光伏太阳能板(PV)产生的不稳定的直流电压转换成与市电频率同步的交流电。这种转换后的电能不仅可以回馈至商用输电网络,还能供独立电网系统使用。光伏逆变器在商业光伏储能电站和家庭独立储能系统等应用领域中得到了广泛的应用。光耦合器,以其高速信号传输、出色的共模抑制比以及单向信号传输和光电隔离的特性,在光伏逆变器中扮演着至关重要的角色。它确保了系统的安全隔离、干扰的有效隔离以及通信信号的精准传输。光耦合器的使用不仅提高了系统的稳定性和安全性,而且由于其低功耗的
    晶台光耦 2024-12-02 10:40 120浏览
  • TOF多区传感器: ND06   ND06是一款微型多区高集成度ToF测距传感器,其支持24个区域(6 x 4)同步测距,测距范围远达5m,具有测距范围广、精度高、测距稳定等特点。适用于投影仪的无感自动对焦和梯形校正、AIoT、手势识别、智能面板和智能灯具等多种场景。                 如果用ND06进行手势识别,只需要经过三个步骤: 第一步&
    esad0 2024-12-04 11:20 50浏览
  • RDDI-DAP错误通常与调试接口相关,特别是在使用CMSIS-DAP协议进行嵌入式系统开发时。以下是一些可能的原因和解决方法: 1. 硬件连接问题:     检查调试器(如ST-Link)与目标板之间的连接是否牢固。     确保所有必要的引脚都已正确连接,没有松动或短路。 2. 电源问题:     确保目标板和调试器都有足够的电源供应。     检查电源电压是否符合目标板的规格要求。 3. 固件问题: &n
    丙丁先生 2024-12-01 17:37 100浏览
  • 作为优秀工程师的你,已身经百战、阅板无数!请先醒醒,新的项目来了,这是一个既要、又要、还要的产品需求,ARM核心板中一个处理器怎么能实现这么丰富的外围接口?踌躇之际,你偶阅此文。于是,“潘多拉”的魔盒打开了!没错,USB资源就是你打开新世界得钥匙,它能做哪些扩展呢?1.1  USB扩网口通用ARM处理器大多带两路网口,如果项目中有多路网路接口的需求,一般会选择在主板外部加交换机/路由器。当然,出于成本考虑,也可以将Switch芯片集成到ARM核心板或底板上,如KSZ9897、
    万象奥科 2024-12-03 10:24 68浏览
  • 概述 说明(三)探讨的是比较器一般带有滞回(Hysteresis)功能,为了解决输入信号转换速率不够的问题。前文还提到,即便使能滞回(Hysteresis)功能,还是无法解决SiPM读出测试系统需要解决的问题。本文在说明(三)的基础上,继续探讨为SiPM读出测试系统寻求合适的模拟脉冲检出方案。前四代SiPM使用的高速比较器指标缺陷 由于前端模拟信号属于典型的指数脉冲,所以下降沿转换速率(Slew Rate)过慢,导致比较器检出出现不必要的问题。尽管比较器可以使能滞回(Hysteresis)模块功
    coyoo 2024-12-03 12:20 108浏览
  • 11-29学习笔记11-29学习笔记习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-02 23:58 71浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦