1、福建农林大学计算机与信息学院信息工程类实验报告课程名称: DSP 技术姓 名:系: 电子信息工程专 业: 电子信息工程年 级: 2010学 号:指导教师: 谢秀娟职 称: 讲师2013 年 11 月 21 日实验项目列表序号 实验项目名称 成绩 指导教师1 实验 1 汇编语言、体系结构和 CCS 谢秀娟2 实验 2 C6000 流水线和 C 运行时环境 谢秀娟3 实验 3 C6000 代码优化 谢秀娟4 实验 4 利用 BIOS 创建工程及性能分析 谢秀娟5 实验 5 利用 BIOS 调试程序 谢秀娟67891011121314151617181920福建农林大学计算机与信息学院信息工程类实验
2、报告系: 电子信息工程 专业: 电子信息工程 年级: 10 姓名: 学号: 实验课程: DSP 实验室号: 田 C513 实验设备号: 17 实验时间: 2013-10-18 指导教师签字: 成绩: C6000 实验一 汇编语言、体系结构和 CCS1实验目的和要求1熟悉 DSP 软件开发环境 CCS 的使用。2熟悉 CCS 中的 C 语言编程。3 了解 C6000DSP 的汇编语言。2主要仪器设备(实验用的软硬件环境)安装了 CCS2.0 的计算机,采用 simulator 配置文件sim6201_simulator.cfg。3操作方法与实验步骤1、配置 CCS打开桌面程序“Setup CCS
3、 2 (C6000)”,采用 simulator 配置文件sim6201_simulator.cfg,配置完成后保存。2、实验内容 1 操作步骤:(2)打开 CCS:打双击桌面程序:Setup CCS 2 (C6000),配置 CCS,选 C6xxx;配置好后,打开桌面程序:CCS 2 (C6000);(3)打开工程文件:把文件夹 tutorialsim62xxhello1 拷贝到 myproject 下;单击菜单 Project-Open,打开 hello.pjt,选择支持库 rts6200.lib(4)编译程序:菜单 Project-build 或 rebuild(5)加载程序:菜单 Fi
4、le-Load Program,选择 Debug 下的.out 文件装入目标板(6)go main:菜单 Debug-go main,执行到 main()处暂停(7)执行程序:Debug-Run4实验内容及实验数据记录1新建一个 project,把 tutorialsim62xxhello1 的文件添加进去,完成其功能。练习 CCS 的基本操作:加载程序、go main、执行程序、设置断点、单步执行、观察变量、观察存储器、测试函数执行的 CLK、混合代码显示。2打开 tutorialsim62xxvolume1 的项目文件,完成图形方式观察变量、设置探点、GEL 控制变量、FILE IO、动画
5、显示输入输出的功能。然后单步执行load.asm,观察 C 代码调用、寄存器的变化、测试函数执行时间、如何循环和返回 C 代码。3解释如何在 C6201 上实现 32bit int 乘 32bit int, 结果是 32 bit int的过程:在刚才的 hello1 中设置 3 个全局变量 int a = 0x10008; int b = 56; int c;在 main 函数中执行语句 c = a * b; build 后加载执行程序, 混合代码显示 c = a*b 对应的汇编代码,解释之。5实验程序或实验数据处理与分析1、配置 CCS2、练习 CCS 的基本操作1)打开工程2)编译工程,加
6、载程序2)编译工程,编译通过后加载.out 文件3)单步运行,调试程序4)设置断点5)观察变量6)观察存储器7)测试函数 clk 的执行2、volume1 实验结果3、编写乘法函数及其结果6质疑、建议、问题讨论1)打开工程时若程序没有自动的加载需要的库文件,则就要手动查找到需要的库文件,并添加至工程中。否则,后面的实验就会报错。2)每次运行完程序后需要重新加载程序,否则报错。福建农林大学计算机与信息学院信息工程类实验报告系: 电子信息工程 专业: 电子信息工程 年级: 10 姓名: 学号: 实验课程: DSP 实验室号: 田 C513 实验设备号: 17 实验时间: 2013-10-25 指导
7、教师签字: 成绩: C6000 实验二 C6000 流水线和 C 运行时环境1实验目的和要求1.熟悉 DSP 软件开发环境 CCS 的使用。2.熟悉 C6000 中的 C 运行时环境。2主要仪器设备(实验用的软硬件环境)安装了 CCS2.0 的计算机,采用 simulator 配置文件 sim6201_simulator.cfg。3操作方法与实验步骤1)打开 ccs6000 的 C 运行时的环境;2)双击桌面程序 Setup CCS2(6000),配置 CCS,选择 C6xxx;3)配置好后,打开桌面程序 CCS2(6000) ;4)把文件夹 tutorialsim62xxhello1 拷贝到
8、 myproject 下;5)单击菜单 project-open,打开 open.pjt,选择文件库 rts6200.lib;6)将汇编代码段加到 hello.asm,再在 hello.c 中加入汇编子函数的 C 语言程序,进行编译、加载生成.out 文件,执行产生结果。4实验内容及实验数据记录采用 simulator 配置文件 sim6201_simulator.cfg1 Hello1 中添加 1 个 C 文件 sop_c.c ,该文件是一个乘法累加的子函数sop_c (short * a, short * x, int * y, int n),然后在 main 函数中调用。不选择任何优化选
9、项。用混合代码显示,在汇编层次执行 sop_c 子函数,观察调用、执行和返回的过程。2用汇编语言实现两个数组 a(n)和 x(n)的乘法累加功能。汇编文件名为:sop_asm.asm,主函数 C 中调用格式:int sop_asm(short * a, short * x, int n)。5实验程序或实验数据处理与分析1)往 hell1 中添加 sop_c 的 c 文件2)在主函数中进行添加的部分如下3)运行结果如下4)往 hell1 中添加 sop_asm 的汇编文件5)主函数中添加的部分如下6)运行结果如下7)调试过程6质疑、建议、问题讨论本次通过实验,学会了如何在 CCS 软件中使用 C
10、 语言以及汇编语言进行简单的函数编写以及调试运行,同时也注意到了在 CCS 软件中,使用汇编和平常所使用的变化还是有些许细微的变化的,我们要密切注意这些变化减少,以尽量的减少不必要的错误。福建农林大学计算机与信息学院信息工程类实验报告系: 电子信息工程 专业: 电子信息工程 年级: 10 姓名: 学号: 实验课程: DSP 实验室号: 田 C513 实验设备号: 17 实验时间: 2013-11-01 指导教师签字: 成绩: C6000 实验三 C6000 代码优化1实验目的和要求1.熟悉 DSP 软件开发环境 CCS 的使用。2.掌握 CCS 中的 C 语言编程。3.熟悉 C6000DSP
11、的代码优化过程。2主要仪器设备(实验用的软硬件环境)安装了 CCS2.0 的计算机,采用 simulator 配置文件 sim6201_simulator.cfg。3操作方法与实验步骤1)打开 ccs6000 的 C 运行时的环境;2)双击桌面程序 Setup CCS2(6000),配置 CCS,选择 C6xxx;3)配置好后,打开桌面程序 CCS2(6000) ;4)把文件夹 tutorialsim62xxhello1 拷贝到 myproject 下;5)单击菜单 project-open,打开 open.pjt,选择文件库 rts6200.lib;6)将汇编代码段加到 hello.asm,
12、再在 hello.c 中加入汇编子函数的 C 语言程序,进行编译、加载生成.out 文件,执行产生结果。4实验内容及实验数据记录1采用 simulator 配置文件 sim6201_simulator.cfg,写手工优化的 sop_asm.asm程序:在实验二的基础上实现 16bit 数组的乘法累加的函数,并手工优化和采用软件流水优化。要求:(1)使用 LDW 和 MPY,MPYH 指令;对于 C64 可以使用扩展乘法指令。(2)画出相关图和模迭代间隔表。2 (选做)写一个汇编语言子函数 Mul32to64(unsigned int a, unsigned int b, void * p_64
13、int),实现 32bit*32bit64bit 的无符号整型数据的乘法;3 (选做)采用 simulator 配置文件 sim6701_simulator.cfg,写一个线形汇编实现的子函数,做复数数组求模,并找出模的最大值的位置和值。复数的实部和虚部为 short,求模的结果为 unsigned int。5实验程序或实验数据处理与分析1)两种 C 语言实验及其结果2)线性汇编实验3)汇编实验4)主函数中的调用5)调用结果6质疑、建议、问题讨论1)汇编函数以及线性汇编函数的编写同 C 语言的调用一样需要对变量进行初始化,否则得到的是未定义的值。2)使用 global 函数进行对全局变量的定义
14、,全局变量的定义中即定义标号,同时还必须位于标号之前,而标号的定义位置应在 cproc 前。3)注意不要进行重定义,要清楚知道哪些变量是函数传递的参数,哪些变量是在函数中进行定义使用的。4)cproc 和 endproc 是成对使用的。5)所新建的 c 或 sa 或 asm 文件都必须添加到工程中。6)要注意所编写的是汇编还是反汇编,同时要注意他们保存文件名的区别,否则编译报错。福建农林大学计算机与信息学院信息工程类实验报告系: 电子信息工程 专业: 电子信息工程 年级: 10 姓名: 学号: 实验课程: DSP 实验室号: 田 C513 实验设备号: 17 实验时间: 2013-11-08
15、指导教师签字: 成绩: 实验四 利用 BIOS 创建工程及性能分析1实验目的和要求1)通过创建基于 DSP/BIOS 的 Hello World 工程实例,熟悉 CCS 环境下DSP/BIOS 软件的创建和使用方法。2)熟悉在 CCS 环境下对代码的运行效率和性能作出评估的工具和方法。2主要仪器设备(实验用的软硬件环境)CCS2.2 环境,C64XX Device Simulator3操作方法与实验步骤第一步:打开已有工程并运行在 C:timyprojects 目录里面创建 hellobios 目录。把 C:titutorialsim64xxhello1 里的全部文件拷贝到这个新的目录下面。如
16、果 CCS 还没有启动,启动 CCS 环境,Setup 里面设置为 C64xx Device Simulator。选择 Project-Open,打开这个工程,工程的项目文件目录为:C:timyprojectshellobios,项目名称是 hello.pjt。若提示以下错误,选择 Browse,选择目录:C:tiC6000cgtoolslibrts6400.lib ,打开工程。编译,运行工程,查看结果,应该是输出 hello world 字符。第二步:评测 stdio.h 中输出函数 put()的执行时间(周期数)新建一个 Profiler,选择 Profiler-Start New Ses
17、sion,名称为 MySession,确定。出现 Session 窗口,选择 Range 栏。如下所示,出现 hello.out。用鼠标拖曳,高亮 put()函数,如下所示:按住鼠标,拖曳到 Range 窗口里面,出现:重新 Load 程序,运行,得到运行结果如下:结论:采用 put()函数输出一次的指令周期数是: 1700。采用同样方法,测试 printf()函数的指令周期数目:记录 put()函数和 printf()函数需要的指令周期数到表格,用来和下面实验的结果对比。第三步:编辑源代码在 CCS 里,关闭 hello.c 窗口。用 Windows Explorer 把 C:titutor
18、ialsim64xxhello2 目录里的 hello.c 文件拷贝到 C:timyprojectshellobios 目录。按 Yes 覆盖原来已经存在的 hello.c 文件。hello2 例中采用 DSP/BIOS 函数来替代 hello1 例中的标准 C 函数的 put()输出函数。双击 hello.c 文件,在 Project View 窗口打开源文件。注意新代码的几点问题:#include #include #include “hellocfg.h“Void main() LOG_printf(/* fall into DSP/BIOS idle loop */return;hel
19、lo.c 文件首先包含了 std.h 和 log.h 两个头文件。程序如果想使用 DSP/BIOS API 那它必须包含 std.h 文件以及程序中用到的模块的对应头文件。log.h 头文件中定义了 LOG_Obj 结构以及 LOG 模块用的 API 函数的声明。std.h 文件必须在其它的 DSP/BIOS 模块头文件之前声明。其它模块的头文件声明顺序不重要。代码接下来要包含 hellocfg.h 头文件,这个文件在创建并保存 DSP/BIOS 配置的时候创建的。下一个步骤我们就来创建这个文件。这个文件包含了配置文件夹里面的 DSP/BIOS objects 的外部声明。hellocfg.h
20、 文件也包含了配置文件里定义的 DSP/BIOS 模块的头文件。既然 std.h和 log.h 文件都会被 hellocfg.h 文件引用,那么 hello.c 文件的头两行时间上是冗余的。但是这样也不会有任何问题。调用 LOG_printf 的代码实际上是传递 LOG object 对象(&trace)和 hello world消息的地址。最后 main()函数返回,这个函数导致程序进入 DSP/BIOS 的 Idle 循环。在这个循环中,DSP/BIOS 等待线程,例如软件中断和硬件中断发生。在该例中,没有其它线程发生,所以会一直处于 IDLE 状态。第四步:创建 DSP/BIOS 的配置
21、文件选择 File-New-DSP/BIOS Config。选择一个目标模板,根据芯片选择,我们选 c64xx.cdb,然后按 OK。观察configuration 窗口,左边窗口是模块的列表,可以通过点击模块的“+”号打开下级目录,也可以按右键新建一个对象或查看一个建立好的对象的属性。点击 Instrumentation 目录左侧的 +号,显示模块的列表。邮局选择 LOGEvent Log Mannger 然后右击选择 Insert LOG。这个步骤是创建一个 LOG 对象,名称为 LOG0。右键选中 LOG0 对象,然后右击选择 Rename。把 LOG 对象改名为 trace.如果你在使
22、用软件仿真器,需要设置 RTDX 模式为 Simulator。选择 RTDXReal-Time Data Exchange Settings,右键,选择属性,打开对话框:将 RTDX Mode 设定为 Simulator 即可。如果有目标板,可以选择 JTAG。选择 File-Save。保存到当前目录(通常是 C:timyprojectshellobios)命名为hello.cdb,保存这个配置后,会生成以下 6 个文件:Hello.cdb 保存配置的内容Hellocfg.cmd 链接 command 文件Hellocfg.h 包括 DSP/BIOS 模块头文件和配置文件中用到的外部对象、变量
23、的声明Hellocfg.s62DSP/BIOS 设置的汇编语言源文件Hellocfg.h62Hellocfg.s62 引用到的汇编语言源文件Hellocfg_c.cChip Support Library(CSL)代码结构和设置第五步:添加 DSP/BIOS 文件到工程项目选择 Project-Add Files to Project,在 Files of type 栏目里选择 Configuration File(*.cdb) ,选中 hello.cdb 文件后,点 Open。注意添加后,hello.cdb 出现在Porject View 窗格下目录 DSP/BIOS Config 里。此外
24、,CCS 自动添加Hellocfg.s62 和 Hellocfg_c.c 文件到生成的目录下。输出文件名必须和.cdb 文件一致。可以通过 Project-Build Options 打开 Linker标签查看,确认 Output Filename 内容是.Debughello.out,按 OK 确定。再次选择 Project-Add Files to Project,选对 Linker Command File(*.cmd)在Files of type 下拉菜单,选择 hellocfg.cmd 文件,然后按 Open。如果看到警告,按 Yes。Hello.cmd 文件被 hellocfg.c
25、md 文件替代,hellocfg.cmd文件是保存 DSP/BIOS 时生成的。若没有警告,直接将 hello.cmd 文件从项目中删除。你可以自己创建独立的 cmd 文件,但文件中必须引用 DSP/BIOS 的生成的配置cmd 文件。如:-1 hellocfg.cmdYour Code 从项目中删除 vectors.asm 源文件。因为硬件中断可以通过 DSP/BIOS 设置,不需要单独的处理。从项目中删除 rts6400.lib 文件。这个库已经被 hellocfg.cmd 自动引用了。选择 Project-Save 保存对项目的更改。建议在编译和运行项目前,先保存修改。选择 Projec
26、t-Rebuild All。经过以上修改,项目变化为:第六步:在 CCS 的 Simulator 环境下测试工程选择 File-Load Program,选中 hello.out,确定。选择 DSP/BIOS-Message Log,出现窗口:在 Log 窗口按右键,选择属性,把输出文件指定到 hello.txt,用来保存结果,便于以后查看。选择 Debug-Go Main,然后 F10,单步运行。观察 Log 窗口的输出。在 Log 窗口,按右键选择 close,关闭窗口。重新 Load 程序,按 F4。运行程序,等待一会儿,再按结束,中止程序运行。File-Open,然后在 Debug 目
27、录中选择 hello.txt,打开查看,内容和窗口的输出是一样的,都是 hello world!第七步:评估 DSP/BIOS 输出函数 LOG_printf()的执行时间(周期数)在这个步骤中,我们利用 CCS 的 Profiling 工具来评估 LOG_printf()函数需要的指令周期数目,并且和 printf()和 put()函数对比。选择 File-Reload Program。选择 Profiler-Start New Session,弹出 Proliler session 窗口,接受默认的名称MySession,确认。如果出现错误,可以禁用 RTDX 功能。在 MySession
28、 的窗口中,选择 Ranges 选项。双击 hello.c 文件,在 Project View 中打开源文件。高亮调用 LOG_printf 函数的语句。用鼠标拖曳到 MySession Profile 窗口中。MySession Profile 窗口得到如下设置。时间的行号(line 28)可能会有所不同。按下“Run ”按钮,或按 F5 运行程序。在 MySession Profile 窗口,观察 Incl. Total column.(由于这个函数只执行一次,所以 Total、 Maximum 和 Minimum 是相同的)The Incl.Total 的含义:这个参数是用来表示从汇编指
29、令执行到这一行的开始到执行结束所需要的指令周期数目。比较 LOG_printf()函数和 puts()函数的指令周期数目。结论:经过对比发现,LOG_printf()函数比 puts()函数的效率高很多。实际的指令周期数目和 DSP 芯片的型号有关。调用 LOG_printf()函数效率高的原因是字符串的格式化工作在主机(PC)完成,而不是目标板(DSP)上完成,所以说,LOG_printf()函数效率非常高。4实验内容及实验数据记录1、打开已有的 Hello World 工程,评估 stdio.h 的运行效率,即 put()函数的性能;2、在 Hello World 基础上,创建一个基于 D
30、SP/BIOS 的 Hello World 工程;3、评估 DSP/BIOS 的输出函数性能,即 LOG_printf()函数运行的指令周期。5实验程序或实验数据处理与分析完成实验内容,运行成功,得到输出结果如以下表格:运行一次所需要的指令周期数(单位:个)put()函数 1700LOG_prinrt()函数 36printf()函数 2255分析:经过对比发现,LOG_printf ()函数比 puts()函数效率高很多。实际的指令周期数目和 DSP 芯片型号有关。由于调用 LOG_printf 函数式字符串的格式化工作在主机 PC 完成,而不是在目标板 DSP 上完成的,所以调用 LOGprintf 函数效率高很多。实验相关数据:1)error2)创建 DSP/BIOS 的配置文件3)测试工程