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

上传人:daj****de 文档编号:51488616 上传时间:2022-01-26 格式:DOCX 页数:6 大小:14.05KB
收藏 版权申诉 举报 下载
C代码在TMS320C54X上的手工汇编优化_第1页
第1页 / 共6页
C代码在TMS320C54X上的手工汇编优化_第2页
第2页 / 共6页
C代码在TMS320C54X上的手工汇编优化_第3页
第3页 / 共6页
资源描述:

《C代码在TMS320C54X上的手工汇编优化》由会员分享,可在线阅读,更多相关《C代码在TMS320C54X上的手工汇编优化(6页珍藏版)》请在装配图网上搜索。

1、C代码在 TMS320C54X上的手工汇编优化1 引言随着 DSP技术的不断发展和完善,数字信号处理的应用范围越 来越广泛。工控、计算机、通信和消费电子产品中,都会找到它的影子。近年 来,随着多媒体通信的蓬勃发展, DSP也越来越多的应用在多媒体通信中,而 在多媒体通信中 DSP多用于语音压缩和图像处理等方面,而这些都需要巨大的 计算量,在实时通信中一些低速 DSP难以满足要求,而使用高速 DSP会大大提 高成本,所以对代码进行优化是现在 DSP开发中常用的一种方法。由于 DSP的 特殊结构,编译器的编译效率都比较低,难以将 DSP计算能力全部发挥出来, 所以就必须根据 DSP的特殊结构和指令

2、集代码进行手工的汇编优化。本文结合笔者在 TI 公司的 TMS320VC5402 DSP上的对 G.729 算 法的优化经验,提出一些优化的方法和建议,而这些方法也适用其他54 系列的DSP。2 芯片介绍TMS320C54是X TI 公司于 1996 年推出的新一代定点数字处理 器,它具有功耗小、高度并行等优点,可以满足电信等众多领域的实时处理要 求。54 系列有很多不同型号的芯片,它们的结构都是一样的,只是在接口和存 储器空间上有些不同。在 54系列众多 DSP芯片中 TMS320VC540是2 使用最广 泛的一种芯片,接下来将以 TMS320VC540为2 例介绍 54系列 DSP的性能特

3、点: 运算速度最高达 100MIPS 具有先进的多总线结构 , 三条 16 位数据存储器总线和一条程序存储器总 线 40 位算术逻辑单元( ALU),包括一个 40 位桶形移位器和两个 40 位累加 器 一个 17bit 17bit 乘法器和 40位专用加法器,允许 16 位带/不带符号乘 法 8 个辅助寄存器和一个软件栈 内部采用改进的哈佛结构,程序空间和数据空间分开,允许同时取指令和 取操作数,并且允许在程序和数据空间相互传送数据 最大 64K 16bit 外部数据空间,最大 1M16bit 外部程序空间, 4K16bit 片内 ROM,16K16bit 片内 RAM 内置可编程等待状态发

4、生器、锁相环( PLL)时钟发生器、两个多通道缓冲 串口、一个 8位并行与外部处理器通信的 HPI 口、两个 16 位定时器以及 6 通道 DMA控制器 支持单指令循环和块循环,采用六级流水线,将一条指令执行所需要的取指、译码、取操作数并执行等几个步骤同时完成,是指令周期降到最小适合算 法的优化3 代码优化对 C 代码进行手工汇编优化有三种方法: 1. 对照 C 代码写出汇 编代码,这种方法优化的效率很高,但是开发难度很大特别是当代码量很大, 结构很复杂时优化很容易出错; 2. 先用编译器产生汇编代码,然后改写汇编代 码,这种方法优化的效率较低,因为框架被限定了,但是开发难度降低了,不 容易出

5、错。 由于现在常用的一些音频、图像处理算法都是结构很复杂的程序,所以建议使 用第二种优化方法。3.1 产生汇编代码TI 公司为 DSP开发者提供一套编译开发平台叫CCS (Code Composer Studio ), 该工具提供了编译器可以将 C语言的程序 编译为 DSP的汇编语言程序,然后链接生成可以在 DSP上执行的 COFF格式的 out 文件。而 CCS自身也提供优化器可对 C 代码进行优化,并产生汇编语 言程序,具体过程如图 1 所示。CCS提供了 4 级的文件优化方案,分别是 O0、O1、O2、O3,以下 具体说明。(1) O0 寄存器级别 执行控制流程简化 用寄存器分配变量 执

