CCS中DSPBIOS工具的使用DSP实验报告.docx

上传人:b****8 文档编号:9537473 上传时间:2023-02-05 格式:DOCX 页数:10 大小:22.84KB
下载 相关 举报
CCS中DSPBIOS工具的使用DSP实验报告.docx_第1页
第1页 / 共10页
CCS中DSPBIOS工具的使用DSP实验报告.docx_第2页
第2页 / 共10页
CCS中DSPBIOS工具的使用DSP实验报告.docx_第3页
第3页 / 共10页
CCS中DSPBIOS工具的使用DSP实验报告.docx_第4页
第4页 / 共10页
CCS中DSPBIOS工具的使用DSP实验报告.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

CCS中DSPBIOS工具的使用DSP实验报告.docx

《CCS中DSPBIOS工具的使用DSP实验报告.docx》由会员分享,可在线阅读,更多相关《CCS中DSPBIOS工具的使用DSP实验报告.docx(10页珍藏版)》请在冰豆网上搜索。

CCS中DSPBIOS工具的使用DSP实验报告.docx

CCS中DSPBIOS工具的使用DSP实验报告

CCS中DSP/BIOS工具的使用

一、实验目的

目前CCS已经成为DSP开发过程中不可缺少的软件工具。

通过前面的实验,我们已经基本掌握了CCS提供的断点、探针、图形显示等调试工具的使用。

在本实验中,我们将学习CCS中的高级管理和调试工具-DSP/BIOS的使用,并通过实验掌握该工具的使用方法。

二、实验原理

1)CCS包含的功能

a.集成可视化代码编辑界面,可直接编写C,汇编、.H文件、.cmd文件等。

b.集成代码生成工具,包括C编译器。

c.基本调试工具,如装入执行代码(.OUT文件),寄存器窗口,存储器窗口,反汇编窗口,变量窗口等,支持C源代码级调试。

d.支持多DSP调试。

e.断点工具,包括硬件断点、数据空间读/写断点,条件断点(使用GEL编写表达式)等等。

f.探针工具(probepoints),可用于算法仿真,数据监视等。

g.剖析工具(profilepoints),可用于评估代码执行的时钟数。

h.数据的图形显示工具,可绘制时域/频域波形,眼图,星座图,图象等,并可自动刷新(使用Animate命令运行)。

i.提供GEL工具,令用户可以编写自己的控制面板/菜单,从而方便直观地修改变量,配置参数等。

j.支持RTDX技术,利用该技术可在不中断目标系统运行的情况下,实现DSP与其他应用程序(OLE)实现数据交换。

k.开放式的plug-ins技术,支持其它第三方的ActiveX插件,DSP目标系统以及仿真器。

l.提供DSP/BIOS工具,利用该工具可增强对代码的实时分析能力。

如分析代码执行的效率,调度程序执行的优先级,方便管理或使用系统资源(代码/数据占用空间,中断服务程序的调用,定时器使用等等)。

2)利用CCS开发DSP程序流程

a.在“project”菜单项下选“new”,开始创立一个新的工程文件。

b.将编写好的C、汇编、H头文件、以及编译完成的OBJ、LIB文件添加到project下。

c.将内存定位的CMD文件添加到project下,并根据目标系统的实际存储器和具体要求做相应的修改。

d.若使用了DSP/BIOS,还需将配置文件CDB添加到project下。

e.在“project”菜单项中选“options”可以进入编译、连接参数开关选择窗口;或用鼠标右键单击“project”文件夹下的pjt文件名,也可进入。

f.注意:

在“BuildOptions”窗口中“Compiler”选项主要针对C编译器,“Assembler”选项针对汇编源程序,“Linker”为连接器lnk500使用开关。

g.利用“buildall”命令完成编译,连接。

h.将生成的.out文件装入DSP的片内或外部扩展存储器(装入地址有CMD文件确定)并完成调试。

i.分析,统计或跟踪代码,确保算法的准确性、实时性和高效率。

3)DSP/BIOS的功能

a.DSP/BIOS是CCS提供的一套工具,用于支持提高应用程序实时分析能力。

它本身仅占用极少的CPU资源。

b.DSP/BIOS工具使用线程来管理程序,如硬件中断服务子程序,软件中断服务子程序,周期函数,idle函数等。

c.DSP/BIOS提供多种分析工具,评估代码。

如图形化显示各个线程占用的CPU时间,图形化显示CPU负荷状态等。

d.DSP/BIOS工具可以调整各个线程的优先级。

4)建立DSP/BIOS的配置文件

a.每个使用DSP/BIOS的程序都要建立配置文件。

根据该配置文件(.cdb),系统自动生成LNK使用的.cmd文件和一个包含DSP/BIOS工具的汇编源程序(.s54)。

