首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

DSP算法标准及其应用

DSP算法标准及其应用

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的基本输入输出函数执行速度快。此外,还附带一些对控制和状态寄存器微小操作的子集,例如,设置溢出模式等。
  算法、应用框架、运行支持内核各自的代码相对独立,相互作用,共同协作构成一个有效的应用软件。他们之间有各自的界线,在标准中有各自定义的功能范围。算法只有相对独立于应用框架和运行支持内核,才能支持“即插即用”,才能在无需大量修改源代码的情况下,用一种算法替代另一种算法。
继承事业,薪火相传
返回列表