您当前的位置:五五电子网电子知识单片机-工控设备DSP/FPGA技术DSP算法标准及其应用(二) 正文
DSP算法标准及其应用(二)

DSP算法标准及其应用(二)

点击数:7558 次   录入时间:03-04 12:04:03   整理:http://www.55dianzi.com   DSP/FPGA技术

(2)算法(ALG)
    算法是一种纯粹的数据变换器,只是简单地接收  94和处理输入的数据。算法获取数据通常有两种方法,这两种方法均离不开应用框架的支持。一种是中断输入方式,算法通过应用框架的中断服务函数获得数据;一种是查询方式,应用框架提供一个周期性的函数,通过该函数周期性地在某个端口获得数据。在所有情况下,算法在系统中被设计成独立于I/O设备的。即,算法不能直接访问外设寄存器的地址,也就是在算法中不能出现外设的物理地址,只能通过指针参数或模块接口指针将地址传到函数中。
  这一实现通常要依靠一个I/O接口模块。通过这种方法,可以减小对框架的依赖,提高算法的通用性。一个算法可以有多种实现,实现方法的不同意味着性能的不同,优秀的算法实现代码短小,执行效率高。而这两者通常不可兼得,执行效率的提高,通常以增加代码长度为代价,这意味着需要更多的存储空间。反之,算法实现代码小,执行性能通常会降低。同时,不同的算法实现价格也不相同。这给了算法集成商或开发商更多的选择余地。
  当然,性能和算法的这种折衷,必须以遵循算法标准为前提,不然,算法不可相互“替换”,算法的多个实现也就失去了意义。
    (3)运行支持内核
  为了使算法满足可重入、与I/O外设独立以及可调试性的最小需求,算法需要一系列总是稳定存在的内核服务。比如C语言运行支持内核。该内核提供基本的打印函数printf()、内存管理函数mEMCpy()、字符串函数、时间函数等标准C语言的基本运行环境。该内核的相关的函数经过封装,形成一个支持库rtsxx.lib。xx代表处理器的类型。
  由于大部分的算法仍旧是用汇编语言生成的,内核提供的许多服务也必须适合汇编语言,并能用其访问。这也是标准C语言和汇编语言能够混合编程的基础。TIDSP运行支持内核还包含一个DSP/BIOS的子集,提供基本输入输出功能,该功能比标准C的基本输入输出函数执行速度快。此外,还附带一些对控制和状态寄存器微小操作的子集,例如,设置溢出模式等。
  算法、应用框架、运行支持内核各自的代码相对独立,相互作用,共同协作构成一个有效的应用软件。他们之间有各自的界线,在标准中有各自定义的功能范围。算法只有相对独立于应用框架和运行支持内核,才能支持“即插即用”,才能在无需大量修改源代码的情况下,用一种算法替代另一种算法。
3 通用算法标准
  TIDSP算法标准包括许多规则和准则。一种算法为了实现与遵循标准的其他算法相兼容,必须遵循算法标准规则,同时为了便于程序的可读性和维护,也强烈要求遵循算法编写准则。算法标准共有34条规则和若干条准则,详细情况请参阅文献[1],笔者着重讨论算法标准中有关多任务的规定。
  规则1 所有的算法必须遵循由于使用C编程语言而带来的运行时约定。
  该规则并不要求算法必须用C语言实现,实际上算法可以完全用汇编语言实现。但是,算法必须能在C语言中调用,同时,也必须遵循C语言的运行时约定部分重要的算法都不是仅用一个函数实现的,同其他复杂的软件一样,算法软件也是由许多内部函数组成。这些内部函数不必全部遵循C语言的RTC,只需最顶层的接口函数遵循C语言的RTC即可。同时,也要保证接口函数不会通过调用内部函数改变C语言的RTC。
  规则2 所有的算法在一个占先的环境下(包括时间片占先)具有可重入性。
  该规则比较抽象,需要先了解几个概念才容易理解。
  “重入性”是一个程序的属性,他允许多个线程同时使用程序的相同拷贝。简而言之,代码不具有记忆性,相同的输入参数不论在什么情况下得到的函数结果都相同。
  “占先[2]”是指应用框架或操作系统具有依据模块或任务的优先级决定模块是否能被中断,并进行相应调度的能力,或指代码是否能被中断的特性。
  由于应用框架的多样性,代码的可重入性变的十分复杂。硬件平台有单通道、多通道之分,应用程序有多线程、多进程、多任务之分,应用框架有占先(又叫抢先)式环境和非占先式(常常指时间片轮讯)之分。在非占先环境中,算法函数可以自由地使用全局变量,不用担心由于函数在运行中被中断,从而造成的全局变量数据的混乱。在占先的环境下,如果在算法函数内部使用了全局变量,并且函数修改了该全局变量的值,则该函数不具有重入性。由于算法自身并不能知道所应用的环境的“占先性”,所以算法必须保证在所有的情况下,算法具有可重入性。实际中,算法是否具有可重入性的检查比较困难,因而,这需要算法开发人员遵循3条准则:
  一是算法只能修改堆栈中的或者实例对象的数05据;