你需要将这两个文件添加到你的工程文件中。

b.配置文件可以定义程序运行是的全局参数,如PMST,SWWSR,CLKMD等。

当程序开始运行后,DSP/BIOS会在初始化阶段根据你的指定自动设置这些寄存器。

c.使用可视化的工具编辑配置文件,以便说明程序需要使用的各种DSP/BIOS提供的Object,如中断,管道,事件记录。

5)DSP/BIOS提供的API模块

a.CLK模块:

用于片上的定时器管理,设置定时器中断的间隔时间。

b.HST模块:

用于实现主机与目标系统间数据的输入或输出。

c.HWI模块:

用于硬件中断管理,可设置相应的中断服务子程序。

d.IDL模块:

用于管理idle函数,该类函数具有最低优先级。

e.LOG模块:

用于事件的记录显示。

例如,你可以通过该API输出调试信息。

f.MEM模块:

用于定义目标系统的内存使用。

系统根据此信息自动产生.cmd文件。

g.PIP模块:

用于管道管理,可以实现线程间的数据交换。

h.PRD模块:

用于实现周期性的函数。

该类函数的执行频率可以由CLK模块或自己调用PRD_tick决定。

i.RTDX模块:

用于主机与DSP目标系统间的实时数据传递。

j.STS模块:

用于状态统计管理,你可以在CCS下查看这些统计参数。

k.SWI模块:

用于管理软件中断。

CCS将运行队列中的软件中断,并可以设置15个优先级,但都比硬件中断低。

在本实验中我们将使用DSP/BIOS工具提供的CLK、LOG、PRD、STS、RTDX、SWI等模块。

三、实验内容

1)启动CCS,新建工程文件,如文件名为bios.pjt。

选择Project菜单中的AddFiletoProject选项,将源程序volume.c、load.asm依次添加到工程文件中。

2)在File菜单下选择“New->DSP/BIOSConfiguration”选项,新建一个DSP/BIOS的配置文件(选择模板时,可以选c54xx.cdb)。

然后将它添加到工程文件中。

当然,你也可以从别处复制一个配置文件(.cdb后缀),然后在此基础上按下面的步骤修改。

假设我们新建的配置文件名为bios.cdb,配置文件编辑工具同时还会自动生成bioscfg.s54(包含DSP/BIOS工具的源汇编代码文件)、bioscfg.cmd(连接内存定位文件)以及bioscfg.h54(头文件)。

前面两个你必须手工添加到工程文件中,而后面一个(.h54头文件)系统会自动添加到工程文件中。

3)在工程文件管理窗口中,用鼠标左键双击前面添加的配置文件,如bios.cdb,启动配置文件编辑工具,完成对配置文件的修改。

当你用鼠标选择编辑窗口左面的“GlobalSettings”时,该项的设置参数将显示在右面。

若要修改此项参数,请使用鼠标右键单击该项,然后在弹出菜单中选“Properties”。

其他选项也可用同样的方法修改设置。

DSPMIPS(CLKOUT)项指出当前目标板上DSP的工作频率,DES320PP-U上使用的是100MIPS的‘VC5402,故这项不修改。

PMST寄存器这里只能修改它的低7位,而高9位为中断向量表的基地址,这里无法修改。

在下面的实验中,我们需要将DSP片内的存储器同时映射到程序和数

据空间,即将PMST的BIT5:

OVLY=1,所以这里应该将低7位改为0x20。

高9位系统将根据MEM项中“VECT”段的位置自动设置。

若选择了“ModifyCLKMD”项,DSP/BIOS将在初始化中完成对DSP时钟变频的设置。

这里我们不需要,因为DES320PP-U在上电时已经自动完成外部时钟X10的设置,DSP已经运行在100M频率下了。

(4)在MEM配置项中,VECT段用来存放中断向量表,其地址直接生成PMST的高9位。

IPROG段为片内程序空间,EPROG为片外程序空间,IDATA为片内数据空间,EDATA为片外数据空间。

根据DES320PP-U板上的存储器大小,我们先对IPROG的分配做修改,将起始地址该为0x2080,长度为0x1f80,参见图9-3。

然后再将VECT段改到0x2000,系统会同时自动设置PMST高9位。

再修改IDATA段,该段使用‘VC540216K片上存储器的前8K为数据空间,长度为0x1f80(从0x80–0x1fff)。

5)继续修改配置文件,增加一个信息显示窗口。

在标准C中,我们可以使用printf来输出信息,但该函数会消耗大量的内存空间,而且执行速度也较慢。

DSP/BIOS提供了LOG模块,可以用于记录输出信息。

与标准C的输出函数相比,使用LOG模块将占用更少的内存和更快的速度。

使用DSP/BIOS的LOG模块,主要有三步:

