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

1 引言

计算机技术和信息技术的高速发展的今天,计算机和计算机技术大量应用在人们的日常生活中,嵌入式计算机也得到了广泛的应用。 嵌入式计算机是指完成一种或多种特定功能的计算机系统,是软硬件的紧密结合体。具有软件代码小、高度自动化、响应速度快等特点。 特别适合于要求实时和多任务的应用体系。嵌入式实时系统是目前蓬勃发展的行业之一。   但是,实时嵌入式系统的特点使得其软件受时间和空间的严格限制,加上运行环境复杂,使得嵌入式系统软件的开发变得异常困难。 为了设计一个满足功能、性能和死线要求的系统,为了开发出安全可靠的高性能嵌入式系统,开发语言的选择十分重要。

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

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

3 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来明确声明函数不返回任何值。

时间: 2024-09-21 07:50:35

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

Java开发中程序和代码性能优化

现在计算机的处理性能越来越好,加上JDK升级对一些代码的优化,在代码层针对一些细节进行调整可能看不到性能的明显提升,在开发中注意这些,更多的是可以保持一种性能优先的意识. 一 条件控制语句中的优化 1.在循环中应该避免使用复杂的表达式. 在循环中,循环条件会被反复计算,应该避免把一些计算放在循环进行的部分中,程序将会运行的更快.比如: for(int i=0;i<list.size();i++) 可以改为 //我的电脑上,测试数量级在10^7,速度提升一倍. for(int i=0,len=li

Python在实时嵌入式系统开发中扮演的五个主要角色

Python已经成为相当热门的程序语言.它以着名的Monty Python喜剧组命名,属于面向对象和解释型语言(非编译型).该属性使得Python具有良好的跨平台性,比如Linux和Windows,或是诸如Raspberry Pi等单板计算机.随着Python的日益普及,人们可能会问,在实时嵌入式系统中是否也有Python的一席之地. 答案是肯定的.下面是开发人员发现Python在实时嵌入式系统开发中有可能扮演的五个主要角色. 作用# 1设备调试和控制 在嵌入式软件开发过程中,开发人员常常需要分

《Linux嵌入式实时应用开发实战(原书第3版)》——1.5 开源协议

1.5 开源协议 多数软件终端用户协议都明确限制了你只可以使用协议范围内的功能.典型的限制条件是不允许复制或重新发布.你通常会被警告不要试图对软件进行"逆向工程". 相反,开源协议是只要你愿意,就允许使用.修改和复制授权的软件.和权利相伴的是义务.如果你修改并发布了一个开源协议内的软件,你就必须将修改后的源代码也纳入该框架.你的修改就成为"派生的工作",也在该协议的范围内.这就允许其他使用者更好地理解软件,并按他们的意愿做出更多的修改. 开源协议也叫"公共

《Linux嵌入式实时应用开发实战(原书第3版)》——1.3 为什么Linux适用

1.3 为什么Linux适用 Linux模仿UNIX的基本架构,在其基础上发展成为一个通用的操作系统.没有人认为UNIX适用于嵌入式或实时操作系统(RTOS).它太大了,占用太多的资源,而且其调度原则是基于顺序而不是优先级.因此,简而言之,它与嵌入式操作系统的要求完全是背道而驰的. 但是Linux有UNIX系统的早期版本所欠缺的几样东西.它是免费的,而且你可以得到源代码,并且有一个拥有大量热情的Linux开发者和使用者的大社区.你在使用中所面临的问题总有人正遇到或曾经遇到过,所有这些都在网络上,

网络程序设计中的模块化思维

程序|设计|网络 首先,以实际例子说明模块化对于程序编写的重要性.例子就是我们现在采用的动网论坛 1 论坛的配色是一个论坛保持活力的基础,一个好的配色意味着一个论坛成功了一半.但我认为动网论坛的配色是及其浪费资源的,同时后台操作也异常麻烦.首先,它将CSS的各个定义部分存储到数据库,在打开页面时再调用,如--------------------------<%'打开数据库代码省略dim bgcolor1bgcolor1=rs("bgcolor1")rs.closeset rs=n

在ASP程序设计中在使用Response对象 2003

response|程序|对象|设计 Response对象在ASP程序设计中的主要功能是从浏览器端到服务器端传送数据到浏览器的客户端,我们知道ASP的脚本是在服务器端执行的,他并没有输出"值"的功能.要想拥有输出"值",就必须依靠Response对象. 在这里我们将关注其最常用的一些功能.也就是在程序设计中经常要用到的一些功能,具体如下: (1).response.write 发送信息到浏览器 (2). response.end 有效地中止代码 (3).respons

浅谈ASP程序设计中数据库文件调用的捷径

程序|设计|数据|数据库 引言 本文针对ASP程序设计中最基础.也是最关键的部分"数据库文件的调用"进行说明,同时谈谈ASP程序设计中数据库文件调用的一些技巧. ASP简介 ASP(Active Server Pages)是微软于1996年推出的Web应用程序开发技术,它是一种脚本语言.ActiveX组件及HTML语言等的综合,微软把它描述为"一个服务器的脚本环境,在这里可以生成和运行动态的.交互的.高性能的Web服务器应用程序".其主要功能是为生成动态的.交互式的

在ASP程序设计中在使用Response对象

   Response对象在ASP程序设计中的主要功能是从浏览器端到服务器端传送数据到浏览器的客户端,我们知道ASP的脚本是在服务器端执行的,他并没有输出"值"的功能.要想拥有输出"值",就必须依靠Response对象. 在这里我们将关注其最常用的一些功能.也就是在程序设计中经常要用到的一些功能,具体如下: (1).response.write 发送信息到浏览器 (2). response.end 有效地中止代码 (3).response.redirect 页面重定

在ASP程序设计中使用Response对象

Response对象在ASP程序设计中的主要功能是从浏览器端到服务器端传送数据到浏览器的客户端,我们知道ASP的脚本是在服务器端执行的,他并没有输出"值"的功能.要想拥有输出"值",就必须依靠Response对象. 在这里我们将关注其最常用的一些功能.也就是在程序设计中经常要用到的一些功能,具体如下: (1).response.write 发送信息到浏览器 (2). response.end 有效地中止代码 (3).response.redirect 页面重定向 如