6、行交替循环 排除未用的代码 简化公式和表述 扩大对内连函数的调用(2) O1 局部级别执行所有 O0级别的优化,并且: 执行局部常量的传播 排除未用的赋值 排除局部共用表达式(3) O2 函数级别 执行所有 O1级别的优化,并且: 执行循环优化 排除全局共用子表达式 排除全局不用的赋值 执行打开循环(4) O3 文件级别执行所有 O1级别的优化,并且: 排除未被调用的函数 简化返回值没被使用的函数 让小函数变成内联调用 保存函数说明,以便主函数被优化时知道被调用 函数的属性 识别文件级别的变量的特性在使用 O3级别的优化时,还可以使用别的选项执行更细致的优 化 OLN 得到标准库函数的文件 O

7、NN 创造优化信息文件 PM 执行程序级别优化,编译多个源文件而我们在做优化时,选的是 O2级别的优化,因为使用 O2级别 优化后产生的汇编文件带有比较多的注释信息,比较容易看懂程序,建议对程 序不太熟和对汇编语言不太熟练的人使用。3.2 手工汇编优化 因为汇编语言可读性很差,并且代码量很大,所以手工优化工作量很大,并且容易出错。为了确保优化不出错,我们就先制作一段测试序列 即程序的输入,然后运行程序对其进行处理,生成一段正确的结果序列,检验 手工优化是否正确就是用优化过的程序对相同的测试序列进行处理,比较生成 的结果序列和正确的结果序列是否一样,一样的话就代表优化无误。不过测试 序列要比较长

8、,因为有的错误开始不会显现出来,只是慢慢累积,运行一段时 间才会出现。接下来,就开始手工优化的工作。下面就是我对手工优化的一些经验(1) 尽量少进行函数调用。因为进行函数调用的时候,要将PC压栈,还要将一些寄存器压栈,函数调用完后,还要出栈,这都是一些不必 要的操作,所以一些小的函数,就不调用,而是直接写入主函数里,这样可以 就可以减少那些压栈出栈的操作,提高速度。(2) 优化循环时,尽量将一些操作放到循环外面去,减少操作的次数。例如一些赋值和初始化操作,可以提到循环外面去做,来提高速度。(3) 去除一些冗余的赋值。编译器产生的代码有很多赋值,经常将一个值赋给寄存器,再赋给变量,这样就产生了冗

9、余。(4) 尽量使用 RPT和 RPTB来执行循环操作。在编译器产生的 代码里很多循环操作是通过条件判别来实现的,这样就多了很多无用的判别代 码,而 54x 的 DSP芯片就提供专门的循环指令: RPT和 RPTB。 RPT的功能就是 循环执行下一条指令,循环次数由 RC寄存器的值决定,循环次数是 RC寄存器 的值加 1,所以执行循环前要将循环次数减 1赋给 RC寄存器; RPTB是块循环指 令,它的功能是循环执行一段指令,它的循环次数由 BRC寄存器决定,循环次 数是 BRC的寄存器的值加 1,所以使用前需将循环次数减 1 赋给 BRC寄存器。(5) 使用比较快的寻址方式。在数字信号处理里面

10、,会对大量 的数据进行大量的运算,如果使用比较快的寻址方式会大大减少指令周期。因 为数据大多是顺序存放,所以我们用寄存器去寻址,操作完后自加1 而指向下个数据,这样寻址会减少很多指令周期。(6) 使用循环缓冲区。因为 FFT,FIR 等常用运算中都需要对 数据进行移位操作,如果数据量大的话,程序花在数据移位上的开销就很大 了,如果使用循环缓冲区就可以不进行这些操作从而提高速度。(7) 使用一些专用指令。在 54 的指令系统里,有一些专用指 令执行一些特殊的操作,例如平方, FIR 等,如果用其他指令代替需要多个指 令周期, 而使用专用指令值需要一个指令周期。(8) 使用并行指令。因为 DSP的

