编写更嵌入式软件代码的10个技巧

news2024/11/18 9:40:16

代码维护是应用程序开发的重要方面,而为了缩短上市时间,通常会忽略代码维护。对于某些应用程序,这可能不会造成重大问题,因为这些应用程序的寿命很短,或者已部署该应用程序,并且再也不会碰它。

但是,嵌入式系统应用程序的使用寿命可能长达数十年,这意味着一些早期的错误可能会在以后导致可观的成本。

在开发可能具有长寿命的嵌入式应用程序时,在设计和实现上都必须考虑维护。以下技巧绝不会构成一个完整列表,但是它们解决了一些常见问题,这些问题可能会使您的应用程序维护者有理由诅咒您的名字,并且不要忘记您可能是其中之一!

提示1:避免使用汇编代码

当然,在低端PIC上您别无选择,而在高端ARM上您可能不需要它,但是在这两种极端之间,有很多平台使用汇编代码来实现以下目的:提高性能并减少代码大小。但是,问题在于,简单地选择使用汇编代码可能会使您的项目脱轨,并使您陷入困境。

尽管汇编代码允许您直接访问机器的功能,但由于难以理解程序中正在发生的事情,因此可以轻易地忽略性能优势。正是出于这个原因,构思了高级语言,例如C和Java。

由于调试高级语言的安全功能非常容易,因此请在调试时将每条汇编代码都视为可疑的。如果必须使用汇编,请在发表评论时尽量保持谨慎。在C或Java中,注释可以使代码混乱,但是将注释组合在一起可以节省大量时间和挫败感。

您可以选择注释汇编块,但请确保每个块中的指令不超过5或6条。理想情况下,应该在注释中直接用伪代码拼写所使用的算法(请参阅提示8)。

提示2:避免注释蠕变

这是一个通用的编程提示,但是在长寿命应用程序中变得尤为重要的提示“管理您的注释与它们记录的代码的关联。随着代码的更新,注释的迁移非常容易,并且结果很难理解。以下示例说明了随着时间的推移,注释蠕变的发生有多么容易:

//此函数将两个数字相加并返回结果 #if __DEBUG voidprintNumber(int num){ printf(“ Output:%dn”,num);

} #万一

//此函数将两个数字相乘并返回结果 整数乘(整数,整数b){

返回a * b; }

