嵌入式实时程序设计中C/C++代码的优化

C/C++项目实战:用C++打造公交查询系统,实现动态实时更新 公交查询系统是为推进地名信息服务工作,软件基于ACESS数据库,只要将公交站点等信息输入数据库,就可以很快构建成一个简单、实用的本地公交查询系统。 实现界面如下: 项目结构展示: 部分源码展示: C++编写的城市公交车查询系统,需要先配置数据源,这个小系统能够按车次、车站查询公交车,会列出查询路线所经过的停靠点,在VC6下顺利编译。 最后,如果你在学习C/C++的过程中遇到了问题,可以来... 阅读详情
   

[关键词] :嵌入式 实时操作系统(RTOS) C/C++ 优化

摘要:本文简单介绍了嵌入式实时程序设计的特点和嵌入式系统设计中语言的选择,着重介绍了以下几种在嵌入式实时程序设计中优化C/C++代码的方法

一 引言

    计算机技术和信息技术高速发展的今天,计算机和计算机技术大量应用在人们的日常生活中,嵌入式计算机也得到了广泛的应用,嵌入式计算机是指完成一种或多种特定功能的计算机系统,是软硬件的紧密结合体。具有软件代码小,高度自动化,响应速度快等特点。特别适合于要求实时和多任务的应用体系。嵌入式实时系统是目前蓬勃发展的行业之一。

    但是,实时嵌入式系统的特点使得其软件受时间和空间的严格限制,加上运行环境复杂,使得嵌入式系统软件的开发变得异常困难,为了设计一个满足功能、性能和死线要求的系统。为了开发出安全可靠的高性能的嵌入式系统,开发语言的选择十分重要。

二 嵌入式实时程序设计中语言的选择

    随着嵌入式系统应用范围的不断扩大和嵌入式实时操作系统RTOS(Real Time Operating System)的广泛使用,高级语言编程已是嵌入式系统设计的必然趋势。因为汇编语言和具体的微处理器的硬件结构密切相关,移植性较差,既不宜在复杂系统中使用,又不便于实现软件重用;而高级语言具有良好的通用性和丰富的软件支持,便于推广,易于维护,因此高级语言编程具有许多优势。目前,在嵌入式系统开发过程中使用的语言种类很多,但仅有少数几种语言得到了比较广泛的应用。其中C和C++是应用最广泛的。C++在支持现代软件工程、OOP(Object Oriented Programming, 面向对象的程序设计)、结构化等方面对C进行了卓有成效的改进,但在程序代码容量、执行速度、程序复杂程度等方面比C语言程序性能差一些。由于C语言既有低级语言的直接控制硬件的能力,又有高级语言的灵活性,是目前在嵌入式系统中应用最广泛的编程语言。随着网络技术和嵌入式技术的不断发展,Java及嵌入式Java的应用也得到了广泛的应用。

三 C/C++代码在实时程序设计中的优化

    虽然使软件正确是一个工程合乎逻辑的最后一个步骤,但是在嵌入式的系统开发中,情况并不总是这样的。出于对低价产品的需求,硬件的设计者需要提供刚好足够的存储器和完成工作的处理能力。所以在嵌入式软件设计的最后一个阶段则变成了对代码的优化。

    现代的C和C++编译器都提供了一定程度上的代码优化,然而,大部分由编译器执行的优化仅涉及执行速度和代码大小的一个平衡。你的程序能够变得更快或者更小,但是不可能又变快又变小。经过本人在嵌入式系统设计和实现过程中实践,下面介绍几种简单且行之有效的C/C++代码的优化方法。

1.Inline函数

    在C++中,关键字Inline可以被加入到任何函数的声明中。这个关键字请求编译器用函数内部的代码替换所有对于指出的函数的调用。这样做在两个方面快于函数调用:第一,省去了调用指令需要的执行时间;第二,省去了传递变元和传递过程需要的时间。但是使用这种方法在优化程序速度的同时,程序长度变大了,因此需要更多的ROM。使用这种优化在Inline函数频繁调用并且只包含几行代码的时候是最有效的。

