TMS320VC33的汇编语言程序设计和优化
2009-06-29成健
成 健
摘要:高性能浮点DSP芯片TMS320VC33以其高速、低功耗、低成本、易于开发的显著特点,成为需浮点运算的便携式产品应用开发的理想的DSP器件。文章根据在TMS320VC33应用开发方面的经验,从硬件结构及其指令系统特点出发,总结并较为详细地阐述了汇编语言程序设计的几种优化方法。
关键词:浮点DSP;需浮点运算;TMS320VC33;汇编语言优化;汇编语言程序设计
中图分类号:TN913文献标识码:A文章编号:1009-2374(2009)10-0139-02
TMS320VC33是TI公司推出的性价比很高的浮点DSP芯片,既适应于浮点运算,又适应于控制,同时还具有速度适中,功耗低,接口方便等优点。因此它被广泛应用于通用DSP算法实现,远程通信,语音处理,图像和图形处理,高速控制等领域。
由于TMS320VC33具有复杂的硬件结构,使用汇编语言开发软件过程中,按照传统的汇编语言编程方式编程会导致代码效率比较低, 执行速度比较慢。为了充分发挥TMS320VC33的性能, 汇编语言程序设计的最优化成为产品开发人员的终极目标。作者以多年来从事TMS320VC33应用的产品软硬件设计的经验,总结了汇编语言程序设计的几种优化方法。
一、TMS320VC33的硬件结构及软件资源
(一)TMS320VC33的硬件结构
DSP的硬件结构特点决定了它在执行指令时的特殊性。因此对DSP硬件结构的了解是理解DSP编程优化的基础。
TMS320VC33是32位的高性能数字信号处理器。其总线采用哈佛结构,允许数据在程序存储器和数据存储器之间传输。其内部包含了两块2K×32位和两块16KX32位的快速RAM块。独立的程序总线,数据总线和DMA总线使得取指、读写数据和DMA操作可以并行进行。64X32位的高速缓冲存储器(以下简称Cache)用来存储需要经常使用的语言块,这可以大大减少片外访问的次数,从而提高程序的运行速度。由于主总线的地址线是24位,因此TMS320VC33可以访问多达16M的存储器空间,程序、数据1/0空间都包含在TMS320VC33这个16M字的空间中。
TMS32OVC33提供28个寄存器,这些寄存器可以由乘法器和ALU操作,可以用作通用的寄存器。但是,他们也有一些特殊的功能,如八个扩展精度的寄存器(RO~R7),可当累加器使用,特别适合用于存放扩展精度的浮点结果。八个辅助寄存器(ARO~AR7)支持一系列的间接寻址方式,并且可以用作通用的32位的整数和逻辑寄存器。其它的寄存器提供一些系统功能,如寻址、堆栈管理、处理器状态、中断和块重复等。
TMS320VC33的外设是通过存储器映射的寄存器对外设总线进行控制,外设总线由32位数据总线和24位地址总线组成,允许与外设直接通信。TMS320VC33的外设包括两个可支持8/16/32位数据交换的串行口和两个32位定时器。
(二)TMS320VC33的软件资源
TMS320VC33的汇编语言指令集特别适合于数字信号处理。所有指令占一个机器字长,大部分指令是单周期的。指令集可以分为以下几类:数据装载和存储指令、两操作数算术/逻辑类、三操作数算术/逻辑类、程序控制类、低功耗控制类、互锁操作类及并行操作类。TMS32OVC33提供相当灵活的程序控制。软件的程序控制包括重复、跳转、调用、陷阱及返回等。流水线操作是TMS320VC33具有的高性能的特性之一,五个功能单元控制TMS320VC33的操作,取指、读操作数、执行、和DMA。流水线操作就是一个基本指令的取指、译码、读操作数和执行的并行操作。此外,TMS320VC33支持多种不同的寻址方式。特别是一些特殊的寻址方式更是为了数字信号处理而专门设计的。
二、汇编语言程序设计的优化方法
DSP的软硬件资源为高性能提供了必要条件。在使用汇编语言编写程序时,如何充分利用这些硬件资源及开发工具,对程序进行优化,使应用达到最优性能,是每个编程人员应关注的问题。下面是总结的几种程序优化方法:
(一)利用延迟跳转
跳转分有条件和无条件跳转,无论哪种方式都要执行4个指令周期。TMS320VC33提供的延迟跳转指令可在一个周期内完成,而指令后的三条指令都照常执行,若少于三条指令,可加NOP指令。这样可以节省机器时间。
(二)利用单指令重复或块重复
在这种情况下,可实现无开销循环。但要注意,在需要中断的场合,要用块重复指令,而不能用单循环指令。
(三)利用并行指令
TMS320VC33具有一系列并行指令,如乘加、存取、取存、二次取、二次存等,利用并行指令可增加在单个周期内执行的操作次数,但要比普通的指令多许多限制,如乘法指令,其目的寄存器只能为R0和R1,而加法指令,其目的寄存器只能为R2和R3。因而在高密度运算中,会出现寄存器拥挤现象,造成系统效率下降。当多条并行指令一起执行时,往往由于前面的结果在后续的寄存器中还要用到,因而必须保留,但后续指令就会因无空闲的目的寄存器而不能采用并行执行,在这种情况下,可以将寄存器内容暂存于片内存储器中,然后在利用取数指令将暂存的数据从存储器取回寄存器。另外应注意TMS320VC33不存在任何能与堆栈操作并行的指令,故不采用压栈方法来保存寄存器数据。
(四)充分利用Cache
当TMS320VC33需要从外部存储器的某一地址处取指令字时,首先检查Cache中是否已经存放有该地址处的指令,所以可以将指令存储在TMS320VC33提供的64X32位的Cache中,从而达到节省取指时间,加快程序运行的速度的目的。因此在编程时确保在程序初始化时Cache己使能。
(五)利用内部RAM
TMS32OVC33内部提供了34K的内部RAM,这些RAM的存取速度特别快。在单个指令周期内,可从内部RAM中取出两个操作数。如果采用并行使用DMA和CPU来将数据传送到内部RAM,则可使性能达到最佳。
(六)用比较快的寻址方式
使用比较快的寻址方式会大大减少指令周期。例如,如果数据是顺序存放时则采用寄存器寻址方式,操作完后自加1而指向下一数据.可以减少很多指令周期。使用循环寻址可以大大方便实现数字滤波器中的卷积运算。
(七)避免流水冲突
流水线操作是TMS32OVC33实现高速运算的重要手段,如使用不当会引起程序执行时间的增加。TMS32OVC33 一条指令的执行包括取指、译码、读、执行四个时钟周期,由于上述四个步骤在不同的单元实现并行操作,从而实现单指令周期。当程序发生流水线冲突时,一条指令执行将占用四个时钟周期,大大消弱了CPU 的数据吞吐能力。流水线冲突可归为三类:分支冲突、寄存器冲突和存储器冲突。分支冲突发生于标准分支BR、CALL、IDLE、RPTB、RPTS、RETI、RETS等指令以及中断和复位。寄存器冲突包含了用于寻址目的寄存器的读和写,发生于相应的寄存器没有准备好或已被使用,从而使CPU处于等待状态。存储器冲突最为常见。当两个CPU数据访问内部RAM块,同时又要从同一块取程序;或当一个外部端口启动CPU数据访问,同时必须从同一端口取程序时都会发生存储器冲突。调试的方法是使用模拟器或者仿真器的跟踪功能,查看程序执行时各个寄存器的变量的值的变化。
三、结语
TMS320VC33汇编语言的优化是一个资源充分利用、结构不断趋于合理的过程。在此过程中,应最大程度地发挥TMS320VC33效能,最大限度地利用其资源。本文介绍的对TMS320VC33汇编语言编程的优化方法,使用后能够有效降低在TMS320VC33上运行软件的内存占用和系统开销,在软件开发中非常有实际意义。对TMS320C3x系列DSP同样适用,可以为从事TI及其他公司各系列DSP芯片的开发和应用打下良好的基础。
参考文献
[1]党瑞荣,谢雁,李利品,等. TMS320C3xDSP原理与应用[M].西安:陕西科学技术出版社,2006.
[2]杜普选,马庆龙,等. 实时DSP技术及浮点处理器的应用[M]. 北京:清华大学出版社,北方交通大学出版社,2007.
作者简介:成健,江南机电设计研究所助理工程师,研究方向:DSP软件开发及应用。