自动化在线 自动化在线 数据加载中... 数据加载中...
首页 | 下载系统 | 供求信息 | 新闻系统 | 企业信息 | 产品信息 | 展会信息 | 论坛
首页 > 新闻系统 > 嵌入式系统 > 嵌入式系统技术
 
嵌入式系统编程中的代码优化
作者: 发布时间:2007-12-16 04:43:01 来源:www.ednchina.com  繁体版
欢迎访问www.autooo.net

  #define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)

  #define BIT_MASK(__bf) (((1U << (bw ## __bf)) - 1) << (bs ## __bf))

  #define SET_BITS(__dst, __bf, __val) ((__dst) = ((__dst) & ~(BIT_MASK(__bf))) | (((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))

  SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);

  函数和宏函数的区别就在于,宏函数占用了大量的空间,而函数占用了时间。函数调用是要使用系统的栈来保存数据的,如果编译器里有栈检查选项,一般在函数的头会嵌入一些汇编语句对当前栈进行检查;同 
时,CPU也要在函数调用时保存和恢复当前的现场,进行压栈和弹栈操作,所以,函数调用需要一些CPU时间。而宏函数不存在这个问题。宏函数仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是占用了空间,在频繁调用同一个宏函数的时候,该现象尤其突出。

  Data optimization数据优化

  比算法优化层低一级的是数据优化层,我们可以通过改变算法使用的数据类型来优化算法。主要的目的是使处理的数据和目标结构的特性相一致。这项优化不需要大量的代码重写,并独立于算法优化的执行而执行.例如:

  确定浮点型变量和表达式是 float 型

  为了让编译器产生更好的代码,必须确定浮点型变量和表达式是 float 型的。要特别注意的是,以 ";F"; 或 ";f"; 为后缀(比如:2.718f)的浮点常量才是 float 型,否则默认是 double 型。为了避免 float 型参数自动转化为 double,请在函数声明时使用 float。

  使用32位的数据类型

  编译器有很多种,但它们都包含的典型的32位类型是:int,signed,signed int,unsigned,unsigned int,long,signed long,long int,signed long int,unsigned long

,unsigned long int。尽量使用32位的数据类型,因为它们比16位的数据甚至8位的数据更有效率。

  明智使用有符号整型变量

  在很多情况下,你需要考虑整型变量是有符号还是无符号类型的。在许多地方,考虑是否使用有符号的变量是必要的。在一些情况下,有符号的运算比较快;但在一些情况下却相反。 比如:整型到浮点转化时,使用大于16位的有符号整型比较快。因为x86构架中提供了从有符号整型转化到浮点型的指令,但没有提供从无符号整型转化到浮点的指令。在整数运算中计算商和余数时,使用无符号类型比较快。

  Instruction flow optimization指令流优化

  第三层优化的目标是低级指令流。比较常见的技术是循环合并(loop merging),循环展开(unrolling),软件流水(software pipelining)。

  循环合并

  如果两个循环计数差不多、循环执行互不相同的操作,可以把它们合并在一起组成一个循环。当两个循环的负荷都不满时,这是非常有用的。

  循环展开

  循环展开就是把循环计数小的循环展开,成为非循环形式的串行程序,或者把循环计数大的循环部分展开,减少循环迭代次数,这样可以节省了用于循环设置、初始化、增加和校对循环计数器的时间。大多数编译器可以自动完成这项工作,手工编译会出现错例如:

  for( int i = 0; i < 3; i++ ) array[i] = i;

  逻辑上等同于:

  array[0] = 0; array[1] = 1, array[2] = 2;

  软件流水

  软件流水是用来安排循环指令,使这个循环多次迭代并行执行的一种技术。在嵌套循环中,编译器仅对最里面的循环执行软件流水,因此对执行周期很少的内循环作循环展开,外循环进行软件流水,这样可以改进C代码并行执行的性能。使用软件流水还应当注意:尽管软件流水循环可以包含内联函数,但是不能包含函数调用;在循环中不可以有条件终止指令;在循环体中不可以修改循环控制变量。

  3、总结语

  现代的C和C++编译器都提供了一定程度上的代码优化。然而,大部分由编译器执行的优化仅涉及执行速度和代码大小的一个平衡。你的程序能够变得更快或者更小,但是不可能又变快又变小。上面介绍的方法主要是为了提高代码的效率。但是事实上,在使用这些技术提高代码运行速度的同时会相应的产生一些负面的影响,比如增加代码的大小、降低程序可读性等。不过你可以让C/C++编 译器来进行减少代码大小的优化,而手动利用编程来减少代码的执行时间。在嵌入式程序设计中合理地使用这几种技术有时会达到很好 的优化效果。

欢迎访问www.autooo.net
  
评论】【加入收藏夹】【 】【打印】【关闭
来顶一下
近回首页
返回首页
※ 相关信息
 ·鑫弘宇线切割变频器,线切割专用  (2008-08-06)
 ·洛阳市洛龙区鑫弘宇电子设备厂  (2008-08-04)
 ·ATM自动柜员机安全防范报警系统A  (2008-08-04)
 ·线切割机床专用变频器  (2008-07-31)
 ·线切割机床专用变频器专业制造姜  (2008-07-29)
 ·六月巨献,华北工控高端全长CPU卡  (2008-07-02)
 ·移动联通野外基站防盗报警系统   (2008-05-23)
 ·变压器防盗器,电力报警器,电力  (2008-05-23)
 ·热门技术PLC西门子S7-300,400,  (2008-05-19)
 ·热门技术PLC西门子S7-300,400,  (2008-05-15)

关键:优化  代码  编程  系统  嵌入式  循环  函数  使用  软件  语句  

※ 其他信息
高速DSP与PC实现串口通信的方法
LwIP协议在μC/OS操作系统中的实现
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

 
 搜索新闻
 最新新闻
·货架
·孟加拉纺织机械展/第六届孟加
·巴西纺织机械展/纺机展/2009
·印度纺织机械展/2009年印度新
·土耳其纺织机械展/2009年土耳
·热烈祝贺上海玛蒙工业有限公
·《功能安全技术与应用培训班
·2008-2009全球环保水处理及能
·2009南非国际水处理展览会
·2009中东迪拜(国际)环保、
 热点新闻 
·PLC课程设计课题——三层电梯
·先进控制技术及应用
·变频器原理
·一般变频器常见故障及处理
·CK6432(FANUC-0TD)数控车床
·集成温度传感器AD590及其应用
·3G无线接入网IP化传送承载方
·谈步进电机的PLC控制方法
·基于PLC的机械手控制设计
·浅谈单相电度表的反转
数据加载中..

网站地图
Autooo.Net 版权所有
Copyright © 2007 All rights reserved