2.用指针代替数组

    在许多种情况下,可以用指针运算代替数组索引,这样做常常能产生又快又短的代码。与数组索引相比,指针一般能使代码速度更快,占用空间更少。使用多维数组时差异更明显。下面的代码的作用是相同的,但是效率不一样。

数组索引 指针运算

For(;;){ p=array

A=array[t++]; for(;;){

a=*(p++);

...... ......

} }

    指针方法的优点是,array的地址每次装入地址p后,每次循环中,只需对p增量操作。在数组索引方法中,每次循环中都必须进行基于t值求数组下标的复杂运算。

3.不定义不使用的返回值

    function函数定义并不知道函数返回值是否被使用,假如返回值从来不会被用到,应该使用void来明确声明函数不返回任何值。

4.手动编写汇编

    在嵌入式软件开发中,一些软件模块最好用汇编语言来写,这可以使程序更加的有效。虽然C/C++编译器对代码进行了优化,但是适当的使用内联汇编指令可以有效的提高整个系统运行的效率。

5.使用寄存器变量

    在声明局部变量的时候可以使用register关键字。这就使得编译器把变量放入一个多用途的寄存器中,而不是在堆栈中,合理使用这种方法可以提高执行速度。函数调用越是频繁,越是可能提高代码的速度。

6.使用增量和减量操作符

    在用到加一和减一操作时尽量使用增量和减量操作符,因为增量符语句比赋值语句更快,原因在于对大多数CPU来说,对内存字的增、减量操作不必明显地使用取内存和写内存的指令,比如下面这条语句:

x=x+1;

模仿大多数微机汇编语言为例, 产生的代码类似于:

move A,x ; 把x从内存取出存入累加器A

add A,1 ; 累加器A加1

store x ; 把新值存回x

如果使用增量操作符,生成的代码如下:

incr x ; x加1

    显然,不用取指令和存指令,增、减量操作执行的速度加快,同时长度也缩短了。

7.减少函数调用参数

    使用全局变量比函数传递参数更加有效率。这样做去除了函数调用参数入栈和函数完成后参数出栈所需要的时间。然而决定使用全局变量会影响程序的模块化和重入,所以要慎重使用。

8.Switch语句中根据发生频率来进行case排序

    switch语句是一个普通的编程技术,编译器会产生if-else-if的嵌套代码,并按照顺序进行比较,发现匹配时,就跳转到满足条件的语句执行。使用时需要注意。每一个由机器语言实现的测试和跳转仅仅是为了决定下一步要做什么,就把宝贵的处理器时间耗尽。为了提高速度,设法把具体的情况按照它们发生的相对频率排序。换句话说,把最可能发生的情况放在第一位,最不可能的情况放在最后。

9.将大的switch语句转为嵌套switch语句

    当switch语句中的case标号很多时,为了减少比较的次数,明智的做法是把大switch语句转为嵌套switch语句。把发生频率高的case标号放在一个switch语句中,并且是嵌套switch语句的最外层,发生相对频率相对低的case标号放在另一个switch语句中。比如,下面的程序段把相对发生频率低的情况放在缺省的case标号内。

pMsg = ReceiveMessage();

switch (pMsg->type)

{

case FREQUENT_MSG1:

handleFrequentMsg1();

break;

case FREQUENT_MSG2:

handleFrequentMsg2();

break;

. . . . . .

case FREQUENT_MSGn:

handleFrequentMsgn();

break;

default:

// 嵌套部分用来处理不经常发生的消息

switch (pMsg->type)

{

case INFREQUENT_MSG1:

handleInfrequentMsg1();

break;

case INFREQUENT_MSG2:

handleInfrequentMsg2();

break;

......

case INFREQUENT_MSGm:

handleInfrequentMsgm();

break;

}

}

    如果switch中每一种情况下都有很多的工作要做,那么把整个switch语句用一个指向函数指针的表来替换会更加有效,比如下面的switch语句,有三种情况:

