DSP 优化心得解析

合集下载

dsp学习心得体会 学习心得体会

dsp学习心得体会  学习心得体会

dsp学习心得体会学习心得体会篇一:DSP学习总结DSP学习总结摘要:本总结介绍了数字信号技术(DSP)的基本结构,特点,发展及应用现状。

通过分析与观察,寄予了DSP美好发展前景的希望。

关键字:数字信号处理器,DSP,特点,应用1 DSP介绍数字信号处理简称DSP,是进行数字信号处理的专用芯片,是伴随着微电子学、数字信号处理技术、计算机技术的发展而产生的新器件,是对信号和图像实现实时处理的一类高性能的CPU。

所谓“实时实现”,是指一个实际的系统能在人们听觉、视觉或按要求所允许的时间范围内对输入信号进行处理,并输出处理结果。

数字信号是利用计算机或专用的处理设备,以数值计算的方式对信号进行采集、变换、综合、估计与识别等加工处理,从而达到提取信息和方便应用的目的。

数字信号处理的实现1是以数字信号处理理论和计算技术为基础的。

2 结构32位的C28xDSP整合了DSP和微控制器的最佳特性,能够在一个周期内完成32*32位的乘法累加运算。

所有的C28x芯片都含一个CPU、仿真逻辑以及内存和片内外设备的接口信号(具体结构图见有关书籍)。

CPU的主要组成部分有:程序和数据控制逻辑。

该逻辑用来从程序存储器取回的一串指令。

实时和可视性的仿真逻辑。

地址寄存器算数单元(ARAU)。

ARAU为从数据存储器取回的数据分配地址。

算术逻辑单元(ALU)。

32位的ALU执行二进制的补码布尔运算。

预取对列和指令译码。

为程序和数据而设的地址发生器。

定点MPY/ALU。

乘法器执行32位*32位的二进制补码乘法,并产生64位的计算结果。

中断处理。

3 特点采用哈佛结构。

传统的冯?诺曼结构的数据总线和指令总线是公用的,因此在高运算时在传输通道上会出拥堵现象。

而采用哈佛结构的DSP 芯片片内至少有4 套总线:程序的地址总线与数据总线,数据的地址总线与数据总线。

由于这种结构的数据总线和程序总线分离,从而在一个周期内同能2时获取程序存储器内的指令字和数据存储器内的操作数,提高了执行速度。

dsp优化心得

dsp优化心得

iPone 的一句大家都耳熟能详的广告词:“一直被模仿,从未被超越” 。

笔者认为主要是因为他们掌握着核心的算法和机器的优化策略。

因为一般的硬件我们都买的回来,但是能否将该硬件发挥到极致,就会公司之间的差别,因为同样的硬件,如果软件执行的速度不同,那结果就会有很大的差别,所以说:真正的技术是买不来的。

所以,我们进行嵌入式开发的时候,一旦选定了DSP6000系列的芯片,就不能把它当成单片机来用,必须发挥dsp 与众不同,独一无二的性能。

也就是说如何调整c 语言才能够适应这么强悍的硬件就是我们考虑的重点内容,即我们应该按照哪种既定的原则去编写C 代码才能够让dsp 真正作为dsp 在工作,发挥到dsp 的优势。

dsp 的优势在于:速度!所以,dsp 的优化成为一门专业。

所以,我们一定要使自己在dsp 上编写的c 代码高效运行。

因为制约运行速度的因素是硬件和软件。

因为dsp 一旦选定,硬件也就确定了。

所以,我们首先要注意如何提升软件的效率。

对于软件来说,一般情况下有3 个优化等级。

第一:算法上优化。

第二:程序结构上的优化。

第三:汇编级的优化。

我们需要的是研究前两个等级的优化。

所以,在这篇文章中,我们需要研究的重点有两个:dsp 的硬件结构和在dsp 上如何优化c 代码。

dsp 的硬件结构关于dsp 硬件结构的特色有几个:哈佛结构,流水线结构,带宽和运算方式的高效等。

1.1.1 哈佛结构哈佛结构的本质属性是数据存储器(RAM存储数据的存储器)和程序存储器(存储指令)分开。

Cpu可以一边取指令,一边取数据。

这样会极大的提高处理的速度,因为以前是冯诺依曼结构,总线是分时复用的,这样会降低处理的速度。

而且,dsp6000系列是基于VLIW结构的,具体来讲就说CPU可以提取通过程序从程序存储器中一次提取256bit的指令,即CPU可以一次取8条指令放在处理中。

