DSP系统设计与实现实验一报告.docx
《DSP系统设计与实现实验一报告.docx》由会员分享,可在线阅读,更多相关《DSP系统设计与实现实验一报告.docx(15页珍藏版)》请在冰点文库上搜索。
![DSP系统设计与实现实验一报告.docx](https://file1.bingdoc.com/fileroot1/2023-7/12/71785d35-1a43-47d3-a617-f2890a1a9d9e/71785d35-1a43-47d3-a617-f2890a1a9d9e1.gif)
DSP系统设计与实现实验一报告
实验一DSP编程与VisualDSP++入门
一.实验目的:
熟悉VisualDSP++集成开发环境,掌握工程文件的创建、构造和调试的方法和技巧。
二.实验内容:
针对ADSP-21161SHARCDSP,利用几个用C、C++和汇编语言写成的简单例子来描述VisualDSP++编程环境和调试器(debugger)的主要特征和功能。
对于运行在其它类型SHARC处理器的程序只需对其链接描述文件(.LDF)做一些修改,就可用于其它芯片或者ADSP-21161的硬件仿真。
在目录…\21k\ldf下有每种处理器类型的链接描述文件,可供参考。
实验一包括四个基本练习:
练习一:
启动VisualDSP++,建立一个用C源代码的工程(Project),同时用调试器来评估用C语言所编写代码的性能;
练习二:
创立一个新的工程,修改源码来调用一个汇编(asm)程序,重新编译工程,用调试器来评估用汇编语言所写程序的性能;
练习三:
利用调试器的绘图(plot)功能来图形显示一个卷积算法中的有关数据的波形;
练习四:
利用调试器的性能统计功能(Statisticalprofile统计剖析)来检查练习三中卷积算法的效率。
利用所收集到的性能统计数据就能看出算法中最耗时的地方。
三.实验步骤
练习一:
1)进入VisualDSP++集成开发环境,并打开一个工程(Project)进入VisualDSP++,显示VisualDSP++的集成开发和调试环境窗口(Integrated
DevelopmentandDebuggerEnvironment,简称IDDE)。
选择菜单File中Open打开文件…DSP_exp\unit_1\DotProductC\DotProductC.dpj。
VisualDSP++环境将装载dotprodc工程,并列出相应的源文件。
在输出窗口(OutputWindow)中显示简要信息。
Dotprodc工程中有3个文件,定义数组和计算数组点积和的两个C语言源文件dotprod_main.c(主程序)、dotprod.c(子程序)以及一个描述程序和数据存储位置的链接描述文件dotprodc.ldf。
2)编译dotprodc工程
在菜单Project中选择BuildProject来对工程进行编译。
此时,输出窗口显示程序编译时的各种状态信息(包括出错和编译进程信息)。
当编译检测到错误时,将在输出窗口出现相应的出错信息,用鼠标双击它,编译器将自行打开源文件。
这时可对源文件编辑、修改错误,再次进行编译。
当编译不再有错时,输出窗口将显示“Buildcompletedsuccessfully”。
在本例子中,编译器会检测到一个未定义的错误,显示为:
“.\dotprod_main.c”,line115:
error#20:
identifier“itn”isundefineditni;在输出窗口中对该行文字用鼠标双击,环境会自动打开dotprod_main.c文件,并将光标定位在出错行。
你可以看见单词“int”被错写成“itn”。
将该错误改正后,保存并重新编译。
如果再没有错误出现,这时工程已被成功编译,就可以用VisualDSP++的debugger来调试程序。
3)运行VsualDSP++调试器
在编译完成后,环境将自动进入调试状态,对于初次进入debugger,将显示对象选择对话框,在其中指定对象和处理器信息。
如下图1所示:
图1对象和处理器信息
若在调试过程中需定义不同的对象和处理器类型,选取菜单Sessions中NewSession项来重新定义。
NewSession对话框如下图2所示:
图2NewSession对话框
用VisualDSP++调试时,调试器会自动调入工程的可执行文件dotpordc.dxe。
在默认情况下,调试器会打开三个窗口:
输出窗口(下)、反汇编窗口(右)、包括工程主文件dotprodc_main.c的源代码窗口(左)。
如图3所示,左窗的每一条C语句都对应右窗中的多条汇编指令:
图3调试器的输出窗口、反汇编窗口和源代码窗口
在图3中,箭头所指为当前执行指令,红圆圈代表设定的断点位置。
当调试器加载C程序时,会自动设置两个断点,分别在代码执行的开头和结尾。
浏览程序中的断点可选择Settings下的BreakPoints···,可在此对话框中增加或删除断点。
另外也可通过在每条代码行的开头处双击鼠标或快捷键来设置或取消断点。
4)运行dotprod.c
从Debug菜单中选择Run项,程序将被执行,其输出结果在Outputwindow
中显示。
运行程序得到的结果如下图:
图4dotprod.c程序输出结果
5)评估函数a_doc_c的性能(profile)
VisualDSP++的剖析工具用于分析程序的运行时间特性,通过线性/统计剖析,可以分析出每段程序的耗时量和在整个程序中运行所占的比例,为用户分析程序的性能、优化程序提供帮助。
VisualDSP++的剖析工具有两种:
线性剖析(LinearProfiling)和统计剖析(StatiscalProfiling)。
线性剖析工具在VisualDSP++的模拟器环境下使用,,每执行一条指令,剖析工具记录一次程序执行的情况;而统计剖析工具则在VisualDSP++中通过JTAG与用户的目标系统连接的硬件环境中使用,指令运行情况的统计可通过对程序计数器进行取样来获得。
通过下述步骤来设置Profile功能并显示其结果:
(1)打开剖析窗口
选Tools\LinearProfile\NewProfiling命令。
剖析窗口中不会包含有任何数据和分析结构。
在新建剖析窗口中的空白处单击鼠标右键,选择【Properties···】项,Visual
DSP++将弹出剖析分析窗口。
在该窗口中,可以对全部程序进行分析,也可以对部分C/C++子函数进行分析,还可以指定程序地址段进行分析。
在剖析设置窗口中选择“C/C++Function”。
单击【Add】,将需要进行分析的函数添加到分析窗口中,如图5所示。
(2)运行程序,直至程序执行完毕。
在剖析窗口中将显示出对函数剖析的结果。
剖析结果窗口由两部分构成:
左边窗口为剖析的函数,右边窗口为具体指令耗时数或占剖析时间的百分比,如图6所示。
图5线性剖析参数设置页面
练习二:
1)创建一个新的工程
从Project菜单中选取New项,在弹出的工程保存对话框中,将工程名定义
为DotProductASM.dpj,并保存。
接着在弹出的工程选项对话框中定义各项参数值,这些参数都是针对ADSP-21161处理器而设置的,VisualDSP++的Project选项卡如图6所示:
图6VisualDSP++的Project选项卡
在对话框中打开Compile选项卡,选中“Enableoptimization”和“Generatedebuginformation”两项,系统将自动生成对ADSP-21161的优化代码,如图7所示:
2)向DotProductASM工程中添加文件
选取菜单Project\AddtoProject\file(s)···项,按住Ctrl键来同时选中
dotprod_main.c,dotprod.c,dotprod_func.asm和dotprodasm.ldf,点击“Add”将这几个文件添加到工程中。
图7VisualDSP++的Compile选项卡
3)修改工程源文件
在此步骤中,我们将修改dotprod_main.c文件,让其调用一个汇编子程序
a_dot_c_asm来取代a_doc。
打开dotprod_main.c文件,在源代码中找到下列响应的四条语句:
externdoublea_dot_c(doublepm*,double*);
/*externdoublea_dot_c_asm(doublepm*,double*);*/
···
result[1]=a_dot_c(a,c);
/*result[1]=a_dot_c_asm(a,c);*/
将这四条语句修改为
/*externdoublea_dot_c(doublepm*,double*);*/
externdoublea_dot_c_asm(doublepm*,double*);
···
/*result[1]=a_dot_c(a,c);*/
result[1]=a_dot_c_asm(a,c);
这样主程序将调用a_dot_c_asm汇编程序来取代练习一中的a_dot_c子程序。
4)编译和运行dot_product
先选取菜单Project\BuildProject项来编译工程;
再选取Debug\Run项来运行程序。
在输出窗口中就会得到运行结果。
如图8所示:
图8dot_productASM输出结果
5)评估a_dot_c_asm的效率
如图练习一那样设置Profile参数并显示其结果:
(1)选Tools\LinearProfile\NewProfiling命令;
(2)在新建窗口中的空白处单击鼠标右键,选择[Properties···]项,VisualDSP++将弹出剖析分析窗口。
在剖析窗设置窗口中选择“C/C++Function”。
单击[Add]按钮,将需要进行分析的函数添加到分析窗口中。
运行dot_product程序,显示Profile结果窗口如图9所示:
图9a_dot_c_asmProfile结果窗口
练习三:
1)将算法程序调入Debugger环境
关闭所有已经打开的工程和文件,选择菜单File\LoadProgram···项或点击图标。
在出现的对话框中选择文件…DSP_exp\nint_1\convolution\debug\convolution.dxe。
并在随后的源文件对话框中选择文件…DSP_exp\nint_1\convolution\convolutio.cpp。
可以在C代码源文件中看到四个全局数组:
Table、Input、Output和Impulse。
以及四个调用数组的函数:
InitializeSineTable(),GenerateInputPulse(),GenerateImpulseCoeffS()和CaculateOutputPulse()。
2)打开绘图窗口并设定参数
选择菜单View\DebugWindows\Plot\New···项,将出现Plot参数设置窗口。
在PlotType项中选择LinePlot,在PlotTitle中输入Convolution。
Plot设置对话框如图10所示:
图10Plot设置对话框
各行参数在设置完后,点击“Add”加入,最后点击“OK”。
此时屏幕将出现Plot设置对话框如图11所示的绘图窗口:
图11程序运行之前的Plot窗口
3)运行Convolution程序并在图形窗口中观察数据
按F5运行程序,当程序Halt(SHIFT-F5)后,Plot窗口中将出现数据曲线。
图中的三条曲线分别代表Table、Input和Output三个数组的值,程序运行后的Plot窗口如图12所示:
图12程序运行后的Plot窗口
在Plot窗口中可用鼠标左键选取图形的一部分,图形会自动对所选区域放大,便于数据的观察。
若要精确地知道某个数据在某点的值,可点击鼠标的右键,在弹出的菜单中选取“DateCurse”项,图形上将出现“十”字大光标,可点击曲线上的任一点,在窗口左下角会出现该点的数值和曲线名。
练习四:
打开练习三的程序并进行代码分析;
四.实验结果及数据分析
练习一:
运行程序得到的结果如下图13:
图13dotprod.c程序输出结果
未进行优化前的代码性能分析结果如下图14:
图14未执行优化前的代码效率分析
使用程序优化器之后的代码性能分析结果如下图15:
图15优化后的代码执行效率分析
从上图可以看出,优化使子函数的运行时间减少,提高了执行效率。
练习二:
运行结果如下图16:
图16采用混合编码后的代码执行效率分析
从上面的代码效率分析图中可以看出,main函数运行时间占程序总运行时间的13.08%;a_dot_b运行时间占程序总运行时间的49.38%;a_dot_d运行时间占程序总运行时间的32.81%;而a_dot_c_asm运行时间只占程序总运行时间的4.74%。
和练习一相比,除a_dot_c_asm外,其余的三个函数是完全相同的,而a_dot_c_asm的运行时间和a_dot_c相比,则有显著的下降。
说明汇编程序和C程序相比有较高的执行效率和较快的执行时间。
汇编代码的执行效率高于C代码的执行效率,而采用汇编语言的C语言的混合代码的执行效率是最高的。
练习三:
使用plot功能得到的绘图结果入下图17:
图17绘图结果(包含Table,Input,Output)
练习四:
由于使用的Session为仿真器,所以软件中的Tools菜单的Statistical功能无法使用,所以只能通过linearprofile功能进行了分析,结果如下图18所示:
图18对convolution程序的代码执行效率的linearprofile分析
从上图可以看出,CalculateOutputPulse子函数运行占用了绝大多数的时间,可以通过采用汇编语言的方式进行程序的优化,提高程序的执行效率。
五.实验心得
通过实验熟悉了VisualDSP++的操作环境和一些基本功能的实现方法,比如工程文件的创建和调试,绘图功能和程序性能分析功能。
掌握了用C、C++和汇编写成的程序在VisualDSP++编程环境中的调试和调用。
另外,了解了在程序中合适地使用汇编语言可以提高代码的执行效率。