enum MsgType{Msg1, Msg2, Msg3 }

switch (ReceiveMessage()

{

case Msg1:

......

case Msg2:

......

case Msg3:

......

}

为了提高执行速度,用下面这段代码来替换这个上面的switch语句。

/*准备工作*/

int handleMsg1(void);

int handleMsg2(void);

int handleMsg3(void);

/*创建一个函数指针数组*/

int (*MsgFunction[])() = { handleMsg1, handleMsg2,handleMsg3};

/*用下面这行更有效的代码来替换switch语句*/

status = MsgFunction[ReceiveMessage()]();

10.避免使用C++的昂贵特性

    C++在支持现代软件工程、OOP、结构化等方面对C进行了卓有成效的改进,但在程序代码容量、执行速度、程序复杂程度等方面比C语言程序性能差一些。并不是所有的C++特性都是昂贵的,比如,类的定义是完全有益的。公有和私有成员数据及函数的列表与一个 struct及函数原形的列表并没有很大的差别。单纯的加入类即不会影响代码的大小,也不会影响程序的效率。但C++的多重继承、虚拟基类、模板、异常处理及运行类型识别等特性对代码的大小和效率有负面的影响,因此对于C ++的一些特性要慎重使用,可以做些实验看看它们对应用程序的影响。

四 总结语

    在嵌入式实时程序设计时可以运用上面介绍的一种或多种技术来优化代码。上面介绍的方法主要是为了提高代码的效率。但是事实上,在使用这些技术提高代码运行速度的同时会相应的产生一些负面的影响,比如增加代码的大小,降低程序可读性等。不过你可以让C/C++编译器来进行减少代码大小的优化,而手动的利用以上技术来减少代码执行的时间。

    在嵌入式程序设计中合理地使用这几种技术有时会达到很好的优化效果。

参考文献

1.Labrosse Jean J. u C/OS-II—源码公开的实时嵌入式操作系统. 邵贝贝. 北京:中国电力出版社,2001

2.Rich Grenhan, Robert Moote, Ingo Cyliax. 32位嵌入式系统编程. 许汝峰译. 北京:中国电力出版社

3.马忠梅. 嵌入式C编程技术(一)—(六),单片机与嵌入式系统应用.20001,1-6

4.孙祥营,柏桂枝. 嵌入式实时操作系统VxWorks及其开发环境Tornado.北京中国电力出版社,2001.11

转自http://blog.163.com/alan3902@126/blog/?clsId=fks_094064082085084071084085074075092083089065084081&class=#pn2感谢原作者。

HFSS实战项目——GPS北斗双模微带天线 本文设计了一款方形圆极化微带天线应用于北斗B1和GPSL1频段,满足高增益、低VSWR、适当方向图等要求。设计中心频率为1568MHz,介质板采用厚度h=1.6mm的Arlon AD450(tm)板,相对介电常数为4.5,采用探针馈电。 阅读详情

相关推荐

使用SSE流式输出(Javaweb前后端实战)

SSE(Server-Sent Events)是一种在Web应用中实现单向实时通信的技术。通过SSE,服务器可以主动向客户端发送更新,而无需客户端不断发起请求。这对于需要实时更新的应用场景(如聊天应用、实时数据监控等)非常有用。(服务端单向传输客户端,长连接)

记得开心一点嘛的博客 1万+

嵌入式系统中的实时操作系统选择与优化

不同的实时操作系统具有不同的调度算法、内核架构、支持的功能和特性,因此在选择实时操作系统时需要根据具体的应用需求进行综合考量。其次,针对所选择的实时操作系统,进行系统级和应用级的优化是至关重要的。通过综合考量应用需求、硬件特性和实时操作系统特性,并进行系统级和应用级的优化,能够有效提升嵌入式系统的整体性能和可靠性,满足不同领域的实时控制和数据处理需求。选择具有良好跨平台支持和稳定性的实时操作系统,并在开发过程中遵循良好的软件工程实践,能够有效降低系统维护成本,提高系统的可维护性和可扩展性。

2401_83158334的博客 575

Python 中调用 R 语言的教程(包含编码问题解决办法)

rpy2 是一个 Python 库,允许在 Python 中直接运行 R 代码并实现数据转换。安装需确保 Python 和 R 环境正确配置,Windows 用户需注意编码问题(GBK 错误可通过控制面板调整区域设置解决)。基本用法包括执行 R 代码、传递数据(支持 Python 与 R 数据类型自动转换)以及调用 R 包函数。通过 robjects.r() 执行 R 代码,使用 pandas2ri 转换器处理 DataFrame 数据交换,并支持像导入 Python 模块一样加载 R 包(如 import

zygalaxy的博客 995

嵌入式实时程序设计C/C++代码优化

1 引言计算机技术和信息技术的高速发展的今天,计算机和计算机技术大量应用在人们的日常生活中,嵌入式计算机也得到了广泛的应用。嵌入式计算机是指完成一种或多种特定功能的计算机系统,是软硬件的紧密结合体。具有软件代码小、高度自动化、响应速度快等特点。特别适合于要求实时和多任务的应用体系。嵌入式实时系统是目前蓬勃发展的行业之一。但是,实时嵌入式系统的特点使得其软

397

STM32 FOC电机控制:手把手教你用CubeMX配置TIM1中心对齐PWM(含代码避坑)

本文详细解析了STM32 FOC电机控制中TIM1中心对齐PWM的配置方法,涵盖CubeMX图形化设置、HAL库代码调用及常见问题排查。特别针对L6230Q驱动芯片的使能逻辑和死区时间配置提供实用指南,帮助开发者高效实现无刷电机的高性能控制。

weixin_27027459的博客 442

GNSS-RTK/INS紧组合里,那个‘杆臂改正’到底怎么算?一个公式讲清INS与天线位置的关系

本文深入解析GNSS-RTK/INS紧组合导航系统中的杆臂改正(Lever Arm Correction)原理与实现方法。详细介绍了杆臂效应的物理本质、数学建模及误差扰动分析,揭示了IMU与GNSS天线位置关系的核心公式,并提供了工程实现中的常见误区与验证方法。通过Python代码示例和紧组合量测模型处理流程,帮助开发者准确理解并应用这一关键技术。

weixin_33137081的博客 356

嵌入式实时程序设计C/C++的代码优化

1 引言 计算机技术和信息技术的高速发展的今天,计算机和计算机技术大量应用在人们的日常生活中,嵌入式计算机也得到了广泛的应用。 嵌入式计算机是指完成一种或多种特定功能的计算机系统,是软硬件的紧密结合体。具有软件代码小、高度自动化、响应速度快等特点。 特别适合于要求实时和多任务的应用体系。嵌入式实时系统是目前蓬勃发展的行业之一。 但是,实时嵌入式系统的特点使得其软件受时间和空间的严格限制,加

痞子龙3D编程 1416

交通仿真软件:SUMO_(13).Python脚本与TraCI接口

通过TraCI接口,用户可以实现与SUMO仿真器的实时交互,获取和控制交通数据。本文档详细介绍了如何使用Python脚本与TraCI接口进行交互,包括基本的设置、数据获取和控制方法。此外,还展示了几个高级应用示例,如交通流优化、多代理系统、车辆路径规划和车辆行为模拟。这些示例可以帮助用户更好地理解如何利用TraCI接口进行复杂的交通仿真和分析。希望这些内容对您有所帮助,如果您有任何问题或需要进一步的帮助,请参考SUMO的官方文档或社区支持。

kkchenjj的博客 995

GitHub日榜深度解读:从趋势洞察到热榜项目筛选与安全上手

在技术迭代加速的今天,开发者往往通过热门榜单快速捕捉前沿动态。GitHub Trending 作为最直观的开发者注意力风向标,其日榜并非简单的新闻聚合,而是基于 star 增量、fork 数、issue 活跃度与提交频率等维度绘制的技术热点“体温计”。理解其增量逻辑与时间窗口特性,能帮助开发者从海量仓库中识别出正在快速扩散的 AI 编码工具、复兴的 CLI 应用以及长期稳居前列的工程化基础设施。掌握科学的上手流程同样关键:从浅克隆拉取、优先使用 Release 产物、准备隔离环境,到通过提交记录、许可证、依

weixin_33853827的博客 418

时间序列分析(Time Series Analysis) 原理与代码实例讲解

时间序列分析(Time Series Analysis) - 原理与代码实例讲解 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming 关键词:时间序列预测,ARIMA模型,状态空间模型,SARIMA模型,机器学习

AI天才研究院 1247

OpenCV实例(八)车牌字符识别技术(三)汉字识别

相较于数字和英文字符的识别,汽车牌照中的汉字字符识别的难度更大,主要原因有以下4个方面:(1)字符笔画因切分误差导致非笔画或笔画流失。(2)汽车牌照被污染导致字符上出现污垢。(3)采集所得车辆图像分辨率低导致多笔画的汉字较难分辨。(4)车辆图像采集时所受光照影响的差异导致笔画较淡。综合汉字识别时的这些难点来看,很难被直接提取的是字符的局部特征。笔画作为最重要的特征而仅存在于汉字中,这由先验知识可知。一旦捺、横、竖、撇这些笔画特征被提取到,对于汉字字符识别的工作就完成了许多。

小幽余生不加糖 1650

2024年最全cpp程序优化 嵌入式C C++代码优化 C C++代码优化具体方案_c+(2),关于C C++性能优化的几点建议

/ 复杂计算 优化后函数为:i!= num2;i++) {});运行结果为:1.引言计算机技术和信息技术的高速发展的今天,计算机和计算机技术大量应用在人们的日常生活中,嵌入式计算机也得到了广泛的应用。嵌入式计算机是指完成一种或多种特定功能的计算机系统,是软硬件的紧密结合体。具有软件代码小、高度自动化、响应速度快等特点。特别适合于要求实时和多任务的应用体系。嵌入式实时系统是目前蓬勃发展的行业之一。但是,实时嵌入式系统的特点使得其软件受时间和空间的严格限制,