加上和8级流水线的配合,相当于8个传统的CPU一起工作。

dsp实习心得体会

dsp实习心得体会

dsp实习心得体会
作为一名实习生,在经历了一段时间的实习,我对DSP工作有了更深入的了解,并积累了一些心得体会。

首先,学习是实习中最重要的一部分。

在实习过程中,我主动向导师和同事请教问题,学习他们的经验和技巧。

同时,我也会主动在工作之余积极学习相关的书籍和资料,
不断提升自己的专业水平。

其次,沟通和合作能力至关重要。

在实习过程中,我意识到与同事和团队合作的重要性。

良好的沟通能力可以帮助我更好地理解任务需求,并与团队成员共同解决问题。

合作能力也是实现团队目标的关键,通过与团队成员的紧密合作,我们可以更高效地
完成任务。

另外,实习对于培养解决问题的能力也起到了重要的作用。

在实习过程中,我们经常
面临各种挑战和问题。

我逐渐养成了主动思考和分析问题的习惯,学会了寻找解决问
题的办法。

通过克服困难,我不仅增加了自信心,而且也锻炼了自己的解决问题的能力。

最后,实习也是一个提升自己综合素质的机会。

除了专业知识和技能外,我还懂得了
工作中的细节管理、时间管理,以及处理压力的能力。

通过实习,我不仅在专业方面
得到了提升,还全面提升了自己作为一名职业人士所必备的综合素质。

总之,通过这段实习经历,我深刻认识到了专业能力、沟通能力、问题解决能力以及
综合素质的重要性。

我将会继续学习和提升自己,不断成长,为将来的工作打下坚实
的基础。

dsp心得体会

dsp心得体会

dsp心得体会1、不影响执行速度的情况下,可以使用c或c/c++语言提供的函数库,也可以自己设计函数,这样更易于使用“裁缝师”优化处理,例如:进行绝对值运算,可以调用fabs()或abs()函数,也可以使用if..else..判断语句来替代。

2、要非常谨慎地使用局部变量,根据自己项目开发的需要,应尽可能多地使用全局变量和静态变量。

3、一定要非常重视中断向量表的问题,很多朋友对中断向量表的调用方式不清楚。

其实中断向量表中的中断名是任意取定的,dsp 是不认名字的,它只认地址!!中断向量表要重新定位。

这一点很重要。

4、要明确dsp软件开发的第一步是对可用存储空间的分析,存储空间分配好坏关系到一个dsp程序员的水平。

对于dsp,我们有两种名称的存储空间,一种是物理空间,另一种是映射空间。

物理空间是dsp上可以存放数据和程序的实际空间(包括外部存储器),我们的数据和程序最终放到物理空间上,但我们并不能直接访问它们。

我们要访问物理空间,必须借助于映射空间才行!!但是映射空间本身是个“虚”空间,是个不存在的空间。

所以,往往是映射空间远远大于实际的物理空间,有些映射空间,如io映射空间,它本身还代表了一种接口。

只有那些物理空间映射到的映射空间才是我们真正可访问(读或写)的存储空间。

5、尽可能地减少除法运算,而尽可能多地使用乘法和加法运算代替。

6、如果ti公司或第三方软件合作商提供了dsplib或其他的合法子程序库供调用,应尽可能地调用使用。

这些子程序均使用用汇编写成,更为重要之处是通过了tms320算法标准测试。

而且,常用的数字信号处理算法均有包括!!7、尽可能地采用内联函数!!而不用一般的函数!!可以提高代码的集成度。

8、编程风格力求简炼!!尽可能用c语言而不用c++语言。

我个人感到虽然c++终代码长了一些,好象对执行速度没有影响。

9、因为在c5000中double型和float型均占有2个字,所以都可以使用,而且,可以直接将int型赋给float型或double型,但,尽可能地多使用int数据类型代替!这一点需要注意!!10、程序最后至少要加上一个空行,编译器当这个空行为结尾提示符。

【心得体会】dsp实验心得体会

【心得体会】dsp实验心得体会

【心得体会】dsp实验心得体会在进行dsp实验的过程中,我收获了很多宝贵的经验和启示。

首先,在实验前,我深入了解了dsp的基本原理和相关的知识,为实验的顺利进行打下了坚实的基础。

其次,在实验过程中,我注重细节和精确度,时刻保持专注和耐心。

