tms320c6000系列dsp程序开发.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于每种数据类型的尺寸,在编写C代码时应遵循以下的规则: (1)避免在代码中将int和long类型作为相同的尺寸来处理,因为TMS320C6000编译器对long类型的数据使用40位操作。 (2)对于定点乘法输入,应尽可能使用short类型的数据,因为该数据类型为TMS320C6000的16位乘法器提供最有效的使用。 (3)对循环计数器使用int或者unsigned int数据类型,而不使用short或者unsigned short类型,避免不必要的符号扩展指令。 2.分析C代码的性能 使用以下手段可以分析特定代码段的性能: (1)代码性能的主要衡量方法之一是代码运行所占用的时间。使用C语言中clock()和printf()函数具有计时和显示特定代码的功能,为了达到这一目的,利用独立的软件模拟器运行这段代码。 (2)利用动态调试器(debugger)中的profile模式,可以得到一个关于代码中特定代码段执行情况的统计表。 (3)使用动态调试器中的中断﹑clk寄存器和RUNB命令可以跟踪特定代码段所占用的CPU时钟周期数。 (4)在代码中影响性能的主要代码段通常是循环。优化一个循环,最容易的方法是抽出此循环,使之成为一个单独的可重新编写﹑编译和运行的文件。 编译工具包括一个外壳程序(cl6x),用于编译﹑汇编优化﹑汇编和程序连接。要激活编译外壳程序,输入如下: cl6x [options] [filenames] [–z [linker options] [object files]] (1)如果编译器不能确定两条指令是否独立,假设它们相关并且顺序安排这两条指令。 (2)如果编译器能确定两条指令是独立的,将安排它们并行执行。 通常编译器很难确定访问存储器的指令是否独立,以下的方法可以帮助编译器确定指令是否独立。 (3)使用关键字const标识变量的存储单元不会被函数改变。const表示一个变量或者变量的存储单元保持不变。尽可能使用const是编写代码的较好方法,因为它使用简单且可以提高代码的性能。 (4)联合使用-pm选项和-o3选项可确定程序级优化,所有的源文件都被编译成称为模块的中间文件。由于编译器访问到整个程序,因此它可以执行几个在文件级优化中很少用的优化手段。 (5)使用-mt选项是向编译器说明,在代码中不存在存储器相关性,即允许编译器在无存储器相关性的假设下改进优化。 下面通过举例说明存储器相关性的概念。例4.6给出了基本矢量和C代码,图4-1给出了其相关图。 1.使用内嵌函数 TMS320C6000提供的内嵌函数是一种直接映射为内嵌TMS320C6000汇编指令的特殊函数,可以快速优化C/C++代码。内嵌函数用下划线(_)开头,使用方法同调用普通函数一样。 【例4.7】 没有内嵌函数的饱和加法。 int sadd(int a, int b) { int result; result = a + b; if (((a ^ b) 0 == 0) { if ((result ^ a) 0 { result = (a 0) ? 0: 0x7fffffff; } } return (result); } 【例4.8】 使用内嵌函数的饱和加法。 result = _sadd(a,b); 2.软件流水 软件用于安排循环指令,使循环的多次迭代以并行方式执行。当使用编译器的-o2和-o3选项时,编译器使用软件流水优化源代码并且从程序中收集相关的优化信息。图4-2为循环的软件流水示意图。 (1)循环计数 下例分别为优化前后的代码: 原始代码: for (i = 0; i N; i++) /* i = 循环计数变量, N = 循环次数 */ 优化后代码: for (i = N; i != 0; i––) /* 逆序计数 */ (2)消除冗余循环 有时编译器不能够确定循环是否总是执行大于最小循环次数,因此,编译器将会产出两种版本的循环: ① 如果循环计数值小于最小循环次数,则执行非软件流水循环版本; ② 如果循环计数值等于或大于最小循环次数,则执行软件流水的版本。 激活编译器时可以使用以下的选项将循环次数传给编译器: 用-o3和-pm选项允许优化器访问整个程序或者部分,了解循环次数信息; 使用-nassert内核防止冗余循环的产生,或者允许编译器(使用或者未使用-ms选项)软件流水最内层循环以减少代码量。 (3)循环展开 有3种循环展开的方式: ① 编译器可以自动进行循环展开; ② 可以通过UNROLL伪指令建议编译器进行循环展开; ③ 可以自己循

文档评论(0)

喵咪147 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档