C代码在TMS320C54X上的手工汇编优化

分享到:

      1 引言

       随着DSP技术的不断发展和完善,数字信号处理的应用范围越来越广泛。工控、计算机、通信和消费电子产品中,都会找到它的影子。

       近年来,随着多媒体通信的蓬勃发展,DSP也越来越多的应用在多媒体通信中,而在多媒体通信中DSP多用于语音压缩和图像处理等方面,而这些都需要巨大的计算量,在实时通信中一些低速DSP难以满足要求,而使用高速DSP会大大提高成本,所以对代码进行优化是现在DSP开发中常用的一种方法。由于DSP的特殊结构,编译器的编译效率都比较低,难以将DSP计算能力全部发挥出来,所以就必须根据DSP的特殊结构和指令集代码进行手工的汇编优化。

       本文结合笔者在TI公司的TMS320VC5402 DSP上的对G.729算法的优化经验,提出一些优化的方法和建议,而这些方法也适用其他54系列的DSP。 

        2 芯片介绍

       TMS320C54X是TI公司于1996年推出的新一代定点数字处理器,它具有功耗小、高度并行等优点,可以满足电信等众多领域的实时处理要求。54系列有很多不同型号的芯片,它们的结构都是一样的,只是在接口和存储器空间上有些不同。在54系列众多DSP芯片中 TMS320VC5402是使用最广泛的一种芯片,接下来将以TMS320VC5402为例介绍54系列DSP的性能特点:

       ● 运算速度最高达100MIPS 
       ● 具有先进的多总线结构,三条16 位数据存储器总线和一条程序存储器总线        
       ● 40位算术逻辑单元(ALU),包括一个40位桶形移位器和两个40位累加       器 
       ● 一个17bit×17bit乘法器和40位专用加法器,允许16位带/不带符号乘法 
       ● 8个辅助寄存器和一个软件栈 
       ● 内部采用改进的哈佛结构,程序空间和数据空间分开,允许同时取指令和取操作数,并且允许在程序和数据空间相互传送数据 
       ● 最大64K×16bit外部数据空间,最大1M×16bit外部程序空间,4K×16bit片内ROM,16K×16bit片内RAM 
       ● 内置可编程等待状态发生器、锁相环(PLL)时钟发生器、两个多通道缓冲串口、一个8位并行与外部处理器通信的HPI口、两个16位定时器以及6通道DMA控制器 
       ● 支持单指令循环和块循环,采用六级流水线,将一条指令执行所需要的取指、译码、取操作数并执行等几个步骤同时完成,是指令周期降到最小适合算法的优化

       3 代码优化

       对C代码进行手工汇编优化有三种方法:1.对照C代码写出汇编代码,这种方法优化的效率很高,但是开发难度很大特别是当代码量很大,结构很复杂时优化很容易出错;2.先用编译器产生汇编代码,然后改写汇编代码,这种方法优化的效率较低,因为框架被限定了,但是开发难度降低了,不容易出错。
由于现在常用的一些音频、图像处理算法都是结构很复杂的程序,所以建议使用第二种优化方法。

       3.1产生汇编代码

       TI公司为DSP开发者提供一套编译开发平台叫CCS (Code Composer Studio),该工具提供了编译器可以将C语言的程序编译为DSP的汇编语言程序,然后链接生成可以在DSP上执行的COFF格式的out文件。

        而CCS自身也提供优化器可对C代码进行优化,并产生汇编语言程序,具体过程如图1所示。

       CCS提供了4级的文件优化方案,分别是O0、O1、O2、O3,以下具体说明

       (1) O0 寄存器级别

        ● 执行控制流程简化 
        ● 用寄存器分配变量 
        ● 执行交替循环 
        ● 排除未用的代码 
        ● 简化公式和表述 
        ● 扩大对内连函数的调用

       (2) O1 局部级别

      执行所有O0级别的优化,并且:

        ● 执行局部常量的传播 
        ● 排除未用的赋值 
        ● 排除局部共用表达式

       (3) O2 函数级别

       执行所有O1级别的优化,并且:

        ● 执行循环优化 
        ● 排除全局共用子表达式 
        ● 排除全局不用的赋值 
        ● 执行打开循环

       (4) O3 文件级别

       执行所有O1级别的优化,并且:

        ● 排除未被调用的函数 
        ● 简化返回值没被使用的函数 
        ● 让小函数变成内联调用 
        ● 保存函数说明,以便主函数被优化时知道被调用 函数的属性 
        ● 识别文件级别的变量的特性

       在使用O3级别的优化时,还可以使用别的选项执行更细致的优化

        ● OLN 得到标准库函数的文件 
        ● ONN 创造优化信息文件 
        ● PM 执行程序级别优化,编译多个源文件

 

产生汇编代码


       而我们在做优化时,选的是O2级别的优化,因为使用O2级别优化后产生的汇编文件带有比较多的注释信息,比较容易看懂程序,建议对程序不太熟和对汇编语言不太熟练的人使用。

精彩活动