这对于实验结果的准确性和可靠性起到了至关重要的作用。

在实验过程中,我还学会了如何合理安排时间和资源。

由于dsp实验需要大量的计算和数据处理,我学会了如何高效地利用计算机和相关软件工具。

我学会了如何合理分配时间,以确保实验的顺利进行,并在规定的时间内完成实验任务。

在实验的过程中,我也遇到了一些问题和挑战。

例如,某些实验步骤需要复杂的编程和算法设计,我需要仔细思考和分析,才能找到解决问题的方法。

同时,我还需要不断调整和改进实验方案,以确保实验的准确性和可行性。

通过这次dsp实验,我不仅学到了专业知识和技能,还培养了自己的分析和解决问题的能力。

我学会了如何从不同的角度思考和分析问题,并找到最合适的解决方案。

我还学会了如何与团队成员合作,共同完成实验任务。

通过反思和总结,我认识到在进行dsp实验时,需要注重细节和精确度。

只有保持专注和耐心,才能获得准确和可靠的实验结果。

同时,我还意识到在实验过程中,需要灵活调整实验方案,并不断改进和优化。

只有不断学习和提高自己,才能在dsp领域取得更好的成绩。

最后,我想给其他学习dsp的同学一些建议。

首先,要注重理论知识的学习,建立扎实的基础。

其次,要勇于尝试和实践,通过实验来巩固和应用所学知识。

同时,要善于思考和分析问题,不断寻找解决问题的方法和途径。

最重要的是,要保持学习的热情和持续的努力,只有这样,才能在dsp领域获得更好的成长和发展。

总而言之,通过这次dsp实验,我不仅学到了专业知识和技能,还培养了自己的分析和解决问题的能力。

我学会了如何从不同的角度思考和分析问题,并找到最合适的解决方案。

通过反思和总结,我认识到在进行dsp实验时,需要注重细节和精确度,并不断改进和优化实验方案。

dsp心得体会范文

dsp心得体会范文

dsp心得体会范文dsp心得体会篇一:DSP原理及应用的学习体会这个学期通过《对DSP芯片的原理与开发应用》课程的学习,对DSP芯片的概念、基本结构、开发工具、常用芯片的运用有了一定的了解和认识,下面分别谈谈自己的体会。

一,DSP芯片的概念数字信号处理(DigitalSignalProcessing)是利用计算机或专用处理设备,以数字形式对信号进行采集、变换、增强、滤波、估值、压缩、识别等处理,以得到符合人们需要的信号形式。

20世纪60年代以来,随着计算机和信息技术的飞速发展,数字信号处理技术应运而生并得到迅速的发展。

在通信、等诸多领域得到极为广泛的应用。

DSP(DigitalSignalProcess)芯片,即数字信号处理器,是一种特别适合于进行数字信号处理运算的微处理器,其应用主要是实时快速的实现各种数字信号处理算法。

该芯片一般具有以下主要特点:(1)在一个指令周期内可完成一次乘法和一次加法;(2)程序与数据空间分开,可以同时访问指令和数据;(3)片内具有快速RAM,通常可通过独立的数据总线在两块中同时访问;(4)具有低开销或无开销循环及跳转的硬件支持;(5)快速的中断处理和硬件支持;(6)具有在单周期内操作的多个硬件地址产生器;(7)可以并行执行多个操作;(8)支持流水线操作,使取值、译码和执行等操作可以同时进行。

世界上第一个单片DSP芯片应当是1978年AMI公司发布的S2811,1979年美国INTEL公司发布的商用可编程器件2920是DSP芯片的一个主要里程碑。

这两种芯片内部都没有现代DSP芯片所必须有的单周期乘法器。

1980年,日本NEC公司推出的uPD7720是第一个具有乘法器的商用DSP芯片。

当前,美国德州公司(TI),Motorola公司,模拟器件公司(AD),NEC公司,AT&T公司是DSP芯片主要生产商。

选择合适的DSP芯片,是设计DSP应用系统的一个非常重要的环节。

DSP实验学习心得(word文档良心出品)

DSP实验学习心得(word文档良心出品)

DSP实验学习心得论DSP发展前景DSP 即为数字信号处理器(Digital Signal Processing),是在模拟信号变换成数字信号以后进行高速实时处理的专用处理器。

它的工作原理是将现实世界的模拟信号转换成数字信号,再用数学方法处理此信号,得到相应的结果。

