北理工19年12月《DSP原理及应用》作业考核试题【标准答案】

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2019-12-07 22:29

(431) 北京理工大学远程教育学院2018-2019年第二学期 《DSP原理及应用》期末大作业 教学站 学号 姓名 成绩 C6000实验1:汇编语言、体系结构和CCS  采用simulator配置文件sim6201_simulator.cfg 
(431)  北京理工大学远程教育学院2018-2019年第二学期
《DSP原理及应用》期末大作业

教学站         学号             姓名              成绩     
C6000实验1:汇编语言、体系结构和CCS
 采用simulator配置文件sim6201_simulator.cfg
 1. 新建一个project,把tutorial\sim62xx\hello1的文件添加进去,完成其功能。练习CCS的基本操作:加载程序、go main、执行程序、设置断点、单步执行、观察变量、观察存储器、测试函数执行的CLK、混合代码显示。
 2. 打开tutorial\sim62xx\volume1的项目文件,完成图形方式观察变量、设置探点、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对应的汇编代码,解释之。
 4. Hello1中添加1个C文件sop_c.c ,其中有一个矢量乘的子函数sop(short * a, short * x, int * y, int n),然后在main函数中调用。不选择任何优化选项。用混合代码显示,在汇编层次执行sop子函数,观察调用、执行和返回的过程。

C6000实验2:C6000流水线和C运行时环境
 采用simulator配置文件sim6201_simulator.cfg
 1. 用汇编语言实现两个数组的乘法累加功能: sop_asm.asm中实现函数int sop_asm(short * a, short * x, int n);然后,手工优化汇编代码;
 2. C调用汇编函数,汇编函数调用c函数:
在main函数中调用汇编实现的函数addarr3, 在addarr3中调用C子函数addarr2.
addarr3(int * arr1, int * arr2, int * arr3, int * arr4, int n) 是汇编函数,其功能为3个数组的对应位置相加,结果放在arr4[n]中;
汇编函数addarr3中调用C的子函数,它把arr1和arr2相加放到arr3[n]中;
addarr2(int * arr1, int * arr2, int * arr3, int n)

C6000实验3:DSP/BIOS
 采用simulator配置文件sim6201_simulator.cfg
1. 在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的任务切换过程。

C6000实验4:C6000代码优化
1. 采用simulator配置文件sim6201_simulator.cfg
   写手工优化的.asm程序:在volume1的load.asm基础上实现16bit数组的乘法累加的函数,并手工优化和采用软件流水优化;要求:
(1)使用LDW和MPY,MPYH指令;对于C64可以使用扩展乘法指令。
(2)画出相关图和模迭代间隔表
2. 采用simulator配置文件sim6701_simulator.cfg .
写一个线形汇编实现的子函数,做复数数组求模,并找出模的最大值的位置和值。复数的实部和虚部为short,求模的结果为unsigned int;
提示:使用INTSP指令把整数转化为浮点数后再开方;
实验1 汇编语言、体系结构和CCS
1.实验目的和要求
1.熟悉DSP软件开发环境CCS的使用。
2.熟悉CCS中的C语言编程。
3.了解C6000DSP的汇编语言。
2.主要仪器设备(实验用的软硬件环境)
   安装了CCS2.0的计算机,采用simulator配置文件sim6201_simulator.cfg
3.操作方法与实验步骤
   1、配置CCS
