北京理工大学2020年5月《DSP原理及应用》答案_第1页
北京理工大学2020年5月《DSP原理及应用》答案_第2页
北京理工大学2020年5月《DSP原理及应用》答案_第3页
北京理工大学2020年5月《DSP原理及应用》答案_第4页
北京理工大学2020年5月《DSP原理及应用》答案_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、(431)北京理工大学远程教育学院 2019-2020 年第二学期DSP 原理及应用期末大作业 教学站学号姓名成绩C6000 实验 1:汇编语言、体系结构和 CCSu 采用 simulator 配置文件 sim6201_simulator.cfgu 1. 新建一个 project,把 tutorialsim62xxhello1 的文件添加进去,完成其功能。练习 CCS 的基本操作:加载程序、go main、执行程序、设置断点、单步执行、观察变量、观察存储器、测试函数执行的 CLK、混合代码显示。u 2. 打开 tutorialsim62xxvolume1 的项目文件,完成图形方式观察变量、设置

2、探点、GEL 控制变量、FILE IO、动画显示输入输出的功能。然后单步执行 load.asm:如何被 C 代码代码调用、观察寄存器的变化、测试函数执行时间、如何循环和返回 C 代码。u 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 对应的汇编代码,解释之。u 4. Hello1 中添加 1

3、个 C 文件 sop_c.c ,其中有一个矢量乘的子函数 sop(short * a, short * x, int * y, int n),然后在 main 函数中调用。不选择任何优化选项。用混合代码显示,在汇编层次执行 sop 子函数,观察调用、执行和返回的过程。1新建一个 project,把 tutorialsim62xxhello1 的文件添加进去,完成其功能。练习 CCS 的基本操作:加载程序、go main、执行程序、设置断点、单步执行、观察变量、观察存储器、测试函数执行的 CLK、混合代码显示。2打开 tutorialsim62xxvolume1 的项目文件,完成图形方式观察变量

4、、设置探点、GEL 控制变量、FILE IO、动画显示输入输出的功能。然后单步执行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 对应的汇编代码,解释之。1.配置 CCS2.打开 CCS(1)打开工程文件:

5、把文件夹 tutorialsim62xxhello1 拷贝到 myproject 下;单击菜单 Project-Open,打开 hello.pjt,选择支持库 rts6200.lib(2)编译程序:菜单 Project-build 或 rebuild(3)加载程序:菜单 File-LoadProgram,选择 Debug 下的.out 文件装入目标板(4)go main:菜单 Debug-go main,执行到 main()处暂停(5)执行程序:Debug-Run(6)设置断点:Toggle breakpoint(7)单步执行:Step(两种:C 和汇编)(8)观察变量:菜单 Edit-Var

6、iable(9)观察存储器:菜单 Edit-Memory(10)测试函数执行的 CLK:Profiler-View Clock(11)混合代码显示:View-Mixed Source/ASM3. 自行完成实验内容 3 的编程及编译、目标程序的加载和执行,观察 c = a*b对应的汇编代码,并解释该汇编代码。C6000 实验 2:C6000 流水线和 C 运行时环境u 采用 simulator 配置文件 sim6201_simulator.cfgu 1.用汇编语言实现两个数组的乘法累加功能:sop_asm.asm 中实现函数 int sop_asm(short * a, short * x, i

7、nt n);然后,手工优化汇编代码;u 2. C 调用汇编函数,汇编函数调用 c 函数:在 main 函数中调用汇编实现的函数 addarr3, 在 addarr3 中调用 C 子函数 addarr2. addarr3(int * arr1, int * arr2, int * arr3, int * arr4, int n) 是汇编函数,其功能为 3 个数组的对应位置相加,结果放在 arr4n中;汇编函数 addarr3 中调用 C 的子函数,它把 arr1 和 arr2 相加放到 arr3n中; addarr2(int * arr1, int * arr2, int * arr3, int

8、 n)u 实验内容u 1)汇编子函数:u.global _sop_asm1u.textu_sop_asm1:ZERO .D1A0 ;A0 存放结果uMV .S2B6,B0 ;B0=nu LOOP:LDH.D1T1*A4+,A5;A5=auLDH.D2T2*B4+,B6;A6=xuNOP4uMPY.M1XA5,B6,A2uNOPuADD .D1A0,A2,A0uSUB.L2B0,1,B0uB0B.S2LOOPunop 5uMV.L1A0,A4u.endu 2)实验处理:uu u C6000 实验 3:DSP/BIOSu 采用 simulator 配置文件 sim6201_simulator.cf

9、g1. 在 volume2 的基础上添加一个中断 4,并写中断 4 的服务函数,每发生一次中断把计数器加 1。simulator 中,利用 pin connect 仿真中断;2.在实验 1 的基础上添加一个任务 TSK1,优先级为 3,其服务函数采用 for()的结构,该任务每 3ms 执行一次。3. 在实验 2 的基础上添加一个 idle 线程,观察 idle 线程的函数每 ms 执行多少次;4.在实验 2 的基础上添加一个任务 TSK2,优先级为 4,其服务函数采用 for()的结构,该任务每 2ms 执行一次。在第 6ms、12ms、18ms.等时刻时,分析 TSK1 和 TSK2 的任

10、务切换过程。1)打开已有工程并运行对 hello.pjt 编译并运行:2)评测 stdio.h 中输出函数 put()的执行时间MySession 窗口将 put()函数拉人 ranges 中:重新 Load 程序,运行,得到运行结果如下:结论:采用 put()函数输出一次的指令周期数是:1700。采用以上方法,测试 printf()函数的指令周期:将 put()语句改成 printf()语句,然后拉人 ranges 中重新 Load,得到结果如下:结论:采用 printf()函数输出一次的指令周期数是:2530。3)编辑源代码4)创建 DSP/BIOS 的配置文件选择目标版:c64xx.cd