自从数字信号处理器(Digital Signal Processor)问世以来,由于它具有高速、灵活、可编程、低功耗和便于接口等特点,已在图形、图像处理,语音、语言处理,通用信号处理,测量分析,通信等领域发挥越来越重要的作用。

随着成本的降低,控制界已对此产生浓厚兴趣,已在不少场合得到成功应用。

DSP 数字信号处理器DSP 芯片采用了数据总线和程序总线分离的哈佛结构及改进的哈佛结构,较传统处理器的冯?诺依曼结构具有更高的指令执行速度。

其处理速度比最快的CPU 快10-50 倍。

在当今数字化时代背景下,DSP 已成为通信、计算机、消费类电子产品等领域的基础器件,被誉为信息社会革命的“旗手”。

最初的DSP 器件只是被设计成用以完成复杂数字信号处理的算法。

DSP 器件紧随着数字信号理论的发展而不断发展。

DSP发展最快,现在的DSP 属于第五代产品,它与第四代相比,系统集成度更高,将DSP 芯核及外围组件综合集成在单一芯片上。

这种集成度极高的DSP 芯片不仅在通信、计算机领域大显身手,而且逐渐渗透到人们日常消费领域,前景十分可观。

近年来,随着通信技术的飞速发展,DSP已经成为信号与信息处理领域里一门十分重要的新兴学科,它代表着当今无线系统的主流发展方向。

现在,通信领域中许多产品都与DSP 密切联系,例如,Modem、数据加密、扩频通信、可视电话等。

而寻找DSP 芯片来实现算法最开始的目标是在可以接受的时间内对算法做仿真,随后是将波形存储起来,然后再加以处理。

在短短的十多年时间,DSP芯片已经在信号处理、通信、雷达等许多领域得到广泛的应用。

目前, DSP 芯片的价格也越来越低,性能价格比日益提高,具有巨大的应用潜力。

DSP程序优化总结

DSP程序优化总结

{ *q = (*q + *r) >> 1 ; } } *r = a - *q * *q ; }
推荐的代码: // 假设 q != r void isqrt(unsigned long a , unsigned long* q , unsigned long* r) { unsigned long qq , rr ; qq = a ; if (a > 0) { while (qq > (rr = a / qq)) { qq = (qq + rr) >> 1 ; } } rr = a - qq * qq ; *q = qq ; *r = rr ; }
{ r[i] = 0 ; for (j = 0 ; j < 4 ; j ++) { r[i] += M[j][i]*V[j] ; } } 推荐的代码: r[0] = M[0][0]*V[0] + M[1][0]*V[1] + M[2][0]*V[2] + M[3][0]*V[3] ; r[1] = M[0][1]*V[0] + M[1][1]*V[1] + M[2][1]*V[2] + M[3][1]*V[3] ; r[2] = M[0][2]*V[0] + M[1][2]*V[1] + M[2][2]*V[2] + M[3][2]*V[3] ; r[3] = M[0][3]*V[0] + M[1][3]*V[1] + M[2][3]*V[2] + M[3][3]*v[3] ;
3、减少运算的强度
( 1)、查表(游戏程序员必修课)
一个聪明的游戏大虾,基本上不会在自己的主循环里搞什么运算工作,绝对是先计算好了, 再到循环里查表。看下面的例子: 旧代码: long factorial(int i) { if (i == 0) return 1; else return i * factorial(i - 1); } 新代码: static long factorial_table[] = {1 , 1 , 2 , 6 , 24 , 120 , 720 long factorial(int i) { return factorial_table[i]; } 如果表很大,不好写,就写一个 init 函数,在循环外临时生成表格。 /* etc */ };
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C6XX优化经验总结一、c6x的编译的常用选项(一)c6x的编译程序为“cl6x.exe”使用的方法Cl6x [options] [filenames]Cl6x:编译程序Options:编译选项Filenames: C或汇编源文件说明:编译选项是一个字母或者两个字母,对大小写不敏感。

编译选项的前面需要有一个“-”符号。

一个字母的选项可以合并在一起。

比如“-sgq”与“-s -g -q”相同。

两个字母的选项如果第一个字母相同也可以合并在一起。

比如“-mgt”与“-mg -mt”相同。

(二)有关优化的选项-mt:表示在程序中没有使用alaising技术,这使得编译器可以进行比较好的优化。

-o3:对文件级别进行最强的优化,一般在编译时应该使用这个选项。