打开桌面程序“Setup CCS 2 ('C6000)”,采用simulator配置文件sim6201_simulator.cfg,配置完成后保存。
2、实验内容1操作步骤:
(2)打开CCS:
①打双击桌面程序:Setup CCS 2 ('C6000),配置CCS,选C6xxx;
②配置好后,打开桌面程序:CCS 2 ('C6000);
(3)打开工程文件:
①把文件夹tutorial\sim62xx\hello1拷贝到myproject下;
②单击菜单Project->Open,打开hello.pjt,选择支持库rts6200.lib
(4)编译程序:菜单Project->build或rebuild
(5)加载程序:菜单File->Load Program,选择Debug下的.out文件装入目标板
(6)go main:菜单Debug->go main,执行到main()处暂停
(7)执行程序:Debug->Run
(8)设置断点:Toggle breakpoint
(9)单步执行:Step(两种:C和汇编)
(10)观察变量:菜单Edit->Variable
(11)观察存储器:菜单Edit->Memory
(12)测试函数执行的CLK:Profiler->View Clock
(13)混合代码显示:View->Mixed Source/ASM
3、自行完成实验内容2的操作。
4、自行完成实验内容3的编程及编译、目标程序的加载和执行,观察c = a*b对应的汇编代码,并解释该汇编代码。
4.实验内容及实验数据记录
  1.新建一个project,把tutorial\sim62xx\hello1的文件添加进去,完成其功能。练习CCS的基本操作:加载程序、go main、执行程序、设置断点、单步执行、观察变量、观察存储器、测试函数执行的CLK、混合代码显示。
2.打开tutorial\sim62xx\volume1的项目文件,完成图形方式观察变量、设置探点、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对应的汇编代码,解释之。
4. Hello1中添加1个C文件sop_c.c ,其中有一个矢量乘的子函数sop(short * a, short * x, int * y, int n),然后在main函数中调用。不选择任何优化选项。用混合代码显示,在汇编层次执行sop子函数,观察调用、执行和返回的过程。
5.实验程序或实验数据处理与分析
1.配置CCS

2.打开CCS

(1)打开工程文件:
①把文件夹tutorial\sim62xx\hello1拷贝到myproject下;

②单击菜单Project->Open,打开hello.pjt,选择支持库rts6200.lib


(2)编译程序:菜单Project->build或rebuild

(3)加载程序:菜单File->Load Program,选择Debug下的.out文件装入目标板

(4)go main:菜单Debug->go main,执行到main()处暂停

(5)执行程序:Debug->Run

(6)设置断点:Toggle breakpoint

(7)单步执行:Step(两种:C和汇编)



(8)观察变量:菜单Edit->Variable

(9)观察存储器:菜单Edit->Memory

(10)测试函数执行的CLK:Profiler->View Clock

(11)混合代码显示:View->Mixed Source/ASM

3. 自行完成实验内容3的编程及编译、目标程序的加载和执行,观察c = a*b对应的汇编代码,并解释该汇编代码。


6.质疑、建议、问题讨论
   通过此次实验,使我熟悉了DSP软件开发环境CCS的使用,熟悉CCS中的C语言编程,并且初步了解C6000DSP的汇编语言。


C6000实验2:C6000流水线和C运行时环境
 采用simulator配置文件sim6201_simulator.cfg
 1. 用汇编语言实现两个数组的乘法累加功能: sop_asm.asm中实现函数int sop_asm(short * a, short * x, int n);然后,手工优化汇编代码;
 2. C调用汇编函数,汇编函数调用c函数:
在main函数中调用汇编实现的函数addarr3, 在addarr3中调用C子函数addarr2.
addarr3(int * arr1, int * arr2, int * arr3, int * arr4, int n) 是汇编函数,其功能为3个数组的对应位置相加,结果放在arr4[n]中;
汇编函数addarr3中调用C的子函数,它把arr1和arr2相加放到arr3[n]中;
addarr2(int * arr1, int * arr2, int * arr3, int n)

实验2 C6000流水线和C运行时环境
1.实验目的和要求
1.熟悉DSP软件开发环境CCS的使用。
2.熟悉C6000中的C运行时环境。
2.主要仪器设备(实验用的软硬件环境)
   安装了CCS2.0的计算机,采用simulator配置文件sim6201_simulator.cfg
3.操作方法与实验步骤
1、打开ccs6000的C运行时的环境。
2、假设乘数和被乘数分别为a=0x10008,b=0x00020,已经分别放在了(0x80000000)和(0x80000004)单元中,(DP)=0x80000000,下面就是这两个数相乘的得汇编程序:
    LDW  .D2T2  *DP[0x0],B4
LDW  .D2T2  *DP[0x1],B5
NOP            4
MPYLH  .M2  B5,B4,B6
MPYLH  .M2  B4,B5,B7
MPYU  .M2  B5,B4,B4
ADD  .D2  B6,B7,B5
SHL  .S2  B5,0x10,B5
STW  .D2T2  B4,*DP[0x2]
3、最后计算的结果放在(0x80000008)单元中,最后运行结果如下图所示。

由汇编语言程序可以看出,假设数分别用[(a)高16位(b)低16位]*[(c) 高16位(d)低16位]来代替,那么汇编语言实现的就是用下面的算法实现的:[(a*d)+(b*c)]*1000h+(b*d),因为寄存器的长度有所限制,所以在做乘法时,就把高位相乘(a*c)的结果舍弃掉了。
3、在第二个程序中,调用汇编函数,汇编函数调用c函数,这其中采用数据来实现参数的传递。
(1)先从最后一个子函数开始,即addarr2(int *arr1, int *arr2, int *arr3, int n)
static int addarr2(int *arr1, int *arr2,int *arr3,int n)
{
for(i=0;i<n;i++)
{
*arr3++ = *arr1++ + *arr2++;
   }
  return ;  
}
(2)实现了两个数组相加的子程序之后,下面就要编写汇编子函数了,这个子函数不仅是一个子函数,也是一个父函数,通过它来调用上一个addarr2函数,由于是汇编程序,所以其中的断点的保护就需要用指令来实现,这就要先搞清楚需要把那些寄存器压栈,最后还要把相应的寄存器出栈。
这个函数的功能也是两个数组相加,即arr3[5]+arr4[5]=>arr4[5],通过地址来实现数据在函数中的传递。
实现这个函数的程序如下:
  .global _addarr3
        .text

_addarr3:
mvk  .s2 0x0005,b0     ;设置循环次数
mvk  .s1 0x002c,a1     ;arr3首地址
mvkh .s1 0x6000002c,a1
mvk  .s1 0x0040,a2     ;arr4首地址
mvkh .s1 0x60000040,a2

loop:
ldw  .d1 *a1++,a3          ;开始做加法
ldw  .d1 *a2,a4
nop       4
add  .l1 a3,a4,a4
sub  .s2 b0,1,b0
      stw  .d1 a4,*a2++
nop       4
[b0]  b   .s2    loop
nop       5
.end
(3)由于在调试上面两个程序时都需要观察结果,所以在最初调试addarr2子函数时就采用用printf( )函数输出的办法来观察最后计算的结果是否正确,当addarr3汉书编写完成后,再实现两个子函数的联调。最后得到main( )函数如下:
void main()
{
addarr2(arr1,arr2,arr3,n);     /*调用addarr2函数*/
addarr3(arr3,arr4);           /*调用addarr3函数*/
for(i=0;i<n;i++)
{
printf("The arr4 is:%d\n",arr4[i]);
}

return ;
}
最后得到的整个C语言的程序如下:
#include "stdio.h"
#define size 5                         /*定义常量size*/

int i,n=size;

int arr1[size]={1,2,3,4,5};           /*输入数据数组*/
int arr2[size]={2,3,4,5,6};
int arr3[size];
int arr4[size]={5,6,7,8,9};      /*开辟存储空间*/
extern void addarr3(int arr3[size],int arr4[size]);     /*定义子函数addarr3*/
static int addarr2(int *arr1,int *arr2,int *arr3,int n); /*定义子函数addarr2*/

void main()
{
addarr2(arr1,arr2,arr3,n);     /*调用addarr2函数*/
addarr3(arr3,arr4);            /*调用addarr3函数*/

for(i=0;i<n;i++)
{
printf("The arr4 is:%d\n",arr4[i]);
}

return ;
}

static int addarr2(int *arr1, int *arr2,int *arr3,int n)
{
for(i=0;i<n;i++)
{
*arr3++ = *arr1++ + *arr2++;
}
return;
}
4.实验内容及实验数据记录
采用simulator配置文件sim6201_simulator.cfg
   1. 用汇编语言实现两个数组的乘法累加功能: sop_asm.asm中实现函数int sop_asm(short * a, short * x, int n);然后,手工优化汇编代码;
   2. C调用汇编函数,汇编函数调用c函数:
在main函数中调用汇编实现的函数addarr3, 在addarr3中调用C子函数addarr2.
addarr3(int * arr1, int * arr2, int * arr3, int * arr4, int n) 是汇编函数,其功能为3个数组的对应位置相加,结果放在arr4[n]中;
汇编函数addarr3中调用C的子函数,它把arr1和arr2相加放到arr3[n]中;
addarr2(int * arr1, int * arr2, int * arr3, int n)
5.实验结果
实验结果如下图所示:



6.质疑、建议、问题讨论
通过本次实验,让我学习了使用ccs6000来进行dsp程序的编写和调试工作,而且我还逐步掌握dsp在处理程序式的过程和常见错误类型,从而更好的理解c6000的C运行时的环境和流水线工作流程。但在一些方面还存在着不足,比如:对程序的编写还有些生疏,以后我会更多的练习。









C6000实验3:DSP/BIOS
 采用simulator配置文件sim6201_simulator.cfg
1. 在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的任务切换过程。

实验3 DSP/BIOS
1.实验目的和要求
1.通过创建基于DSP/BIOS的Hello World工程实例,熟悉CCS环境下DSP/BIOS软件的创建和使用方法。
2.熟悉在CCS环境下对代码的运行效率和性能作出评估的工具和方法。
3.实验要求
完成实验内容,运行成功,得到输出结果,填写以下表格,并作出对比分析。
运行一次所需要的指令周期数(单位:个)
put()函数 1700
LOG_prinrt()函数 36
printf()函数 2530

2.主要仪器设备(实验用的软硬件环境)
   安装了CCS2.0的计算机,采用simulator配置文件sim6201_simulator.cfg
3.操作方法与实验步骤
   第一步:打开已有工程并运行
1、 在C:\ti\myprojects目录里面创建hellobios目录。
2、 把C:\ti\tutorial\sim64xx\hello1里的全部文件拷贝到这个新的目录下面。
3、 如果CCS还没有启动,启动CCS环境,Setup里面设置为C64xx Device Simulator。
4、 选择Project->Open,打开这个工程,工程的项目文件目录为:C:\ti\myprojects\hellobios,项目名称是hello.pjt。
5、 若提示以下错误,选择Browse,选择目录:C:\ti\C6000\cgtools\lib\rts6400.lib,打开工程。
6、 编译,运行工程,查看结果,应该是输出hello world字符。
第二步:评测stdio.h中输出函数put()的执行时间(周期数)
1、 新建一个Profiler,选择Profiler->Start New Session,名称为MySession,确定。
2、 出现Session窗口,选择Range栏。如下所示,出现hello.out。
3、 用鼠标拖曳,高亮put()函数,如下所示:
4、 按住鼠标,拖曳到Range窗口里面,出现:
5、 重新Load程序,运行,得到运行结果如下:
6、 结论:采用put()函数输出一次的指令周期数是:1700。
7、 采用同样方法,测试printf()函数的指令周期数目:
8、 记录put()函数和printf()函数需要的指令周期数到表格,用来和下面实验的结果对比。
第三步:编辑源代码
1、 在CCS里,关闭hello.c窗口。
2、 用Windows Explorer把C:\ti\tutorial\sim64xx\hello2目录里的hello.c文件拷贝到C:\ti\myprojects\hellobios目录。按Yes覆盖原来已经存在的hello.c文件。hello2例中采用DSP/BIOS函数来替代hello1例中的标准C函数的put()输出函数。
3、 双击hello.c文件,在Project View窗口打开源文件。
4、 注意新代码的几点问题:
#include <std.h>
#include <log.h>
#include "hellocfg.h"
Void main()
{    LOG_printf(&trace, "hello world!");
    /* fall into DSP/BIOS idle loop */
    return;
}
5、 hello.c文件首先包含了std.h和log.h两个头文件。程序如果想使用DSP/BIOS API那它必须包含std.h文件以及程序中用到的模块的对应头文件。log.h头文件中定义了LOG_Obj结构以及LOG模块用的API函数的声明。std.h文件必须在其它的DSP/BIOS模块头文件之前声明。其它模块的头文件声明顺序不重要。
6、 代码接下来要包含hellocfg.h头文件,这个文件在创建并保存DSP/BIOS配置的时候创建的。下一个步骤我们就来创建这个文件。这个文件包含了配置文件夹里面的DSP/BIOS objects的外部声明。
7、 hellocfg.h文件也包含了配置文件里定义的DSP/BIOS模块的头文件。既然std.h和log.h文件都会被hellocfg.h文件引用,那么hello.c文件的头两行时间上是冗余的。但是这样也不会有任何问题。
8、 调用LOG_printf的代码实际上是传递LOG object对象(&trace)和 hello world消息的地址。
9、 最后main()函数返回,这个函数导致程序进入DSP/BIOS的Idle循环。在这个循环中,DSP/BIOS等待线程,例如软件中断和硬件中断发生。在该例中,没有其它线程发生,所以会一直处于IDLE状态。
第四步:创建DSP/BIOS的配置文件
1、 选择File->New->DSP/BIOS Config。
2、 选择一个目标模板,根据芯片选择,我们选c64xx.cdb,然后按OK。观察configuration窗口,左边窗口是模块的列表,可以通过点击模块的“+”号打开下级目录,也可以按右键新建一个对象或查看一个建立好的对象的属性。
3、 点击Instrumentation目录左侧的+号,显示模块的列表。
4、 邮局选择LOG—Event Log Mannger然后右击选择Insert LOG。这个步骤是创建一个LOG对象,名称为LOG0。
5、 右键选中LOG0对象,然后右击选择Rename。把LOG对象改名为trace.
6、 如果你在使用软件仿真器,需要设置RTDX模式为Simulator。
选择RTDX—Real-Time Data Exchange Settings,右键,选择属性,打开对话框:
将RTDX Mode设定为Simulator即可。如果有目标板,可以选择JTAG。
7、 选择File->Save。保存到当前目录(通常是C:\ti\myprojects\hellobios)命名为hello.cdb,保存这个配置后,会生成以下6个文件:
Hello.cdb  保存配置的内容
Hellocfg.cmd 链接command文件
Hellocfg.h  包括DSP/BIOS模块头文件和配置文件中用到的外部对象、变量的声明
Hellocfg.s62 DSP/BIOS设置的汇编语言源文件
Hellocfg.h62 Hellocfg.s62引用到的汇编语言源文件
Hellocfg_c.c Chip Support Library(CSL)代码结构和设置
第五步:添加DSP/BIOS文件到工程项目
1、 选择Project->Add Files to Project,在Files of type栏目里选择Configuration File(*.cdb),选中hello.cdb文件后,点Open。注意添加后,hello.cdb出现在Porject View窗格下目录DSP/BIOS Config里。此外,CCS自动添加Hellocfg.s62和Hellocfg_c.c文件到生成的目录下。
2、 输出文件名必须和.cdb文件一致。可以通过Project->Build Options打开Linker标签查看,确认Output Filename内容是.\Debug\hello.out,按OK确定。
3、 再次选择Project->Add Files to Project,选对Linker Command File(*.cmd)在Files of type下拉菜单,选择hellocfg.cmd文件,然后按Open。
4、 如果看到警告,按Yes。Hello.cmd文件被hellocfg.cmd文件替代,hellocfg.cmd文件是保存DSP/BIOS时生成的。
5、 若没有警告,直接将hello.cmd文件从项目中删除。
6、 你可以自己创建独立的cmd文件,但文件中必须引用DSP/BIOS的生成的配置cmd文件。如:
-1 hellocfg.cmd
Your Code ......
7、 从项目中删除vectors.asm源文件。因为硬件中断可以通过DSP/BIOS设置,不需要单独的处理。
8、 从项目中删除rts6400.lib文件。这个库已经被hellocfg.cmd自动引用了。
9、 选择Project->Save保存对项目的更改。建议在编译和运行项目前,先保存修改。
10、 选择Project->Rebuild All。
11、 经过以上修改,项目变化为:
第六步:在CCS的Simulator环境下测试工程
1、 选择File->Load Program,选中hello.out,确定。
2、 选择DSP/BIOS->Message Log,出现窗口:
3、 在Log窗口按右键,选择属性,把输出文件指定到hello.txt,用来保存结果,便于以后查看。
4、 选择Debug->Go Main,然后F10,单步运行。观察Log窗口的输出。
5、 在Log窗口,按右键选择close,关闭窗口。
6、 重新Load程序,按F4。
7、 运行程序,等待一会儿,再按结束,中止程序运行。
8、 File->Open,然后在Debug目录中选择hello.txt,打开查看,内容和窗口的输出是一样的,都是hello world!
第七步:评估DSP/BIOS输出函数LOG_printf()的执行时间(周期数)
在这个步骤中,我们利用CCS的Profiling工具来评估LOG_printf()函数需要的指令周期数目,并且和printf()和put()函数对比。
1、 选择File->Reload Program。
2、 选择Profiler->Start New Session,弹出Proliler session窗口,接受默认的名称MySession,确认。如果出现错误,可以禁用RTDX功能。
3、 在MySession的窗口中,选择Ranges选项。
4、 双击hello.c文件,在Project View中打开源文件。
5、 高亮调用LOG_printf函数的语句。
6、 用鼠标拖曳到MySession Profile窗口中。
7、 MySession Profile窗口得到如下设置。时间的行号(line 28)可能会有所不同。
8、 按下“Run”按钮,或按F5运行程序。
9、 在MySession Profile窗口,观察Incl. Total column.(由于这个函数只执行一次,所以Total、Maximum和Minimum是相同的)
The Incl.Total的含义:这个参数是用来表示从汇编指令执行到这一行的开始到执行结束所需要的指令周期数目。
比较LOG_printf()函数和puts()函数的指令周期数目。
结论:经过对比发现,LOG_printf()函数比puts()函数的效率高很多。实际的指令周期数目和DSP芯片的型号有关。
调用LOG_printf()函数效率高的原因是字符串的格式化工作在主机(PC)完成,而不是目标板(DSP)上完成,所以说,LOG_printf()函数效率非常高。
4.实验内容及实验数据记录
1、打开已有的Hello World工程,评估stdio.h的运行效率,即put()函数的性能;
2、在Hello World基础上,创建一个基于DSP/BIOS的Hello World工程;
3、评估DSP/BIOS的输出函数性能,即LOG_printf()函数运行的指令周期。
5.实验程序或实验数据处理与分析
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.cdb

创建一个LOG对象,名称为LOG0,右键选中LOG0对象,然后右击选择Rename。把LOG对象改名为trace.

选择RTDX—Real-Time Data Exchange Settings,右键,选择属性,打开对话框:设置RTDX模式为Simulator。

选择File->Save。保存到当前目录(通常是C:\ti\myprojects\hellobios)命名为hello.cdb,保存这个配置后,会生成以下6个文件:
  
5)添加DSP/BIOS文件到工程项目
(1)添加hello.cdb


(2)输出文件名必须和.cdb文件一致:确认Output Filename内容是.\Debug\hello.out,按OK确定。

(3)添加hellocfg.cmd文件:并移除hello.cmd文件、vectors.asm源文件、rts6400.lib文件


(5)Rebuild All

6)在CCS的simulator环境下测试工程
  (1) 选择DSP/BIOS->Message Log,出现窗口:

在Log窗口按右键,选择属性,把输出文件指定到hello.txt,用来保存结果:

(2)选择Debug->Go Main,然后F10,单步运行。观察Log窗口的输出:

(3) File->Open,然后在Debug目录中选择hello.txt,打开查看,内容和窗口的输出是一样的,都是hello world!


7)评估DSP/BIOS输出函数LOG_printf()的执行时间
  (1)选择Profiler->Start New Session,弹出Proliler session窗口,接受默认的名称MySession,确认。如果出现错误,可以禁用RTDX功能。

