打印

DSP算法标准及其应用

[复制链接]
739|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
FCCdsp|  楼主 | 2016-3-25 22:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1 引 言
   DSP[1](DigitalSignalProcessor)自从诞生以来,由于其在数字信号处理方面专用的结构和硬件逻辑,比如,处理器使用不同于普通处理器的哈佛结构,独特的桶型移位器等,使其在某些特定的领域的应用得到了飞速的发展。DSP在某些功能上与普通的嵌入式处理器相似,因而通常以传统嵌入式处理器编程的方法来编程,即,使用C语言和汇编语言混合编程,直接访问硬件外设,并且由于性能的原因,总是很少使用标准操作系统的支持。这样,像传统的微处理器一样,几乎没有零售的DSP中间件可用。然而,DSP又不同于通用的嵌入式处理器,他是用来运行复杂的信号处理算法的。这些成熟的算法通常是多年的博士研究的成果。
  由于DSP算法缺乏统一的标准,算法从一个系统移植到另外一个系统时,或一种算法要应用于多个系统中时,通常要做很大的改动。算法的继承性和重用性都很差,因此基于DSP的产品上市时间往往以年,而不是以月来计算。对一个产品开发商来说,不可能仅从一个算法开发商那里购买全部所需的DSP算法;另一方面不同算法开发商的算法产品由于实现风格不同,相互不兼容。因此,常常出现这样的情况,系统集成商不得不选择能提供他们所需的大部分算法的算法开发商,并与他们谈判来开发所需的其他算法。
  为改变这种状况,TI公司推出了一套编写和使用DSP算法的标准,让系统集成商可以快速集成和使用已有的商用DSP算法软件,可以大大减少基于DSP产品的上市时间。
  2 DSP算法标准的相关背景和概念
  2.1 通用算法的特征
  由于DSP应用十分广泛,支持数字信号处理器的平台或操作系统又很多,这些复杂的平台对于算法标准就提出了很高的要求。一个算法要真正实现“即插即用”或应用于多种操作系统,他必须具备几个基本的特征。
  (1)算法对于应用程序透明,相同的算法可以用于任何应用程序。
  (2)算法既能用于静态系统,又能用于动态系统。
  (3)算法必须能用二进制形式分发,即能以目标文件发行。
  (4)算法既能用于单任务,也能用于多任务,即
  (5)算法的使用不需要重新编译,但可以重新连接和配置。
  (6)算法是C语言可调用的。
  (7)算法独立于任何特殊的I/O设备。
  算法要具有上述特征,在编码上就必须遵循一定的规范,在处理器资源的使用上,也必须作一些限制,这些规范和限制就是算法标准。有关算法标准的详细规定,可参阅文献[1]。
  2.2 算法标准的分级
  在算法标准出来之前,DSP算法开发商已开发了大量的算法,有些算法在一定程度上遵循了标准;有些算法由于应用领域的不同,移植(指相同DSP,不同软件平台)时的限制不同,这就提出了算法标准的等级问题。通常算法标准分为4级,每一级标准对算法编写的要求和限制不同,级数越高,限制越严格,其中第4级是具体到各种特殊行业的。比如,语音编码器有语音编码器的行业标准和特征;电机控制算法有电机控制方面的特殊要求等等,如此细致的规定不可能上升为通用的标准,所以通用的算法只要遵循前三级即可。下面是各等级分别包含的范围:
  第1级 包含适用于各种DSP结构,而不管应用领域的各种算法的编程准则。几乎所有近来开发的软件模块都已经遵循了这些准则,所以该级别只是将他们规范化。
  第2级 包含可使所有算法和谐运行于单一系统的编程规则和准则。例如,约定用于数据内存算法和外部标示的统一命名等。此外,还规定了算法如何封装的规范。
  第3级 包含具体DSP系列的算法编程准则。如C54XX,C6X等。现在关于处理器资源的使用还没有统一的准则。由于不同的DSP结构不同,因而总有偏离准则的情况,标准要求算法提供商必须清楚地在相关头文件和文档中标注这种偏差。
  2.3 基于DSP算法标准的通用软件结构和相关概念
  算法标准如何在实际中应用,TI公司给出了一个通用的软件编程思路。将一个基于DSP的软件分成了若干模块,每一个模块都有严格的定义,使得模块之间有明确的界线。图1是一个基于主机-目标机的软件结构图(图中主机端没有画出)。从中可以清楚地看到通用的DSP程序分为4个部分:FrameWork,ALG,Core run time Support,CMDand Status。
  FRAMEWORK为应用程序框架,是一些支持 DSP运行的平台或操作系统,例如pSos,vxworks,UC-OS-II等;ALG为独立于处理器的DSP算法;Core run time support为运行支持内核,例如rts54.lib等;ALG为独立于处理器的DSP算法; Core run time support为运行支持内核,例如rts54.lib等;CMD为主机发给目标机的命令,Status为目标机返回给主机的状态信息。主机和目标机模式只在开发状态或某些控制场合使用,大部分的DSP软件都是独立于主机运行的。所以我们只讨论独立于主机的工作模式,下面分别详细讨论上述几方面的作用和相互关系。
  (1)应用框架(FrameWork)
  应用框架通常是一个与设备相对独立的I/O子系统,即他提供一个通用的I/O接口,并规定算法和应用程序如何使用这个接口。所有可能的外设都以接口形式存在,算法通过框架提供的接口访问外设。典型的应用框架就是操作系统。例如,Windows操作系统,应用程序不能直接访问串口、并口等外设,只能通过Windows操作系统提供的API(应用程序接口)与外设相互作用。任何外设只要提供接口(驱动程序)就可以接入操作系统。
  在DSP和微处理器领域,最著名的应用框架就是Wind River公司的pSos和VxWorks操作系统。有些应用框架由于应用领域的不同或者应用方案比较简单,仅仅提供一些基本的I/O功能,难以称为操作系统。例如,CCS(Code Compose Stdio)中嵌入的DSP/BIOS(基本输入输出系统)实时内核。框架的基本功能就是提供数据出入的接口。
  此外,框架还定义了内部应用模块的等级,也就是操作系统中任务的优先级。通过优先级,框架可以实现对模块的控制,比如中断模块或恢复模块的运行,或决定哪个模块先运行,这就是操作系统中所谓的任务调度。
  应用框架负责I/O接口和任务的调度,实质上就是基于硬件平台之上的软件平台。
  (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的应用会越来越广泛。



DSP算法标准及其应用.pdf

92.13 KB

相关帖子

沙发
zhangmangui| | 2016-3-25 23:03 | 只看该作者
不错的分享

使用特权

评论回复
板凳
Sode| | 2016-3-25 23:03 | 只看该作者
比较实用,也比较全面,好帖

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

967

主题

1447

帖子

9

粉丝