a.在工程文件窗口下用鼠标左键双击配置文件将其打开,展开LOG选项(LOG模块中先已经有一个LOG_system,这是DSP/BIOS系统保留的,请不要随意删除),并用鼠标右键单击,在弹出菜单中选择“InsertLOG”项。

用鼠标右键单击新增加的LOG0,修改新增LOG0对象的名称,如trace。

然后使用鼠标右键单击,并在弹出菜单中选择“Property”,修改其参数,如将buflen改为512。

另外,请将LOG_system的buflen项也改为512。

b.在C源程序volume.c中增加包含的头文件,如std.h,log.h,并增加变量说明。

这些变量由配置工具创立的,你可以直接引用,但需要说明为外部全局变量,如

externLOG_Objtrace;

c.在C源程序中的main()函数中增加LOGAPI函数,如

LOG_printf(&trace,“Thenewprogramisrunning\n”);

该函数可以在DSP/BIOS提供的事件记录窗口显示信息(等效于标准C中的printf函数)。

6)保存修改的配置文件、C源程序等。

然后选择Project菜单中的BuildOptions选项,或使用鼠标右键单击工程文件名(如bios.pjt)并选择BuildOptions项来修改或添加编译、连接中使用的参数。

例如,选择Linker窗口,在“OutputFilename”栏中写入输出OUT文件的名字,如bios.out,你还可以设置生成的MAP文件名。

注意,在使用了DSP/BIOS的程序中,生成的输出OUT文件最好与该工程文件使用的DSP/BIOS配置文件名一致(后缀可以不同),如bios.out。

7)完成编译、连接,正确生成OUT文件。

然后使用File菜单的“LoadProgram”选项,将生成的OUT文件(如bios.out)装入DSP的片内存储器。

在选择装入OUT文件名时请注意该文件所在的目录。

CCS会默认上次成功装入OUT文件的目录!

这时CCS将显示程序的启始地址_c_int00。

8)选择“Debug”菜单中的“GoMain”运行程序到main()函数。

从程序的进入点_c_int00到main()函数之间,包含了大量的初始化代码,所以只有执行到main()函数后,CCS才能显示C源程序。

9)选择“DSP/BIOS”菜单,然后选“MessageLog”。

用鼠标右键单击出现的MessageLog窗口,在弹出菜单中选“PropertyPage”。

在“logname”选项中选择“trace”,使得该窗口显示送到trace对象的信息。

(使用LOG_printf(&trace,“Theprogram…”)语句)使用F5运行程序,观察该窗口输出。

10)使用命令Debug->Halt暂停程序运行。

为了说明DSP/BIOS工具编写的代码在执行过程中与通常(不使用DSP/BIOS工具)的代码执行有所不同,我们做个测试。

我们在LOG_printf语句后面增加一个死循环语句:

while

(1);

按通常顺序执行的原则,程序应该在进入循环之前输出信息。

然后我们重新编译、

连接并装入程序。

在编译时请忽略有关while语句的警告。

然后使用Debug->GoMain命令执行到main()函数。

使用F5继续运行程序,看看LOG窗口中还有没有信息输出?

使用Halt命令暂停程序。

注意,由于程序已进入死循环,在点击Halt命令时和点击后请多等一会,直到菜单显示或显示程序停在while语句行(该行变为黄色)。

请观察LOG窗口,这时才显示我们需要的信息。

这说明一点,DSP没有按程序编写的先后顺序执行。

在使用DSP/BIOS工具后,DSP/BIOS将需要执行的模块按优先级在执行队列中排队等待。

所以,若main()函数一直没有执行完(因为有while

(1)语句),LOG模块将一直处于等待状态,直到我们中断main()函数。

你可以使用命令Debug->Restart将PC指针指向程序的进入点,准备重新执行程序,然后用GoMain命令进入main()函数,再使用F10单步执行(若使用F8,则单步运行将进入函数内部),你可以看到程序在进入循环之前已经执行了LOG模块。

想想这是为什么?

11)将while语句删除,继续修改程序,完成下面的功能:

每1ms调用dataIO()函数一次,而模拟处理函数processing()需要每调用10次dataIO()函数后才运行。

利用CCS提供的DSP/BIOS工具,我们可以很方便地实现该功能。

首先我们设置定时器,使得程序运行时,在定时器中断的作用下实现每1ms调用一次dataIO()函数。

然后在将处理函数processing()放到一个软件中断中,并利用DSP/BIOS提供的邮箱(mailbox)功能对其调用次数进行计数,以确定在什么时候将processing()放入执行队列。

这样,我们在定时器中断服务程序中调用一个函数SWI_dec(),该函数将对软件中断模块的邮箱(mailbox)减1,当mailbox参数减到0时,将processing()函数放入执行队列等待执行。