但是在个别情况下使用这个选项优化程序可能会出现错误(-o2有相同现象,-o0和-o1不会出现错误)。

可能是在优化循环,组织流水线的时候发生错误。

如果有这种现象出现可以同时使用-g选项,程序优化就不会出现错误,但是优化效果会下降。

另外可以调整程序的表达方式,可能会避免编译器发生错误。

-pm:在程序级别进行优化。

可以将所以文件联合在一起进行优化,主要有去掉没有被调用的函数、总是常数的变量以及没有使用的函数返回值。

建议由程序员自己进行这种优化工作。

使用这个选项在win98下编译可能会出现找不到编译程序的情况。

-ms0:不使用冗余循环进行优化,减小程序的大小。

一般情况下这个选项对程序大小的优化作用不明显。

-mh[n]:去掉流水线的epilog,减小程序的大小。

这个选项的作用比较明显。

但是有可能出现读取地址超出有效范围的问题,所以要在数据段的开始和结尾处增加一些pading,或者在分配内存时保证数组的前面和后面一段范围内都是有效的地址。

可选的参数n给出这种pading的长度字节数。

(三)保留编译和优化信息的选项-k:保留优化后生成汇编语言文件。

-s:汇编语言文件中加入优化信息,如果没有则加入C语言源程序作为注释。

-mw:在汇编语言文件加入软件流水线信息。

(四)有关调试和剖析的选项-g:允许符号调试,在“out”文件中包含符号信息和行号信息,可以在c语言级别进行调试和剖析。

使用联合使用-g、-mt和-o3可以保证能够进行符号调试的情况下最大限度的优化。

-mg:允许profile优化后的程序。

在“out”文件中包含符号信息和很少的行号信息。

允许在c语言的函数基本进行剖析。

如果联合使用这两个选项,-g选项可能被忽略,结果与只用-mg相同。

(五)其它类型-mln:生成大内存模式的程序。

-ml0:缺省情况下将集合变量(数组和结构)作为far型。

-ml1:缺省情况下将全部函数作为far型-ml2:等于-ml0加-ml1-ml3:缺省情况下将全部数据和函数作为far型(六)建议使用的编译方式Cl6x -gk -mt -o3 -mw -ss “filename”方式1用于程序的调试,这种方式具有比较强的优化能力,并且支持符号调试。

在编译的过程中不会发生错误。

由于生成的“out”文件中包含了符号信息和行号信息,所以比较大。

Cl6x -k -mgt -o3 -mw -ss “filename”方式2用于程序的剖析(profile),这种方式的优化能力几乎最强(绝大多数情况下与方式3相同),并且支持对程序进行profile。

文件中只包含了符号信息和很少的行号信息,所以“out”文件比较小。

Cl6x -k -mt -o3 -mw -ss “filename”方式3用于最终的发行版本程序,可以对程序进行最强的优化,并且去掉了全部的符号和行号信息,所以“out”文件比较小。

由多个文件组成的程序应该编写makefile,将编译参数放在该文件中,并在其中说明使用的编译器的版本号。

(七)连接参数-heap:指定堆的大小-stack:指定栈的大小连接的各种选项应该统一放在“cmd”文件中二、双重循环和多重循环的优化总结双重循环多重循环看起来比较复杂,但实际上多重循环优化方法比较简单,就在于一个字:“拆”,一旦完成这一步之后,多重循环就成为单层循环,优化就可以按照普通的单层循环来做了。

多重循环的特点是在优化器优化时只在最内层循环中形成一个pipeline,这样循环语句就不能充分利用C6的软件流水线,而且对于内部循环的次数较少的情况,消耗在prolog和eplog上的cycle数也是不可忽视的。

针对这种状况可以考虑将多重循环拆开形成一个单层循环,可以拆外层循环也可以拆内层循环,一般视具体情况而定。

这样就可以充分利用优化器构成的Pipeline。