(2)将LOG_printf函数的语句拖曳到MySession Profile窗口中:并运行程序

结论:采用LOG_printf ()函数输出一次的指令周期数是:36。
结论:经过对比发现,LOG_printf()函数比puts()函数的效率高很多。实际的指令周期数目和DSP芯片的型号有关。
调用LOG_printf()函数效率高的原因是字符串的格式化工作在主机(PC)完成,而不是目标板(DSP)上完成,所以说,LOG_printf()函数效率非常高。

6.质疑、建议、问题讨论
本次实验,主要是熟悉CCS环境下DSP/BIOS软件的创建和使用方法、熟悉在CCS环境下对代码的运行效率和性能作出评估的工具和方法。在要注意的是本次配置CCS时要用的是rts6400.lib库而不在是rts6200.lib库。通过实验使我对代码有了新的理解。



















C6000实验4:C6000代码优化
1. 采用simulator配置文件sim6201_simulator.cfg
   写手工优化的.asm程序:在volume1的load.asm基础上实现16bit数组的乘法累加的函数,并手工优化和采用软件流水优化;要求:
(1)使用LDW和MPY,MPYH指令;对于C64可以使用扩展乘法指令。
(2)画出相关图和模迭代间隔表
2. 采用simulator配置文件sim6701_simulator.cfg .
写一个线形汇编实现的子函数,做复数数组求模,并找出模的最大值的位置和值。复数的实部和虚部为short,求模的结果为unsigned int;
提示:使用INTSP指令把整数转化为浮点数后再开方;

