您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

DSP环境下C语言编程的优化实现

发布日期:2011-05-21

  DSP(Digital Signal Processor,数字信号处理惩罚器)是一种具有特别布局的微处理惩罚器。自20世纪80年代初诞生以来,DSP在短短的十多年间里得到了飞速的生长。随着DSP性能代价比和开辟本领的不绝进步,DSP已经在通讯和信息体系、信号与信号处理惩罚、主动控制、雷达、军事、航空航天、医疗、家用电器等很多范畴得到了遍及的应用。

  1 小序  

  与单片机相比,DSP多用于算法比较巨大、乘加运算量比较大的应用,如通讯、雷达、音视频处理惩罚等。为了寻求代码的高效,已往一样平常用汇编语言来方式DSP步伐。随着DSP应用范畴不绝扩展,应用的日趋巨大,汇编语言步伐在可读性、可修改性、可移植性和可重用性的缺点日益突出,软件需求与软件生产力之间的抵牾日益紧张。引入高级语言(如C语言、C++、Java),可以办理该抵牾。在高级语言中,C语言无疑是最高效、最机动的。各个DSP芯片公司都相继推出了相应的C语言编译器。

  鉴于DSP应用的巨大度,在用C语言举行DSP软件开辟时,一样平常先在基于通用微处理惩罚器的PC机或事变站上对算法举行仿真,仿真通过后再将C步伐移植到DSP平台中。

  根据软件开辟的次序,相应的优化事变包括两个部分:一是仿真环境中的优化,二是DSP目标环境中的进一步优化。本文重要探究的是前者,给出了在DSP开辟环境下有效C语言编程的战略,以得到最高效的编译代码;并针对战略,计划了详细实例,并比较了差别战略在TMS320C54x CCS(v1.2)和TMS320C6000 CCS(v1.2)环境下编译的结果。

  2 DSP开辟环境下有效C编程的战略

  基于通用微处理惩罚器的PC机环境中的优化事变是针对C步伐的通用特性来思量的。这方面的优化事变重要包括数据范例选择、数值操纵优化、快速算法[6]、变量定义和利用优化、函数调用优化、步伐流程优化以及谋略表格化[6]等。

  2.1 数据范例

  标准C语言提供了丰富的数据范例整型、浮点、罗列、指针、布局、连合等。编程面对的题目是利用怎样的数据范例使编译天生的代码小、服从高。

  整型有signed和unsigned之分,分别称为char,short int,int,long int,enum。ANSI C没有规定每个范例的大小,它只是声明short int不大于int,long不小于int,enum和int具有雷同标准。这种含糊的定义影响了步伐由一个处理惩罚器向另一个处理惩罚器的移植操纵。为了克制这种影响,比较精良的编程魄力魄力是将数据范例按范例定义(typedef)在一个头文件中,当移植时只必要变动头文件即可:

 

 

 

  利用浮点数黑白常伤害的,除非体系有浮点协处理惩罚器或专门针对浮点计划的处理惩罚器,利用浮点变量会使编码标准膨胀。纵然利用协处理惩罚器,斲丧时间也很多。同时,浮点数的存储空间是可变的。IEEE单精度浮点需4B,双精度需8B,扩展双精度需10B。一些小的CPU的交错编译器仅支持单精度浮点型。

 

  克制浮点操纵的要领一样平常是采取浮点运算定点化,用定点函数运算更换浮点操纵。对付定点DSP的操纵,应细致思量硬件的限定。同时,在编程时要大抵预计数据的范畴,做到所采取的数据范例恰好餍足请求,并只管即便做到在一个CPU指令周期内完成数据加载。

  由于DSP常采取可变的定位方法,布局的不得当声明会浪费很多RAM和ROM空间。如左图标例中两种差别声明方法,用sizeof()阐发,在C54x中分别为14和12(单位为字[4]),在C6201中分别为56个字节和40个字节,可见不适本地声明会导致内存空间的浪费。

  固然,一些高性能的编译器,可根据内存空间优化各个变量的位置,但此时变量存储的序次大概和它们定义时的序次差别。

  2.2 数值操纵优化

  对数值操纵优化,重要分外细致以下几点:

  (1) 用比特的移位操纵来代替2次幂整数的乘除法运算更为有效;
  (2) 用查表法代替三角函数运算。分外是在FFT等步伐中,同时将一些运行时谋略的参数做成查找表或常数数值,如许可以将运行时的谋略转化为编译时的谋略,从而进步运算服从;
  (3) 当利用浮点配置时,只管即便利用浮点数据范例,这可以或许减小定点处理惩罚单位的包袱;
  (4)只管即便克制数值的上下溢出,除非是算法本身的必要。

  2.3 变量定义及利用优化

  C语言把局部变量放在堆栈中,这种访问是间接的,因此较慢。更为有效的要领是将变量放在堆(heap)中,有两种要领实现:一种是声明为全局变量;另一种是声明变量为static。同时,要细致进步全局变量的重复利用率。

  对付必要多次重复访问的变量,如for循环中的变量值,一样平常可以设置为register变量。声明变量为register可以或许进步服从,但必须警惕利用。在某些编译器中,优化器会主动分派一些变量为register。

  在C语言步伐中指针和数组是可以相互更换的。对数组的寻址黑白常耗时的,分外是多维数组。因此,起首应低落数组的维数,再指针化。同时,共同DSP中寻址机构所支持的增量寻址,服从会大大进步,价格是低落了可读性。

  2.4 函数调用

  函数调用每每孕育产生大量代码。当C调用一个函数时,它起首把参数转达给寄存器或堆栈。要是函数参数很多,则调用开销将很大。别的,还需大量堆栈空间。最坏的环境是函数参数转达的是布局,编译器在调用函数时必须起首复制整个布局到堆栈。别的,若函数返回的是布局,调用步伐保存堆栈空间,转达布局地点给函数,调用函数,然后函数返回。末了,调用步伐还要打扫堆栈,并将返回的布局复制到另一个布局。代码和堆栈的开销将是惊人的,分外是资源有限的DSP或别的片上嵌入式开辟体系。为了克制这种开销,应克制转达布局,一样平常用布局指针更换。要是布局是不可修改的,可用常量布局指针更换。

  函数调用的另一方面开销是局部变量。这些变量定位于堆栈,因此增长了对堆栈的请求。要是这些变量需被初始化,则在步伐每次被调用时均需做一次初始化。可以如许说,限定局部变量的数量也便是对堆栈空间的限定。

  第三方面的开销是调用函数的返回值。要是要返回值,一样平常必要在函数返回前复制返回值到返回位置,然后把结果复制到调用步伐中。要是函数的返回值赋值给一个变量或很少利用,可以思量转达指向返回值的指针。被调用的函数可以直接变化返回值。

  对付用C++开辟的用户,采取inline技能可以完全消除函数调用的开销,然而这增长了目标代码的大小。在这种环境下,应根据实际采取的编译器果断优化后步伐天生的代码是否增长不大。

  2.5 步伐流程计划

  在C语言中,步伐流程控制有if…else,switch…case,do…while,for,while等,它们的利用不当也会影响步伐天生代码的大小和服从。下面,本文将分别阐发利用果断选取控制语句和循环控制语句时应该细致的事变:

  在利用果断选取控制语句时应淘汰果断转移。DSP多采取流水线布局。如TMS320C54X中就采取了6级流水线布局,频繁的转移指令将使流水线难以发挥作用。别的DSP的大多数指令为单周期指令,但转移类指令却通常要淹灭较多的呆板周期。因此,应尽大概淘汰步伐中的转移分支。一样平常通过对步伐流的阐发,很多果断转移可以用大略的条件组合来实现。

 

  当有多种选择时,switch…case语句可读性强,然而它会带来很大开销,if…else语句更机动,但它必要更多的C代码。if…else语句在实际的编译中大概会更为有效一些。别的一个必要思量的是switch…case语句中参数可以是恣意的整数范例,然而,若这些整数在case语句中天生一系列整数,如enum范例,很多编译器将孕育产生跳转表,这可以淘汰编译代码,并且均匀下来,实行的服从也比较快。

  C语言提供3种范例的循环布局:for循环、do-while循环和while循环。编译器的任务是将指令映射为处理惩罚器的指令集。很多DSP计划有零开销循环处理惩罚本领。零开销循环不必要循环计数更新、测试和回跳指令,因此可以或许加快处理惩罚本领。
  

  为了只管即便实现循环的零开销,编译器必须知道循环的初始化、更新和结束条件。当循环表达式过于巨大大概含有的循环变量随循环体本身中的条件变革而变化量值时,很多编译器不天生零开销的循环。基于这种准则,循环表达式应写的尽大概明白。并且只管即便地对表达式做预处理惩罚,如将常数表达式移出循环,预先谋略结果等。如下给出典范环境下的阐发结果:

  固然在循环中字符串的长度没有变化,函数strlen()却被调用了strlen(s)+1次。编译器不克不及优化这种多余调用函数的环境。一样平常环境下,一次函数调用返回一个差别的值,循环体对函数的结果孕育产生影响。一种较好的编程思路是不同错误中间变量举行存储,循环改为for(i=strlen(s)-1;i>=0;i--)。

  以上从多方面探究了用C语言开辟DSP软件时的一些优化思量。为了最有效的用C编程,应该按“步伐是怎样在汇编语言中实行”的头脑来编程。随着及时操纵体系、嵌入式操纵体系、可视开辟环境的引入,以及以DSP为平台的C编译器的成果不绝美满,用C开辟DSP应用将更便捷。

  参考文献

  [1]Robert Jan Ridder programming digital signal processors with high-level languages DSP Engineering, 2000
  [2]Numerix -′Techniques For Optimizing C Code′ http://wwwnumerix-dspcom/om/
  [3]Joseph Lemieux JMoving Efficiently from Assembly Language to C Class #401 Embedded Systems Conference Papers,2000
  [4]TMS320C54x Optimizing C/C++Compiler User′s Guide.Texas Instruments Inc.,2001(6)
  [5][JP4]TMS320C6000 Optimizing Compiler User′s Guide.Texas Instruments Incorporated,2001(4)
  [6]刘朝晖,郑玉墙.用C语言举行DSP软件计划的优化思量.空军雷达学院学报,2001(6)