11、流水线结构,可以让一些指令 同时运行,就产生了并行指令,使用并行指令会大大减少指令周期。(9) 将一些常用的程序和数据,放在片内 RAM运行。 DSP芯片 上一般都带有 RAM,而片内 RAM的寻址速度比片外 RAM快一至两倍,所以将常 用程序和数据放在片内,会大大提高运行速度。3.3 优化中常遇见的问题在手工优化过程时会遇到很多问题,以下几点比较常见(1) 对一些寄存器的设置。因为是手工优化,所以对一些寄存 器都要自己赋值,例如 ST0、ST1和 PMST等,不同的设置会导致运算结果的不 一样。其中一些用的比较多的位有 SXM、OVM和 FRCT。SXM是符号扩展位,如果 SXM=0就不进行

12、符号扩展,如果 SXM=1就进行符号扩展(见图 2a)。 OVM是溢 出模式位,当发生溢出时,如果 OVM=0溢出的结果就被送往目的寄存器,如果 OVM=1就往目的寄存器送最大的正数( 007FFFFFFF)h 或最小的负数 ( FF80000000h)。 FRCT是小数模式位,当 FRCT=1时乘法的结果会左移一位 (见图 2b)。以上 3 个标志位的置位和复位是由 SSBX和 RSBX指令来完成 的。(2) 注意流水线冲突。 5402的芯片有一个 6 级深度的指令流 水线,这 6级流水线彼此是独立的,在任何一个机器周期内,可以有1至 6条不同的指令在工作。这 6 级流水线的功能分别是预取指

13、、取指、译码、寻址、 读数和执行。 C5402多级流水线操作可以让多条指令同时指令访问 CPU资源, 如果多个流水线同时访问到相同的资源,就可能发生流水线冲突,有些冲突可 以由 CPU通过延迟寻址的方法自动缓解,而有的冲突是不能防止的,需要由程 序重新安排指令或插入空操作来解决。当用 CCS编译器对 C 程序进行编译的时 候,编译器会自动加入 NOP指令来解决流水线冲突,而进行手工优化的时候, 就要特别注意这个问题,大部分流水线冲突都是因为同时访问到某些寄存器, 只要根据等待周期表加入相应的 NOP指令就可以解决。(3) 对一些参数的保存。在手工优化的过程中,我们会用某些寄存器来传递数据,而在

14、此过程中,如果调用了别的函数,这些寄存器的值就 有可能被改变,所以在调用这些函数的时候,要先将这些参数压栈保存,调用 完后再将其出栈恢复。还有就是某些标志位的保存,因为在调用函数的过程会 改变这些状态标志位,所以在调用完后要将其恢复。(4) 循环缓冲区地址分配问题。循环缓冲区的地址分配必须对 齐,长度为 R 的缓冲区必须从 N 位地址的边界开始(即循环缓冲区基地址的 N 个最低有效位必须为 0), N 是满足 2NR的最小的整数。例如,长度 R=31的 循环缓冲区必须从地址 XXXX XXXX XXX0 00002(N=5,2531,该地址的最 低 5 位为 0 )。(5) 内存泄漏问题。因为

15、 DSP使用的是哈佛结构,数据空间和 程序空间是分开的,一般数据的操作不会影响到程序。但是DSP芯片上都带有RAM,而这些空间数据和程序是共享的,所以对该部分的数据进行操作,如果有 泄漏的话会改写程序,导致程序跑飞。因此程序跑飞的话,就要考虑是否有内 存泄漏。4 结论以上经验和技巧均是笔者在实际的 DSP工程中总结得出,实践 证明对实际开发非常有帮助。以笔者对 G.729 算法优化为例,在优化之前, G.729 的运算量为 1000MIPS,优化后的运算量为 30MIPS,提高了 30多倍,可 见优化的效果很明显。以上这些经验主要是针对 TI 公司的 54 系列,但对于 别的型号的 DSP也有借鉴作用。参考文献1 彭启琮 .TMS320C54X实用教程 . 电子科技大学出版社, 20002 戴明桢 .TMS320C54X数字信号处理器结构、原理及应用 .TI DSPS UNIVERSITY,2000

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!