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优化心得

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之前,我首先对其基本概念进行了了解。
DSP,即数字信号处理,是一种通过对数字信号进行一系列算法处理来实现信号的转换、压缩、增强等目的的技术。
它在音频处理、图像处理、通信系统等领域起着重要的作用。
二、学习DSP的基础知识为了更好地掌握DSP技术,我系统地学习了相关的基础知识。
首先,我学习了数字信号的采样和量化原理,了解了数字信号与模拟信号的转换过程。
接着,我学习了常用的数字滤波器设计方法,包括FIR滤波器和IIR滤波器。
同时,我还学习了离散傅里叶变换(DFT)和快速傅里叶变换(FFT)等频域分析方法。
通过这些基础知识的学习,我对DSP的核心技术有了较为清晰的认识。
三、利用MATLAB进行DSP仿真实验为了更好地理解和应用DSP技术,我利用MATLAB进行了一系列的仿真实验。
我首先学习了MATLAB的基本语法和函数的使用方法,然后通过编写代码实现了常见的DSP算法。
例如,我通过MATLAB实现了数字滤波器的设计和应用,包括低通滤波器、高通滤波器和带通滤波器等。
此外,我还利用MATLAB进行了音频信号的压缩和解压缩实验,通过对信号的编码和解码,实现了对声音质量的有效控制。
四、应用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芯片的概念数字信号处理(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期末总结

dsp期末总结这学期的DSP课程即将结束,通过这段时间的学习和实践,我在DSP领域取得了一定的进步和收获。
在这篇总结中,我将对我所学的内容进行回顾和总结。
首先,我通过课堂学习了DSP的基本理论知识。
这包括了信号的采样、量化、离散傅里叶变换、滤波器等基本概念和算法。
我深入理解了这些概念的原理和应用,对于数字信号的处理有了更加全面和系统的了解。
在掌握了这些理论知识的基础上,我能够通过编写代码实现基本的信号处理功能,比如对信号进行滤波、频谱分析等。
其次,我在实验中运用所学的理论知识进行了实践。
这个学期我们做了几个实验项目,包括语音信号的降噪、图像的边缘检测等。
通过实验,我更加深入地理解了DSP算法的实现和应用。
在实验过程中,我遇到了很多问题和困难,但通过不断地调试和尝试,最终找到了解决办法。
这个过程让我更加熟悉了DSP的实践操作,养成了良好的问题解决能力和动手能力。
另外,我还参与了DSP相关的项目实践。
我和同学一起合作完成了一次数字摄像头的图像处理项目。
我们使用了DSP芯片来实现图像的采集和处理,包括图像的灰度化、边缘检测、图像增强等。
通过这个项目,我学到了很多实际的技术和经验,收获良多。
项目中需要我们分工合作,进行任务的分配和安排。
通过这个过程,我不仅锻炼了自己的团队协作能力,还提高了自己的时间管理和组织能力。
在这个学期的学习过程中,我除了学到了专业知识和技能,还培养了一些综合能力。
首先是问题解决能力。
在课程和项目中,我经常面对各种问题和困难,但通过不断的思考和努力,最终都找到了解决办法。
这让我在面对问题时更加冷静和理性,能够迅速找到正确的解决思路。
其次是学习能力。
在这个学期中,我接触了很多新的知识和技术,而且有些是我以前从未接触过的领域。
但我通过主动学习和研究,迅速掌握了这些知识和技能。
这让我意识到,只要有足够的学习意愿和努力,我可以学习任何东西。
最后是团队合作能力。
在项目中,我通过和同学的合作和协作,完成了很多任务和工作。
DSP 优化心得解析

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语言源程序作为注释。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C6XX优化经验总结一、c6x的编译的常用选项(一)c6x的编译程序为“”使用的方法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) */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的函数。
例如,在上例的源代码中没有使用intrinsics,每一行C代码需多个指令周期,在改编后的代码中,每一行代码仅需一个指令周期。
例如,“aReg_ll = (Word40)_mpyu(L_var1, L_var2)>>16”中“_mpyu”就是一个intrinsics函数,它表示两个无符号数的高16位相乘,结果返回。
C6000支持的所有intrinsics指令及其功能参见《TMS320C6000系列DSP 的原理与应用》一书的第265、266页,该书还提供了另外的例子。
这些内联函数定义在CCS所在的C6000/CGTOOLS/Include 目录下的文件中。
下面这个例子是C6000的“Programmer's Guide”上提取的使用intrinsics优化C代码的例子。
源代码:int dotprod(const short *a, const short *b, unsigned int N){int i, sum = 0;for (i = 0; i < N; i++)sum += a[i] * b[i];return sum;}改编后代码:int dotprod(const int *a, const int *b, unsigned int N){int i, sum1 = 0, sum2 = 0;for (i = 0; i < (N >> 1); i++){sum1 += _mpy (a[i], b[i]);sum2 += _mpyh(a[i], b[i]);}return sum1 + sum2;}技巧:在C语言的调试全部通过以后,可以尝试将尽可能多的语句使用intrinsics函数加以改编,尤其在循环体内,这种改编可以大幅度减少执行时间。