int add(int a,intb){

#if __DEBUG //调试输出 printNumber(a + b); #万一 返回a + b; }

请注意,功能“添加”的注释位于列表的顶部,而实际功能则位于下方。如果注释和函数之间存在空格,则可能会超时发生。

可能的原因是在'add'及其注释描述之间添加了printNumber函数。后来,有人看到有一个加法函数,并且在其上加上multiplenext似乎是合乎逻辑的”,注释的蠕变导致代码内的文档脱节。要解决此问题,请尝试将代码保留在其文档的功能内,或通过在注释上方和下方插入行来使注释块非常明显。

提示3:不要过早优化。

编程的主要缺点之一是过早的优化。但是,由于时间限制,草率的编码或过分热心的工程师,该规则在实践中经常被打破。您编写的任何程序都应尽可能简单地开始,并且仍然提供所需的功能。“如果需要性能,请尝试简单地实现该程序,即使它与性能不匹配。

一旦测试并调试了完整的单元(它是大型系统的编程器或组件),然后回去进行优化。危险地优化代码会导致维护噩梦,因为优化后的代码通常较难理解,并且您可能无法理解您需要的性能结果。理想情况下,使用探查器(例如与GCC一起使用的gprof或Intel的VTune)来查看瓶颈所在,并专注于这些领域-真正缓慢的事情可能会让您感到惊讶。

提示4:ISR应该很简单

出于性能和维护方面的考虑,中断服务例程(ISR)应该尽可能简单。作为异步性质的ISR本质上比“常规”程序代码更难调试,因此将其责任降到最低对于您的应用程序的总体可维护性很重要。尝试将所有数据处理移出ISR并移至主程序中,然后ISR仅负责获取数据(例如,从硬件中获取)并将其放置在缓冲区中以备后用。可以使用一个简单的标志来向主程序发出信号,通知有要处理的数据。

提示5:将调试代码保留在源文件中

在开发过程中,您可能会添加大量旨在调试“详细输出,声明,LED闪烁等”的代码。当项目结束时,可能很想删除其中的这些部分。代码以清理整个应用程序,尤其是在随意添加调试代码的情况下。

尽管清理应用程序是一个崇高的追求,但是删除调试代码会在以后产生问题。任何试图维护该代码的人都可能会复制原始开发中创建的许多步骤,“如果代码已经存在,则维护变得非常容易。如果需要在生产版本中删除代码,请使用条件编译或将调试代码放在中央模块或库中,不要将其链接到生产版本中。应用程序的初始开发应包括编写文档和清理调试代码的时间;花费的额外时间将是值得的。

技巧6:为系统调用编写包装器

尝试通过接口将低级I / O例程与高级程序逻辑分开,因为通过单片开发可以使程序难以管理。将应用程序的所有功能放到几个大功能中会使代码难以理解,并且更难更新和调试。对于硬件接口尤其如此。您可能可以直接访问硬件寄存器或I / O,甚至可以访问平台供应商提供的API,但是有很多动机来创建自己的“包装程序”接口。

您通常无法控制硬件的功能,并且如果将来将来必须更改平台,则在应用程序中使用特定于硬件的代码(API或直接操作,这无关紧要)将使移植更加困难。

如果您创建自己的包装器接口,就像创建为硬件API定义的宏一样简单,则代码可以是一致的,并且移植所需的所有更新都将位于集中位置。

提示7:仅分解功能

嵌入式应用程序将与PC应用程序不同,因为许多功能将专用于您正在使用的硬件。不建议将功能单元尽可能地拆分为最小–将单个作用域(功能)中的功能调用数保持在5或6以下,并使硬件的功能单元与软件中的功能单元相对应。

进一步分解程序将创建调用图的蜘蛛网,从而使调试和理解变得困难。

提示8:文档

保留所有文档以及代码,理想情况下,还应保留硬件副本。在记录应用程序时,请尝试将尽可能多的设计和应用程序模型直接放入源代码中。如果必须将其分开,则将其作为巨大的注释放入源文件中,并将其链接到程序中。

至少,如果您使用版本控制系统(例如CVS或Microsoft Source Safe),则将文档与源代码检查到同一目录中-如果不与源代码一起放置,则丢失文档确实很容易。

理想情况下,将所有文档和源文件放在CD(或您选择的便携式存储设备)上,将其与使用的硬件和开发工具一起密封在袋子中,然后将其放在安全的地方“您的后继者将感谢您。

提示9:不要机灵!

类似于过早的优化,聪明的编码会导致麻烦。由于C和C ++仍然是嵌入式世界中的主导语言,因此有很多方法可以解决一个问题。模板,继承,goto,三元运算符(“?”),列表会不断出现。

真正聪明的程序员可以提出使用这些工具解决问题的极其紧凑和优雅的方法。问题是通常只有程序员才能理解聪明的解决方案(以后可能会忘记它是如何工作的)。

唯一的解决方案是例如避免聪明,并尽量减少使用深奥的语言功能”,例如,不要依赖C语句中的短路评估,也不要使用三元运算符进行程序控制(使用if语句代替)。

提示10:将所有定义放在

一个地方 如果您有很多常量定义或条件定义,请将它们放在中央位置。这可能是单个文件或源代码目录,但是如果将定义深埋在实现中,它会再次咬住您。

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!(点击找小助理领取)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1001625.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UIScrollView setContentOffset: animated:

项目中遇到感觉一切都设置对了,但是看到的效果和预想的不一样。 后来查询了一番,才知道问题所在,现在记录一下,担心过后又忘了。 最初的问题是这样的,这个热度只有在评论里有,点击赞的时候,热度…

视频号的视频怎么下载,有什么下载工具推荐

视频下载助手去水印小工具是一款方便实用的工具,可以帮助用户在下载视频的时候可以一键去除视频中的水印。 该工具支持多种视频平台的去水印功能,如抖音、快手、小红书、视频号、公众号文字视频、西瓜视频、哔哩哔哩、微博视频、多多视频等。 经过亲自测…

为什么女程序员那么稀缺?女程序员吃不吃香?

程序员脱单一直是个难题,这里的一个客观原因就是程序员群体的男女比例严重失衡(比如我司达到了2:8),身边的工作环境缺少异性,大老爷们天天混在一起,脱单自然也就更加困难了。 女程序员那么稀缺&#xff0c…

《Python深度学习-Keras》精华笔记3:解决深度学习多分类问题

公众号:机器学习杂货店作者:Peter编辑:Peter 持续更新《Python深度学习》一书的精华内容,仅作为学习笔记分享。 本文是第三篇:介绍如何使用Keras解决Python深度学习中的多分类问题。 多分类问题和二分类问题的区别注意…

180页的Python完全版电子书

大家好,我是涛哥。 Python学习有很多方式,可以从基础一步步看语法, 可以从案例一步步学习,本篇内容就是通过案例进行讲解,方便大家一步一步进行学习实战。 整个内容经过几个月总结《Python之路2.0.pdf》&#xff0c…

基于 Python 的音乐流派分类

音乐就像一面镜子,它可以告诉人们很多关于你是谁,你关心什么,不管你喜欢与否。我们喜欢说“you are what you stream” - Spotify Spotify 拥有 260 亿美元的净资产,是如今很受欢迎的音乐流媒体平台。它目前在其数据库中拥有数百…

Java拓展--空间复杂度和时间复杂度

空间复杂度和时间复杂度 文章目录 空间复杂度和时间复杂度空间复杂度时间复杂度**评价排序算法****时间频度****什么是时间频度****忽略常数项****忽略低次项****忽略系数** **时间复杂度****什么是时间复杂度****计算时间复杂度的方法****常见的时间复杂度** **常见的时间复杂…

正中优配:证券融资融券是什么意思?

证券融资融券(简称“融资融券”)是一种股票出资办法,是指出资者经过融券生意和融资生意来进行股票出资。它在出资商场上具有重要的作用,因为经过这种办法,出资者能够使用假贷资金进行股票生意,能够进步出资…

腾讯云4核8G服务器选CVM还是轻量比较好?价格对比

腾讯云4核8G云服务器可以选择轻量应用服务器或CVM云服务器标准型S5实例,轻量4核8G12M服务器446元一年,CVM S5云服务器935元一年,相对于云服务器CVM,轻量应用服务器性价比更高,轻量服务器CPU和CVM有区别吗?性…

23062C++QTday4

仿照string类&#xff0c;完成myString 类 代码&#xff1a; #include <iostream> #include <cstring> using namespace std; class myString {private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度public://无参构造my…

华为云云耀云服务器L实例评测 | 由于自己原因导致MySQL数据库被攻击 【更新中。。。】

目录 引出起因&#xff08;si因&#xff09;解决报错诶嘿&#xff0c;连上了 不出意外&#xff0c;就出意外了打开数据库what&#xff1f;&#xff1f;&#xff1f; 找华为云求助教训&#xff1a;备份教训&#xff1a;密码 解决1.改密码2.新建一个MySQL&#xff0c;密码设置复杂…

Android T 窗口层级其三 —— 层级结构树添加窗口

文章目录 序节点添加Task以DefaultTaskDisplayArea为父节点以Task为父节点 ActivityRecordWindowTokenWindowState以WindowToken为父节点以ActivityRecord为父节点 小结调用场景添加差异 流程分析添加log堆栈打印流程LauncherStatusBar 序 尚未添加窗口的层级结构树&#xff0…

前端该了解的网络知识

网络 前端开发需要了解的网络知识 URL URL(uniform resource locator,统一资源定位符)用于定位网络服务. URL是一个固定格式的字符串 它表达了: 从网络中哪台计算机(domain)中的哪个服务(port),获取服务器上资源的路径(path),以及要用什么样的协议通信(schema). 注意: 当…

探索Netty的FuturePromise

Netty—Future&Promise 一、JDK原生 Future二、Netty包下的 Future三、Promise1、使用Promise同步获取结果2、使用Promise异步获取结果.3、使用Promise同步获取异常 - sync & get4、使用Promise同步获取异常 - await5、使用Promise异步获取异常 在异步处理时&#xff0…

颜色代码对照表

颜色代码对照表 各颜色代码: 1 白色 #FFFFFF 2 红色 #FF0000 3 绿色 #00FF00 4 蓝色 #0000FF 5 牡丹红 #FF00FF 6 青色 #00FFFF 7 黄色 #FFFF00 8 黑色 #000000 9 海蓝 #70DB93 …

出行类APP商业化路径解决方案

当下市场主流的商业化路径和方法相比于之前区别不大&#xff0c;开发者们都是在现有商业化体系下&#xff0c;制定更加详细、优质的策略&#xff0c;以期获得更高利益。 出行类App用户结构分析 年龄层次&#xff1a;出行类App用户的年龄分布比较广泛&#xff0c;主要集中在20…

商品防伪查询溯源小程序开发源码

企业商家在销售商品的过程中被人仿冒产品以次充好损害公司名声和影响产品销量是很多企业的痛点。我们基于次帮助企业开发了一款商品防伪溯源查询小程序&#xff0c;解决企业痛点&#xff0c;酿造更好的经商坏境。 核心功能&#xff1a; 我们采用一物一码的逻辑&#xff0c;可…

【网络基础】——HTTPS

目录 HTTPS背景知识 HTTPS是什么&#xff1f; 加密解密 为什么要加密 常见的加密方式 对称加密 非对称加密 数据摘要&&数据指纹 数字签名 HTTPS工作过程探究 方案1&#xff1a;只使用对称加密 方案2&#xff1a;只使用非对称加密 方案3&#xff1a;双方…

day37 线程

一、线程安全 二、多线程并发的安全问题 当多个线程并发操作同一临界资源 由于线程切换实际不确定 导致操作顺序出现混乱 产生的程序bug 严重时出现系统瘫痪 临界资源 &#xff1a;操作该资源的完整流程同一时间只能被单一线程操作的资源 多线程并发会出现的各种问题、 如…

IT运维:使用数据分析平台监控奇安信

监控目标 本文基于鸿鹄2.10.0版本。 ●监控奇安信日志类型分布 ●监控奇安信攻击行为、分析攻击类型 ●监控奇安信攻击来源情况 操作步骤 数据导入 1、创建数据集&#xff0c;如使用已经存在的数据集&#xff0c;可跳过此步骤 数据集名称&#xff1a;qax_syslog&#xff08;仪表…