如下例:void fir2(const short input[], const short coefs[], short out[]){int i, j;int sum = 0;for (i = 0; i < 40; i++){for (j = 0; j < 16; j++)sum += coefs[j] * input[i + 15 - j];out[i] = (sum >> 15);}内层循环循环次数较少,运算量也不大,资源方面只占用了一个乘法器,一个cycle只使用一次乘法器,而事实上我们可以在一个cycle内使用两个乘法器,所以还可以充分利用另外的一个乘法器。

因此考虑将内层循环拆开来执行,如下:void fir2_u(const short input[], const short coefs[], short out[]){int i, j;int sum;for (i = 0; i < 40; i++){sum = coefs[0] * input[i + 15];sum += coefs[1] * input[i + 14];sum += coefs[2] * input[i + 13];sum += coefs[3] * input[i + 12];sum += coefs[4] * input[i + 11];sum += coefs[5] * input[i + 10];sum += coefs[6] * input[i + 9];sum += coefs[7] * input[i + 8];sum += coefs[8] * input[i + 7];sum += coefs[9] * input[i + 6];sum += coefs[10] * input[i + 5];sum += coefs[11] * input[i + 4];sum += coefs[12] * input[i + 3];sum += coefs[13] * input[i + 2];sum += coefs[14] * input[i + 1];sum += coefs[15] * input[i + 0];out[i] = (sum >> 15);}这样虽然代码长度增加了,可变成了单循环,所有的运算都参加到pipeline中来,在Piped loop kernal中产生每一个cycle内都使用了两个乘法器,充分利用了DSP内部的资源,提高了运行效率。

又如下例:tot = 4;for (k = 0; k < 4; k++){max = 0;for (i = k; i < 44; i += STEP){s = 0;for (j = i; j < 44; j++)s = L_mac(s, x[j], h[j - i]);y32[i] = s;s = L_abs(s);if (L_sub(s, max) > (Word32) 0)max = s;}tot = L_add(tot, L_shr(max, 1));}在这个多层循环中一共有三层循环,而最内层的循环的运算量很小,只有一次乘累加操作,而我们知道C6中一个packet中可以做两个乘累加运算,所以为了增加内部循环的运算,减少外部循环的层数,我们可以将第一层循环的操作拆开,其负责的运算加入到内部循环中,也就是在内层循环中一次做四次的乘累加运算,这样将多次操作形成pipeline,提高了运行效率,优化后的C代码如下:tot = 4;max0=0;max1=0;max2=0;max3=0;for (i = 0; i <44; i += STEP) //STEP=4, 11 times cirs{//codefor (j=0;j<=40-i;j++){s0=(Word32)(_sadd(s0,_smpy(hh[j],xx[j+i])));s1=(Word32)(_sadd(s1,_smpy(hh[j],xx[j+i+1])));s2=(Word32)(_sadd(s2,_smpy(hh[j],xx[j+i+2])));s3=(Word32)(_sadd(s3,_smpy(hh[j],xx[j+i+3])));}}//codeCCS的优化:三、16位变为32位操作,使用intrinsic函数,用const等。

1、源代码:Word32 L_mpy_ll(Word32 L_var1, Word32 L_var2){double aReg;Word32 lvar;/* (unsigned)low1 * (unsigned)low1 */aReg = (double)(0xffff & L_var1) * (double)(0xffff & L_var2) * 2.0;/* >> 16 */aReg = (aReg / 65536);aReg = floor(aReg);/* (unsigned)low1 * (signed)high2 */aReg += (double)(0xffff & L_var1) * ((double)L_shr(L_var2,16)) * 2.0; /* (unsigned)low2 * (signed)high1 */aReg += (double)(0xffff & L_var2) * ((double)L_shr(L_var1,16)) * 2.0; /* >> 16 */aReg = (aReg / 65536);aReg = floor(aReg);/* (signed)high1 * (signed)high2 */aReg += (double)(L_shr(L_var1,16)) * (double)(L_shr(L_var2,16)) * 2.0; /* saturate result.. */lvar = L_saturate(aReg);return(lvar);}2、改编后的代码:static inline Word32 L_mpy_ll(Word32 L_var1, Word32 L_var2){Word32 aReg_hh;Word40 aReg,aReg_ll,aReg_lh,aReg_hl;aReg_ll = (Word40)_mpyu(L_var1, L_var2)>>16;aReg_lh = (Word40)_mpyluhs(L_var1, L_var2);aReg_hl = (Word40)_mpyhslu(L_var1, L_var2);aReg_hh = _smpyh(L_var1, L_var2);aReg = _lsadd(aReg_ll, _lsadd(aReg_lh, aReg_hl));aReg = _lsadd(aReg>>15, aReg_hh);return(_sat(aReg));}3、优化方法说明:C6000编译器提供的intrinsic 可快速优化C代码,intrinsic用前下划线表示同调用函数一样可以调用它,即直接内联为C6000的函数。

相关文档
最新文档