浅析TMS320C67x DSP Library在程序开发中的应用

时间:2011-09-02

 

  DSP在占据嵌入式通信终端和基础设施市场的主导地位之后,现在其触角也已广泛地拓展到了更多的嵌入式数字多媒体应用领域,同时更以其完全软件可编程的灵活性,在众多的数字信息产品解决方案中发挥着越来越大的作用。“十年之内,DSP有可能成为的半导体产业。”出自TI总裁兼执行官Tom Engibous的一句话为DSP的显赫地位一锤定音。

    整个DSP的产业链可分为五个部分,分别是器件、开发和演示系统、标准应用算法、操作系统/设备驱动/协议栈/系统应用,以及产品开发与系统集成,逐级而上,分别由DSP厂商、第三方公司(3P)和客户承担,其中DSP厂商的精力主要放在改进芯片设计、革新制造工艺、提高运算速度、增加功能、降低功耗和减小成本等方面,而开发工具、应用软件和实际应用系统一般由第三方公司和客户或ODM完成。要充分发挥D-SP芯片的性能,就必须编写高效率的程序。一般在DSP进行运算时,有些操作会频繁出现(如卷积、FFT、FIR滤波等),完成这些操作的程序的效率直接影响整个软件部分的效率。为此,TI公司提供了一系列库函数(TI DSP Library,以下简称DSP Lib)来完成这些操作。这些库函数既可减少程序员的工作量,又可提高程序效率,因此,在程序开发中,合理地使用这些库函数,将大大提高系统性能。

  1 TI DSP Library简介

  1.1 TI DSP Library的特点

  DSP Lib的实际上是一系列经过手工优化的汇编程序代码,这些代码封装在后缀名为。lib的文件中,可用于完成各种运算。它们对外是不可见的。这些程序(库函数,routines)可被C程序调用。由于经过了手工优化,它们的效率都非常高。由于不同系列DSP芯片的指令集不同,因此,不同系列DSP芯片的DSP Lib也是不同的,如TMS320C5000的DSP LIb就不能用于TMS320C6000。但是,各个系列DSP Lib的基本组成是相同的,一个完整的DSP Lib通常由Lib文件夹、include文件夹和其它辅助文件组成。其中lib文件夹用于存放*.lib文件,其内部封装着手工优化的汇编程序代码,是一个DSP Lib的部分。使用归档器可从中提取出这些源代码;而include文件夹用于存放各个库函数的头文件,通常这些文件分为C程序头文件和汇编程序头文件两部分。

  1.2 TI DSP Library的和安装

  由于DSP Lib种类繁多,且属可选模块,通常的DSP开发环境(CCS,Code Composer Studio)并没有配备DSP Lib。因此,使用一个DSP Lib之前,必须进行DSP Lib的和安装。

  所谓,就是在TI公司网站WWW.ti.com上各种DSP Lib;而所谓安装,就是在DSP Lib完毕后,双击安装文件,以将它安装在计算机中选定的位置(默认位置为C:\ti)。安装之后,即可在程序开发中使用DSP Lib的库函数。

  1.3 TI DSP Library的使用

  按处理数据类型的不同,TI DSP分为定点(fixed-point)DSP和浮点(floating-point)DSP。由于浮点DSP既有定点指令集,又有浮点指令集,因此,本文选取浮点DSP系列TMS320C67x的DSP Lib,并且选取了TMS320C67x DSP Library和TMS320C67x FastRTS Library两个DSP Lib,前者主要针对数字信号处理的常用操作,后者则针对一般数学运算的通用操作。

  2 TMS320C67x DSP Library的应用

  当DSP进行数据处理时,卷积、FFT、FIR滤波等操作频繁出现,故在程序开发中,使用DSP Lib来完成这些操作将大大提高整个程序的效率并简化编程。TMS320C67x DSP Library就是这样的一个DSP Lib,它的lib文件夹内含库文件dsp67x.lib和源文件dsp67x.sr、dsp67x_C.sr-c、dsp67x_sa.src。TMS320C67x DSP Library主要用于TMS320C67x系列DSP芯片的程序开发,使用它可完成FFT运算。

  2.1 TMS320C67x DSP Library的使用

  使用TMS320C67x DSP Library的步是将其文件“dsp67x.lib”加入到当前工程中,相关编译链接参数为“-ldsp67x.lib”;接着,将存储头文件的include目录所在路径添加到工程搜索路径中,其相关编译链接参数为“-i pathname”,具体操作可参考TI公司的有关文献。选取该DSP Lib中的库函数“DSPF_sp_cfftr2_dit()”可完成FFT运算,它使用的是基2的时间抽取算法,具体形式如下:

 

 

    同时,该库函数还有一个对应的头文件“dspf_sp_cfftr2_dit.h”,使用时可将其包含到调用该库函数的程序中。此时,该库函数就可以像一般子程序一样被其他程序调用,具体使用代码如下:

 

 

  为了便于比较,可使用归档器指令“ar6x”从该DSP Lib的源文件“dsp67x_c.src”中提取出库函数的源代码,以得到文件“sp_cfftr2_ dit.c”。所有归档器指令的命令文件都存储在CCS的安装目录下,这里,“ar6x”的使用格式为:

  ar6x-x dsp67x_c.src sp_cfftr2_dit.c

  从“sp_cfftr2_dit.c”中可得到库函数“DSPF_sp_cfftr2_dit()”的C语言源代码,相应的C程序为“void sp_cfftr2_dit(float*x,float*w,short n)”,该程序可以像一般子程序一样被主程序调用。源函数和库函数的形式完全相同。实际上,库函数就是对源函数的程序代码进行手工优化的结果。

  2.2 性能分析

  分别使用库函数和源函数可完成FFT运算。并可用CCS自带的剖析工具“Profiler”来分析两个函数由于编程方式的不同所带来的运行时间上的差异。改变输入数组的长度,可得到如表1所列的一组数据。由表1可以看出,库函数的效率远远高于源函数,其效率的提高量随着输入数据长度的变化而变化,的效率可提高40倍(40.98-1=39.98),仍在25倍左右,而且该DSP Lib的其他库函数也有相近的测试结果。虽然用该DSP Lib的库函数后,程序效率可以提高一个数量级,对于时间限制较为严格的系统。

  库函数和源函数相比,其效率有了很大提高,但这种提高是有代价的。它主要表现为通用性降低。其原因是为了限度的提高效率,在对代码进行手工优化的过程中,引入了一些强假设,同时,使用了大量的操作合并、并行处理等简化手段,这必然导致库函数的通用性降低。例如,库函数“DSPF_sp_cfftr2_dit()”使用时就会受到以下条件的限制:

  (1)输入数组的长度必须是2的幂级数,且不得小于32;

  (2)输入数组x和旋转因子数组w必须按双字对齐方式存储,即数组起始地址的末3位必须是零;

  (3)数据的存储格式必须是小端模式(Little Endian);

  (4)执行期间可接收中断,但不予响应,这可能导致一些实时事件得不到及时响应。

 


 


  如果使用“DSPF_sp_cfftr2_dit()”时不考虑到这些限制,就有可能导致程序运行异常。因此,库函数的效率虽然高,但不能盲目的滥用,在程序开发时,必须根据实际情况在通用性和效率之间进行折衷,以合理的使用库函数。

  3 TMS320C67x Fast RTS Library的应用

  在DSP进行数据处理时,除了一些典型的操作外,还存在大量常规的操作,如除法操作、对数运算、三角函数等,这些操作也是很费时的,提高这些操作的代码效率,也能显着提高整个软件的效率。TMS320C67x FastRTS Library就是这样的一个DSP Lib,它通常由Lib文件夹、include文件夹和doc文件夹组成。其中lib文件夹内含库文件fastrts67x.lib(Little Endian)、fastrts67xe.lib(Big Endian)和源文件fastrts67x.src;include文件夹内含头文件fastrts67x.h和recip.h;而doc文件夹内含帮助文件。

  3.1 TMS320C67x FastRTS Library的使用

  TMS320C67x FastRTS Library(以下简称FastRTS Library)主要用于处理一些常规的操作。由于在通常情况下,CCS已经有一个RTSLib-rary来完成这些操作(例如,“rts6700.lib”就是一个适用于TMS320C67x的RTS Library文件),因此,如果要使用FastRTS Library,就必须在编译链接过程中先于“rts6700.lib”来编译链接“fastrts67x.lib(或fastrts67xe.lib)”,相应的编译链接命令选项为:

  -l fastrts67x.lib - rts6700.lib或 -l fastrts67xe.lib - rts6700.lib

  FastRTS Library同样需要注意头文件的使用,它有两个头文件: “fastrts67x.h”和“recip.h”。如果使用FastRTS Library中的特殊函数(三角函数,对数函数等),则必须包含“fastrts67x.h”;而如果使用求倒数操作,则必须包含“recip.h”。FastRTS Library的使用方式如下:

 

 

  3.2 性能分析

  分别使用FastRTS Library和RTS Library可完成一些常用操作,使用剖析工具可得到各个操作所需的时钟周期个数,具体如表2所列(所有的操作均处理单浮点数)。对比表2中的数据可以发现,和RTS Library相比,FastRTS Library大大提高了程序的效率。


 

  4 DSP Lib的编写

  事实上,程序员并非只能被动的使用DSP Lib。只要遵循相应的规则,程序员也可以自己编写一个DSP Lib。编写一个简单的DSP Lib的步骤如下:

  (1)新建一个工程newLibrary,将其属性设为“Library(。lib)”,图l所示是新工程设置示意图;

 

 


  (2)编写高效率代码文件myLibl.asm、myLib2.asm、myLib3.asm,……

  (3)将myLibl.asm、myLib2.asm、myLib3.asm,……等文件添加到工程new Library中;

  (4)编译链接工程new Library;

  这样DSP Lib就制作成功了。为了使DSP Lib具有保密性,只需保留工程中的newLibrary.lib文件,而将其他文件,特别是源代码文件*.asm删除或保密存放。这样,用户就只能使用库文件,而无法从中得到源代码的信息。

  5 结束语

  本文以TMS320C67x DSP Library和TMS320C67x FastRTS Library为例,详细介绍了如何在程序开发中使用TI DSP Library,并分析了使用TI DSP Library所带来的程序效率的提高。,还给出了编写TI DSP Library的一个应用实例。

  以DSP平行处理的架构来说,要能够处理高速运算以及大量资料的传输,尤其是对矩阵的运算以及浮点运算,DSP是特别有效的一个演算架构。因此现在很多产品除了本身的CUP,都需要另有DSP这样架构,瑞萨的SH-DSP系列就属于这种产品,可应用领域包括光碟机、PRINTER等。

 


  
上一篇:基于μC/OS-II的总线式数据采集系统的设计
下一篇:网络安全—无约束接入控制

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料