CCS中DSPBIOS工具的使用DSP实验报告Word文档格式.docx
- 文档编号:22673504
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:10
- 大小:22.84KB
CCS中DSPBIOS工具的使用DSP实验报告Word文档格式.docx
《CCS中DSPBIOS工具的使用DSP实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《CCS中DSPBIOS工具的使用DSP实验报告Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
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<
swi.h>
clk.h>
增加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或更高。
然后重新编译、连接,装入再运行,看看情况有没有变化?
本实验还未有实验结果,正在寻找原因。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CCS DSPBIOS 工具 使用 DSP 实验 报告