二是算法视全局数据和静态数据为只读数据;三是算法不能调用可自我修改的代码。
  在多线程和多任务下,还可通过禁止中断的方法,禁止任务的占先,来保证满足函数的可重入性。
  规则3 算法数据的引用必须是完全可重新定位的。也就是算法中不能有“硬编码”出现。
  因为DSP应用程序在最后生成可运行代码时,必须进行连接,在连接中对DSP代码进行存储空间分配,所以一个算法如果要顺利接入另一个系统,算法必须能够重新定位。这就要求算法中不能有“硬编码”存在。
  所谓硬编码,就是一个具有具体的物理地址的代码。算法中一旦有了硬编码,导致代码只能固定位于某一块或访问某一块内存,将使该算法不能重新定位,失去了可移植性。算法中对数据内存的访问,可以通过连接命令文件,定义一个符号,指向某一内存区域,当应用程序需要将算法重新定位时,只在命令文件中修改符号指向的内存地址即可。
  以上介绍的是多任务算法编程中相对重要的规定,限于篇幅,其他规定请参阅文献[1]。
4 算法标准在实际中的应用
  笔者的硬件开发平台是基于2片TMS320VC5402 DSP的自研发板,软件开发平台是TI公司的CCS2.0,所有的算法使用ANSIC语言编写,框架应用程序使用C语言和汇编语言的混合编程,算法先通过软仿真调试,再进行硬仿真在线实时调试,最终的算法将成为通用的算法,可移植到其他的数字信号处理器上。基于上述思想,软件从算法标准的角度做了如下整体设计:
  (1)软件算法和框架应用程序相对独立。即,框架应用程序是一个相对独立的模块,从AD转换器数据的采集、中断的调用都属于框架应用程序的工作;算法仅对采集到的数据处理。算法是一个相对独立的模块。
  (2)每一个算法都有一个头文件(.h)和一个实现文件(.C),整个算法模块有一个算法接口模块。算法头文件支持重复包含功能,即头文件中用预处理指令做了防多重进入处理(#ifndef...#define...#endif)。
  (3)所有对片内存储器的访问都定义了相应的寄存器指针或结构指针,并通过参数传入应用程序,算法和程序函数中不出现具体的寄存器地址,有效防止代码中有“硬编码”。
  (4)全局变量如果是只读属性,即,只读取而不改变全局变量的值,则可以在函数中直接使用,否则,只能通过指针传入函数,函数体中禁止直接修改全局变量的值,保证了函数的可重入性。
  (5)串口和DMA的操作有自己相应的接口文件,算法通过调用接口函数进行外设操作。串口和DMA等外设的操作由框架应用程序控制。
  遵循DSP算法标准,对动态系统会有一些性能下降,但对静态系统没有显著的影响,笔者的系统采用的是静态方法,因而在实际系统中,性能改变不太明显。
5 结 语
  TIDSP算法标准的出现,无论对算法提供商还是对算法集成商来说,在技术上都是一个进步。对目前繁杂的算法编写和市场应用是一个很好的规范,为DSP算法的开发和使用提供了一个较为行之有效的标准。相信随着DSP的算法标准的逐渐推广,市场上DSP算法组件会越来越多,DSP的应用会越来越广泛。

参考文献

[1] TMS320 DSPAlgorithmStandard Rules andGuidelines.Texas Instruments Incorporated,2001.源码公开的实时嵌入式操作系统[M].北京:中国电力出版社,1999.




本文关键字:暂无联系方式DSP/FPGA技术单片机-工控设备 - DSP/FPGA技术