2401_84975387的博客 906

Cesium 实战 04 - 标绘功能系列之画点(draw point)

Cesium 实战 - 标绘功能之画点(draw point)。

非科班Java出身GISer的博客 1084

C/C++代码优化汇总二则(转)

C/C++代码优化汇总二则(转) 一、如何优化单片机C语言代码(程序员必读)  1、选择合适的算法和数据结构 应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍。将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序法用快速排序、合并排序或根排序代替,都可以大大提高程序执行的效率。.选择一种合适的数据结构也很

feihuadao的专栏 751

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

如何优化C/C++语言代码(程序员必读)

如何优化C/C++语言代码(程序员必读) 1、选择合适的算法和数据结构       应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍。将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序法用快速排序、合并排序或根排序代替,都可以大大提高程序执行的效率。.选择一种合适的数据结构也很重要,比如你在一堆随机存放的数中使用

zhushh的专栏 744

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

如何优化C语言代码

如何优化C语言代码(程序员必读)[转] www.diybl.com    时间 : 2008-09-25  作者:佚名   编辑:本站 点击:  261 [ 评论 ] - - 1、选择合适的算法和数据结构     应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍。将比较慢的顺序查找法用较快的二分

yuyin86的专栏 595

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: 在DSP 线性汇编中可否调用C函数,如何调用
下一篇: 学习要扎实
ciompmq
博客等级 码龄19年 15粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值