新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > TMS320C54x代码在OMAP5910上的实现

TMS320C54x代码在OMAP5910上的实现

作者:时间:2007-03-09来源:网络收藏
摘要:TMS320C54x 已经得到了广泛应用。为了充分利用TMS320C54x 上的软件开发成果,节省开发成本,需要将TMS320C54x的程序移植到OMAP5910平台的TMS320C55x 上运行。介绍了利用MASM55对代码进行重新编码、对不能移植的代码进行手工修改、重新编写系统级代码等方法成功地实现了TMS320C54x到TMS320C55x的代码移植,正确地实现了程序的功能。充分利用TMS320C55x新增特征,对部分运算量大的函数进行手工代码优化,大幅度地降低了程序的运算量,提高了代码的执行效率和性能。 关键词:OMAP5910 TMS320C55x TMS320C54x 代码移植 代码优化 OMAP5910是一个高度集成的硬件和软件平台,采用独的双核结构,集成了一个ARM9核和一个TMS320C55x(以下简称C55x)DSP核。OMAP5910双核处理器有很强的运算能力和超低功耗,具有广阔的应用前景。C55x是TI公司在TMS320C54x(以下简称C54x)的基础上推出的最新一代‘C5000 DSP,通过低功耗设计和先进的功率管理技术获得了0.9V时0.05Mw/MIPS的超低功耗,性能达到800MIPS;C55x通过采用并行指令、双MAC结构和新增的累加器、ALU及数据寄存器,运算能力比C54x增加了一位;C55x通过采用1到6字节的变长指令,进一步提高了代码密度。因此,C55x在移动通信、视频和图像处理、语音和音频压缩、语音识别等实时信号处理中术具应用潜力。C54x DSP具有很好的适应性和较高的运算速度,已经获得了广泛的应用。为了节省开发成本,缩短开发周期,可以利用C54x上已有的开发成果,将C54x的程序移植到C55x DSP上运行。C55x和C54x指令是兼容的,但存储器配置、指令流水线、片上外设、堆栈管理和中断是不同的,通过对这些不同点进行修改和处理,可以较快地实现系统移植。 1 C54x DSP和C55x平共处DSP简介 C54x DSP采用改进的哈佛结构,对程序和数据存储区使用分离的总线,可能同时取指令和操作数,提高了程序的运行效率和通用性。C54x高度专用的指令结构提供了快速的算法实现和方便的优化,采用5V或3V静态CMOS技术并结合先进的IC处理技术实现了低功耗。C54x采用多总线结构,包括一条程序总线、三条数据总线和四条地址总线。 C54x的CPU主要有: %26;#183;40位算术逻辑单元ALU,其中包括一个40位的滚筒移位器和两个独立的40位累回器; %26;#183;17位%26;#215;17乘法器和一个40位加法器,可以实现单周期乖/加操作; %26;#183;比较、选择和存储单元(CSSU),可以快速实现Viterbi算法中的加比选操作; %26;#183;指数编码器,能在单周期内计算40位累加器值的指数; %26;#183;两个地址产生器,包括8个辅助寄存器(AR0"AR7)和两个辅助寄存器算术单元。 C54x的存储部分分为程序区、数据区、I/O区三个独立的部分,每部分的寻址能力都是64K字。C54x提供7种数据区寻址方式:直接寻址、绝对寻址、累回器寻址、指令中包含7位地址的直接寻址、间接寻址、存储器映射寄存器寻址和堆栈寻址。C54x中每条指令的执行都要经过六级流水线操作:预取指令、取指令、解码、访问、读取和执行。 在继承C54x优点的基础上,C55x又做了一些改进,提一步提高了性能并降低了功耗。C55x的结构如图1所示。C55x的新特征有: %26;#183;先进的多总线结构,包括一条程序总线、五条数据线和六线地址线,共十二条独立的总线; %26;#183;统一的程序/数据存储空间结构; %26;#183;两个MAC单元可以在单周期内同时执行两次乘加操作,增加了并行性; %26;#183;24位宽的地址总线支持8M%26;#215;16bit(16M字节)的可寻址存储空间; %26;#183;单指令重复和块循环指令可以更加快速灵活地实现循环; %26;#183;七级流水线可以获得高的指令吞吐量; %26;#183;指令缓冲单元(I Unit)读取、解析、排队和解码指令,可减少对外部存储器的访问,减少功率的损耗; %26;#183;程序流程单元(P Unit)在多个并行CPU功能单元之间协调程序行为,能实现高效循环、分支、条件执行和流水线保护; %26;#183;地址单元(A Unit)产生数据地址,使C55x能实现高效寻址,而且还包括一个16位ALU,增加了指令级的并行性; %26;#183;数据计算单元(D Unit)包括一个40位ALU、两个MAC和一个移位器,是DSP进行数据处理的核心部分,这一单元提供的指令级并行性对提高处理效率是十分关键的。 2 从C54x到C55x的代码移值 为了将2.4/1.2/0.8/0.6kb/s系列高质量低速率声码器算法在OMAP5910的C55x DSP核上实现,将声码器的C54x汇编代码移植到C55x上,进行重新编译、调试、修改和优化,正确地实现了程序的全部功能,在存储量和计算量上都达到了实现性要求。从C54x到C55x的代码移植可以分为下面三个步骤。 2.1 使用MASM55对代码进行重新编译 MASM55能对C54x汇编代码进行编译,产生C55x的目标代码。虽然C55x和C54x的指令是兼容的,但它们的存储器配置、片上外设、堆栈管理和中断是不同的,因此相关代码需要进行手工修改。 (1) 修改不可移植的代码。不能直接移植的代码一主要有使用硬编码地址和偏移量的代码、利用C54x流水线开放特点的代码、使用C55x代码产生工具保留符号的代码以及使用ARP寄存器的代码等; (2) 修改系统级代码。其中包括:增加初始化系统堆栈的代码;重写中间向量表,重写初始化PMST寄存器的代码,修改初始化IMR和IFR寄存器的代码;重写访问外设和EMIF寄存器的代码,替换访问C54x I/O空间的代码;重新编写连接器命令文件。 2.2 对中等运算量的函数进行选择性的代码优化 通过2.1节可以获得功能正确的代码,但还需对某些运算量较大的函数进行优化。 (1) 使用MASM55的优化选项进行重新编译 这些选项有-mh、-mt、-mn和-purecirco。-mh:设定编译器的优化目标是速度而非代码大小;-mt:如果程序中一直保持SST=0,使用这个选项可以提高代码的空间和时间效率;-mn:删除无用的NOP指令;--purecire:对循环寻址代码的移植进行优化。 (2) 在C54x源代码中有选择性地使用C55x指令 MASM55允许文件中同时存在C54x和C55x的指令,但代码必须在C54x兼容模式(C54CM=1)下运行,此即依然可以使用和访问C55x新的寄存器和资源。可以使用C55x指令进行优化的情况主要有: ① 当循环本小于56字节时,使用RPTBLOCAL代替RPTB或RPTED指令。在C55x CPU中有一个64字节的CAL指令缓冲队列(IBQ),当循环体较小时,使用RPTBLOCAL指令可以使循环体全部队在指令缓冲队列中执行,减少对存储器的访问,从而提高执行速度。在2400b/s声码器的代码移植过程中,进行这种优化后,运算量从59MIPS下降至49MIPS,减小了约10MIPS,性能提高是非常显著的。 ② C54x的流水线是完全开放不进行保护的,C55x的流水线是被保护的。因此,重新安排代码以减小C55x的流水线延时。 ③C55x使用T2寄存器而不是ASM来实现累加器移位。为了与C54x兼容,C55x使用一个特殊的硬件逻辑自动将ASM域中的值复制到T2中。故将C54x的ASM Load指令替换为相应的C55x指令。用C55x本地指令代替 ASM Load指令可以避免MASM55将其翻译成多条指令。例如,将LD *AR2,ASM替换为MOV *AR2,T2。 ④在C54x代码中,经常需要加入一些NOP指令以避免流水线冲突,而C55x会自动加入延时避免冲突,故删除无用的NOP指令。 ⑤当BK=0时,去掉循环寻址符号%和初始化BK的代码。 (3)对C54x指令应用C55x指令级并行性 在C54x代码移植到C55x环境之前,可以应用C55x指令级并行性,按一定的规则将某些指令变成并行对,例如: STLM A,AR2||MVDK *SP(h),AR2 MVDK *SP(db),AR4||LD #0,A 通过本节的工作可以修改某些由MASM55产生的低效率代码,利用C55x的指令级并行性,改进堆栈的使用,从而降低运算量并获得更好的性能。2.3 使用C55x指令对高运算量函数进行代码优化 经过2.2节的优化后,程序的性能仍不能满足要求,可以利用C55x的结构特点,使用C55x本地指令重新编写某些运算量密集的函数。占用整个算法运算量80%以上的函数可以考虑用C55x本地指令来实现。可以用于优化的C55x新特征主要有: (2)对MAC优化 C54x可以在一个周期内实现一次乘/加操作,C55x则可以在一个周期内使用来自C、D和B总线的三个独立操作数实现两次乘/加操作,两个MAC单元都使用B总线提供的数据,如图2所示。因此双MAC指令的第三和第四个操作数必须是相同的,例如MAC *AR2+,*CDP+,AC0::MAC *AR3+,*CDP+,AC1。在可能的情况下,将C54x实现单MAC操作的指令替为C55x双MAC指令,可以使运算量下降为原来的1/2。 (2)循环寻址的优化 C55x中循环寻址的实现方法较之C54x更加灵活方便。首先,C55x不需要循环缓冲队列,最多可支持五个缓冲区和三种循环缓冲区大小。其次,C54x循环寻址的ARn寄存器包含的是绝对地址,C55x ARn包含的是相对于BSAxx寄存器中缓冲区起始地址的偏移。 (3) 优化循环的实现 C54x和C55x有相似的循环和块循环机制,但C55x支持两级块循环嵌套(在C54CM=0时),增加了新指令RPTBLOCAL和使用CSR的单重复指令(RPTADD和RPTSUB)。因此,应从以下方面进行优化;尽量使用RPTBLOCAL代替RPTB;使用RPTB或RPTBLOCAL代替BANZ实现外层循环;当单指令重复次数是在运行时计算时,使用RPT/RPTADD/RPTSUB指令。 (4) A单元ALU的利用 利用C55x中新增的16位A单元ALU可以实现更高效的ARn计算,利用AMOV指令可以更快地对AR进行初始化。 (5) 新增累加器和T寄存器的使用 C54x有两个累加器和一个临时寄存器,C55x有四个累加器,且增加了两个临时寄存器TO和T1。这些累加器和寄存器可以代替数据存储保存中间结果和临时变量,从而减少流水线延时,提高并行性。 (6) 使用双操作数读和写实现快速数据移动 C54x只有两条16位读总线和一条16位写总线,C55x增加了一条读总线和一条写总线,可以在一个周期内完成32位的写操作,而C54x则需要两个周期。 (7) 充分利用Xmem/Ymem寻址 在C54x和C55x中,特殊的双AR间接寻址(Xeme/Ymem)方式可以同时进行两个16位数据存储器访问。C54x的Xmem/Ymem寻址局限于四种组织(*ARx、*ARx+、*ARx-,*ARx+0%),只能使用AR2、AR3、AR4、AR5,而C55x可以使用八个辅助寄存器中的任何一个。 3 移植过程中需要注意的问题 3.1 C54x和C55x流水器的不同 由于在顺序流水线操作中,每条指令都是在前面几条指令尚未完全结束时就开始执行的,所以就有可能发出前面指令对某些寄存器的更新尚水完成而后台的指令就开始使用该寄存器的情况,这就是流水线冲突。C54x的流水线是完全开放的,在编程中需要特别注意防止流水线冲突。因此,有时需要在两条指令之间加入一条或几条NOP指令来形成延时,以保证后面指令使用寄存器时,前面指令对它的更新已经完成。有时为了使程序更加优化,可以充分利用这种延时来插入其它指令。C55x的流水线是完全保护的,在可能发生冲突时会自动加入延时保证指令顺序执行。因此,利用C54x流水线具有开放特点的代码移植到C55x,执行结果就可能与原来不一样,产生错误。例如: DLD *AR_kernel+,A MAX B ADDM #1,AR_i XC 1,NC MVDD *AR_i,*AR_maxgp C54x中ADDM指令放在XC指令之前是为了利用C54x不对流水线进行保护的特点,节省NOP周期,而在C55x中指令是顺序执行的,ADDM指令会影响到后面指令的判断条件,从而导致程序出错,因此必须进行修改,将ADDM指令置于MVDD之后。 3.2 命令文件的编写 命令文件对堆栈和系统堆栈的大小进行初始化、分配程序和数据在存储器的位置和各自的大小。在编写命令文件时,需要注意C54x和C55x的差别。C54x的程序和数据存储空间是分开的,而C55x采用统一的存储结构,程序和数据共享同一地址空。在命令文件中,C54x使用以16位字为单位的地址和长度,而C55x以字节为单元。对于.sysmem和.stack节,若要保持与C54x中相同的大小,应将原来的值乘以2。需要注意的是,在C55x的map文件,程序地址是以字节为单元,数据地址则是以16位字为单位的。将C54x代码移植到C55x上,对程序和数据空间的分配有一些限制,必须将数据堆栈和系统堆栈分配在同一64K的页中,将所有数据都放置在第0页。在C55x中还必须增加-sysstack字,对系统堆栈进行初始化。 3.3 混合编程中C54x和C55x函数调用的不同 在进行DSP应用开发时,完全采用汇编语言编程,复杂性高、开发周期长;而完全采用C语言编程,则程序的执行效率相对较低,不能完全满足实时性要求。因此,可以采用混合编程,把C语言和汇编语言的优点有效地结合起来,对占用大部分执行时间的核心代码采用汇编语言编写,可以大大提高代码的执行效率,而C程序可以像调用C函数那样去调用汇编函数。 C语言和汇编语言混合编程中调用子程序时,C54x中使用寄存器A和堆栈传递函数参数,而C55x中则使用AR和T0寄存器传递参数。设函数格式为:Word32 funcname(参数1,参数2,参数3,参数4,...,参数n),C54x函数参数传递规则如下:参数1放在寄存器A中,其它参数依次存入堆栈,参数2存入SP(0),参数3存入SP(1),...,依此类推。各种指针类型参数占用1个字(Word16)。若某参数为Word32类型,则其在堆栈中必须为双字对齐,也即放置在*SP(2n)处,函数返回值放在寄存器A中。C55x函数参数传递规则如下:最后一个参数(参数n)利用寄存器T0来传递,其它参数依次放在AR0,AR1,AR2,...中,例如参数1放在AR0中、参数2放在AR1中等。 在C程序中,分配局部变量、变量初始化、传递函数变量、保存函数返回地址、保护临时结果等功能都是靠堆栈完成的。C编译器无法检查程序运行时堆栈是否溢出,所以应尽量多给堆栈分配空间。在程序不正常跑飞时应注意检查是否堆栈溢出。 通过对低速率语音编码算法的C54x代码进行一些手工修改,然后用MASM55重新编译,很快地将其移植到了OMAP5910的C55x DSP芯片上,在非常短的时间内正确地实现了程序的全部功能。测试发现,直接从C54x移植过来的代码在C55x上执行效率比较低。例如,2400b/s声码器的运算量从原来的37.8MIPS上升为64MIPS,经过第二阶段的优化后,运算量降至39MIPS,基本上与原来在C54x上的性能相当,继续进行第三阶段的优化可以获得比原来更好的性能。实践证明,利用本文的方法将算法在C55x上实时实现,能允分利用先前在C54x上的开发成果、节省时间和人力、降低开发成本,是一种行之有效极具应用价值的方法。 C54x是业界目前最省电的DSP元件,已经成为通过市场的主流产品,应用于全世界70%的数字移动电话中。C55x在C54x的基础上又有了很大的提高,功耗只有C55x的1/6,代码长度缩短了30%,性能高出了近五倍。C55x的高性能低功耗特点能大幅度提高便携式设备的处理能力和电池的使用寿命,将会广泛应用于新一代手机、便携式音频播放器、个人医疗设备、数据相机、互联网信息系统及节能的多信道电话系统等领域。因此,在很多场合都需要C54x上的软件系统移植到平台上,本文介绍了方法和经验极具推广价值。

评论


相关推荐

技术专区

关闭