我们只需要在设置软件中断模块时将邮箱预置为10,DSP/BIOS会每次自动重新装入并实现计数功能。

请按下列步骤修改配置文件和源程序:

a.在CLK模块中插入新的对象,重命名为dataIO_CLK,使用鼠标右键进入属性窗口,输入函数名_dataIO。

该函数将在定时器中断中被调用。

使用鼠标右键点击CLK模块项可以进入定时器属性设置窗口。

你可以修改“Microseconds/Int”项的值,以确定每隔多少微秒(us)产生一次定时器中断。

这里应该设置为1000。

b.在SWI模块中插入新的对象,重命名为processing_SWI,使用鼠标右键进入属性窗口,输入该软件中断调用的函数名_processing以及调用时的参数:

mailbox(邮箱)为10,调用processing()函数的输入参数_inp_buffer和_out_buffer.

c.打开volume.c,修改源文件。

增加头文件如下:

#include

#include

增加Object对象说明,如下:

externSWI_Objprocessing_SWI;

以及在dataIO()函数中增加如下函数调用:

SWI_dec(&processing_SWI);

12)重新编译、连接并装入新的OUT文件。

使用“GoMain”命令将程序运行到main()函数处。

13)用鼠标右键点击编译连接信息输出窗口,并选择“Hide”隐藏该窗口。

选择

“DSP/BIOS”菜单,然后选择“RTAControlPanel”,在弹出菜单中选enableSWI,CLK和golbal,以便在下面的图形显示窗口中可以显示SWI和CLK模块。

14)在“DSP/BIOS”菜单下选“ExecutionGraph”,打开DSP/BIOS提供的各模块的图形化显示窗口(你可以用鼠标拖动窗口边框来调整窗口大小),使用F5运行程序,观察图形显示窗口。

从图中的“PRDTicksTimes”所显示的刻度看看是否是每10次定时器中断执行一次processing_SWI。

15)修改processing_SWI中的mailbox,如该为5,即每隔5ms调用一次dataIO()。

重新build并装入,再次运行,观察图形显示。

看看与上次有何不同?

16)使用DSP/BIOS->CPULoadGraph选项,打开CPU负荷状态图,观察CPU占用情况。

17)使用Debug->Halt选项中断程序,利用Watch窗口修改processingLoad变量(可以在C源程序中将光标移动到该变量处,然后用右键添加到Watch窗口中;也可以先打开Watch窗口,再添加processingLoad变量。

修改该变量的值时可以在Watch窗口中用鼠标双击,然后输入新的值,如1000),这样可以增加函数processing()的运行时间。

按F5恢复程序运行,观察CPU负荷图变化。

18)在File菜单中选“LoadGEL”,并装入volume.gel文件。

在GEL菜单中选“ApplicationControl”项(该项在装入volume.gel后才添加),在选择“Load”。

通过该GEL命令,你可以直接修改processingLoad变量(如5000,10000,12000),而不用中断程序运行。

观察CPU负荷图和CPU执行图的变化。

19)暂停程序运行,重新修改配置文件。

先将processing_SWI的mailbox改回到10。

然后再增加PRD模块,即增加一个周期性函数。

修改新增加的PRD模块(如PRD0)的参

数,将调用时间间隔period改为2,调用函数名称该为_test。

这表示test()函数将每隔

2ms执行一次(实际上是每2ms放入执行队列)。

在volume.c源程序的main()之前,增

加如下代码:

voidtest()

{

}

20)重新build、装入并运行。

注意:

请将RTA面板的“enablePRDlogging”项打开!

使用运行图形观察各个函数执行情况。

比较周期性函数PRD0、软件中断模块processing_SWI和其他模块的运行情况。

21)修改变量processingLoad,以增加processing()函数的运行时间。

如将processingLoad改为5000,10000,15000,看看CPU负荷图和运行图的变化。

比较一下第18步同样processLoad=10000时,CPU负荷为何不一样?

当到15000时,看看周期性函数模块PRD0是否还能保持原来的每2ms运行?

想想为什么?

22)当processing()执行时间过长时,周期函数mytest()有时无法执行。

我们可以通过调整processing_SWI和PRD_swi的优先级来保证周期函数mytest()的正常执行。

在配置文件的SWI模块中,用鼠标拖动需要调整优先级的对象,即可完成设置。

方法为:

打开配置文件,用鼠标左键单击SWI项,这时你可以看到processing_SWI模块和周期函数管理模块PRD_swi都处于同一优先级(Priority1)。

使用鼠标拖动PRD_swi到Priority2或更高。

然后重新编译、连接,装入再运行,看看情况有没有变化?

本实验还未有实验结果,正在寻找原因。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1