实验4 C6000代码优化
1.实验目的和要求
1.熟悉DSP软件开发环境CCS的使用。
2.掌握CCS中的C语言编程。
3.熟悉C6000DSP的代码优化过程。
2.主要仪器设备(实验用的软硬件环境)
   安装了CCS2.0的计算机,采用simulator配置文件sim6201_simulator.cfg
3.操作方法与实验步骤
1)打开ccs6000的C运行时的环境;
2)双击桌面程序Setup CCS2(6000),配置CCS,选择C6xxx;
3)配置好后,打开桌面程序CCS2(6000);
4)把文件夹tutorial\sim62xx\hello1拷贝到myproject下;
5)单击菜单project->open,打开open.pjt,选择文件库rts6200.lib;
6)将汇编代码段加到hello.asm,再在hello.c中加入汇编子函数的C语言程序,进行编译、加载生成.out文件,执行产生结果。
4.实验内容及实验数据记录
1. 采用simulator配置文件sim6201_simulator.cfg
   写手工优化的.asm程序:在volume1的load.asm基础上实现16bit数组的乘法累加的函数,并手工优化和采用软件流水优化;要求:
(1)使用LDW和MPY,MPYH指令;对于C64可以使用扩展乘法指令。
(2)画出相关图和模迭代间隔表
2. 采用simulator配置文件sim6701_simulator.cfg .
写一个线形汇编实现的子函数,做复数数组求模,并找出模的最大值的位置和值。复数的实部和虚部为short,求模的结果为unsigned int;
5.实验程序或实验数据处理与分析
   1. 实现16位数组乘法函数
1)在hello.c中添加文件sop_c.c

2)在main函数中的调用

3)编译运行结果

2.优化
  1)线性汇编优化sop_sa.sa

  2)在main函数中的调用

  3)编译运行结果

  4)汇编优化sop_asm.asm

  5)在main函数中的调用

  6)编译运行结果

6.质疑、建议、问题讨论
   通过此次实验,进一步熟悉DSP软件开发环境CCS的使用,也知道并且熟悉C6000DSP的代码优化过程,但还是发现自己在编写改进程序上能力不足,今后一定加强这方面的练习。

Tag:  

作业咨询:
点击这里给我发消息

论文咨询:
点击这里给我发消息

合作加盟:
点击这里给我发消息

服务时间:
8:30-24:00(工作日)