11、b创建一个 LOG 对象,名称为 LOG0,右键选中 LOG0 对象,然后右击选择Rename。把 LOG 对象改名为 trace.选择 RTDXReal-Time Data Exchange Settings,右键,选择属性,打开对话框:设置 RTDX 模式为 Simulator。选择 File-Save。保存到当前目录(通常是C:timyprojectshellobios)命名为 hello.cdb,保存这个配置后,会生成以下 6 个文件:5)添加 DSP/BIOS 文件到工程项目(1)添加 hello.cdb(2)输出文件名必须和.cdb 文件一致:确认 OutputFilename 内

12、容是.Debughello.out,按 OK 确定。(3)添加 hellocfg.cmd 文件:并移除 hello.cmd 文件、vectors.asm 源文件、rts6400.lib 文件(5)Rebuild All6)在 CCS 的 simulator 环境下测试工程(1) 选择 DSP/BIOS-Message Log,出现窗口:在 Log 窗口按右键,选择属性,把输出文件指定到 hello.txt,用来保存结果:(2)选择 Debug-Go Main,然后 F10,单步运行。观察 Log 窗口的输出:(3)File-Open,然后在 Debug 目录中选择 hello.txt,打开查看

13、,内容和窗口的输出是一样的,都是 hello world!7)评估 DSP/BIOS 输出函数 LOG_printf()的执行时间(1)选择 Profiler-StartNewSession,弹出 Proliler session 窗口,接受默认的名称 MySession,确认。如果出现错误,可以禁用 RTDX 功能。(2)将 LOG_printf 函数的语句拖曳到 MySession Profile 窗口中:并运行程序结论:采用 LOG_printf ()函数输出一次的指令周期数是:36。结论:经过对比发现,LOG_printf()函数比 puts()函数的效率高很多。实际的指令周期数目和

14、DSP 芯片的型号有关。调用 LOG_printf()函数效率高的原因是字符串的格式化工作在主机(PC)完成,而不是目标板(DSP)上完成,所以说,LOG_printf()函数效率非常高。C6000 实验 4:C6000 代码优化1. 采用 simulator 配置文件 sim6201_simulator.cfg写手工优化的.asm 程序:在 volume1 的 load.asm 基础上实现 16bit 数组的乘法累加的函数,并手工优化和采用软件流水优化;要求:(1)使用 LDW 和 MPY,MPYH 指令;对于 C64 可以使用扩展乘法指令。(2)画出相关图和模迭代间隔表2. 采用 simu

15、lator 配置文件 sim6701_simulator.cfg .写一个线形汇编实现的子函数,做复数数组求模,并找出模的最大值的位置和值。复数的 实部和虚部为 short,求模的结果为 unsigned int;提示:使用 INTSP 指令把整数转化为浮点数后再开方;1)打开 ccs 运行环境;2)将 C:/ti/tutorial/sim62xx/volume1 复制到 C:/ti/myprojects 中; 3)启动 CCS 环境,选择 Project 中 Open,打开这个工程,工程项目文件目录为 :C:/ti/myprojects/volume1, 项 目 名 称 为 volume.p

16、jt; 4) 若 提 示 错 误 , 选 择 Browse, 选 择 目 录 : C:/ti/C6000/cgtools/lib/rts6200.lib打开工程;5)打开 volume.c 以及 volume.asm 文件,进行编译、加载、执行; 6)将下面的程序段覆盖原来的 volume1.c/*主函数:volume1.c*/*/#include #include volume.h/* Global declarations */ #define n 10short an,xn;int t;/* = main = */ void main()int i; for(i=0;in;i+)ai=2

17、;for(i=0;in;i+)xi=i+;t=load(a,x,n);printf(t=%dn,t);;7)将下面的优化代码段覆盖原先的 volume.asm优化:load.asm.global _load.text_load:ZERO .D1A0;A0 存放结果| SUB .S2A6,7,B0P0:LDH.D1T1*A4+,A5|LDH.D2T2*B4+,B6P1:LDH.D1T1*A4+,A5|LDH.D2T2*B4+,B6|B0SUB.L2B0,1,B0P2:LDH.D1T1*A4+,A5| LDH.D2T2*B4+,B6|B0SUB.L2B0,1,B0|B0B.S2 P7P3:LDH.

18、D1T1| LDH.D2T2|B0SUB.L2|B0B.S2 P7*A4+,A5*B4+,B6 B0,1,B0P4:LDH.D1T1| LDH.D2T2|B0SUB.L2|B0B.S2 P7*A4+,A5*B4+,B6 B0,1,B0P5:LDH.D1T1| LDH.D2T2|B0SUB.L2|B0B.S2 P7| MPY.M1X*A4+,A5*B4+,B6 B0,1,B0A5,B6,A2P6:LDH.D1T1| LDH.D2T2|B0 SUB.L2|B0B.S2 P7| MPY.M1X*A4+,A5*B4+,B6 B0,1,B0A5,B6,A2P7:LDH.D1T1*A4+,A5| LDH.D2T2*B4+,B6|B0SUB.L2B0,1,B0|B0B.S2 P7| MPY.M1XA5,B6,A2| ADD .L1A0,A2,A0MPY.M1XA5,B6,A2| ADD .L1A0,A2,A0MPY.M1XA5,B6,A2| ADD .L1A0,A2,A0MPY.M1XA5,B6,A2| ADD .L1A0,A2,A0MPY.M1XA5,B6,A2| ADD .L1A0,A2,A0MPY.M1XA5,B6,A2| A

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论