《《DSP系统设计及应用》第六章》由会员分享,可在线阅读,更多相关《《DSP系统设计及应用》第六章(99页珍藏版)》请在金锄头文库上搜索。
1、DSPDSP系统设计系统设计及应用及应用胡景春胡景春16.16.1DSPDSP编程基础编程基础6.26.2DSPDSP软件集成开发平台软件集成开发平台CCSCCS6.36.3DSPDSP应应用用系系统统的的高高级级语语言言程程序序设设计计与调试与调试第六章第六章DSP应用系统软件设计应用系统软件设计26.16.1 DSPDSP编程基础编程基础6.1.1COFF公共目标文件格式公共目标文件格式3文件头:文件头:COFFCOFF文件的头,它用来保存文件的头,它用来保存COFFCOFF文件的基本信息,文件的基本信息,如文件标识,各个表的位置等等。如文件标识,各个表的位置等等。可选头:可选头:是可选的
2、,而且可有可无。在目标文件中,基本上是可选的,而且可有可无。在目标文件中,基本上都没有这个头;但在其它的文件中(如:可执行文件)这个段都没有这个头;但在其它的文件中(如:可执行文件)这个段用来保存在文件头中没有描述到的信息。用来保存在文件头中没有描述到的信息。段落头:段落头:是用来描述段落信息的,每个段落都有一个段落头是用来描述段落信息的,每个段落都有一个段落头来描述。段落头可以有多个节(因为可以有多个段落),段落来描述。段落头可以有多个节(因为可以有多个段落),段落的数目在文件头中会指出。的数目在文件头中会指出。段落数据:段落数据:这通常是这通常是COFFCOFF文件中最大的数据段,每个段落
3、真文件中最大的数据段,每个段落真正的数据就保存在这个位置。正的数据就保存在这个位置。重定位表:重定位表:这个表通常只存在于目标文件中,它用来描述这个表通常只存在于目标文件中,它用来描述COFFCOFF文件中符号的重定位信息。文件中符号的重定位信息。符号表:符号表:这个表用来保存这个表用来保存COFFCOFF文件中所用到的所有符号的信文件中所用到的所有符号的信息,符号表是以记录的形式来描述符号信息的,它只为符号名息,符号表是以记录的形式来描述符号信息的,它只为符号名称留置了称留置了8 8个字符的空间,通常把这些名称存在字符串表中。而个字符的空间,通常把这些名称存在字符串表中。而符号表中只记录这些
4、字符串的位置。连接多个符号表中只记录这些字符串的位置。连接多个COFFCOFF文件时,这文件时,这个表帮助我们重定位符号。调试程序时也要用到它。个表帮助我们重定位符号。调试程序时也要用到它。字符串表:字符串表:用来保存字符串的。用来保存字符串的。 46.1.26.1.2COFFCOFF文件中的段文件中的段1.段的分类段的分类所谓段,就是在存储器图中占据相邻空间的代码或数据块。所谓段,就是在存储器图中占据相邻空间的代码或数据块。COFF目标文件都包含以下目标文件都包含以下3种形式的段:种形式的段:.text段(代码段)段(代码段).data段(初始化数据段)段(初始化数据段).bss段(未段(未
5、初始化数据段)初始化数据段)段有两类:段有两类:(1)已初始化段。代码段已初始化段。代码段.text和数据段和数据段.data都是已初始化段;都是已初始化段;用用.sect、.asect汇编命令建立的自定义段也是已初始化段。汇编命令建立的自定义段也是已初始化段。4个个命令的写法命令的写法: .text.data.sect“块名块名”.asect “块名块名”,地址地址未初始化段。在存储器图中,它为未初始化过的数据保留存未初始化段。在存储器图中,它为未初始化过的数据保留存储空间,通常将它们定位到储空间,通常将它们定位到RAM区。区。.bss段是未初始化段;用段是未初始化段;用汇编命令汇编命令.u
6、sect建立的自定义段也是未初始化段。建立的自定义段也是未初始化段。2个命令的写个命令的写法法:.bss符号符号,字数字数符号符号.usect “块名块名”,字数字数52.汇编器对段的处理汇编器对段的处理(1)当汇编器遇到)当汇编器遇到.text或或.data或或.sect命令命令时,它将停止对当前段的汇编(相当于一条时,它将停止对当前段的汇编(相当于一条结束当前段汇编的命令),然后将紧接着的结束当前段汇编的命令),然后将紧接着的程序代码或数据汇编到指定的段中,直到再程序代码或数据汇编到指定的段中,直到再遇到另一条遇到另一条.text、.data或或.sect命令为止。命令为止。(2)子段)子
7、段:子段是大段中的小段,其命名的句子段是大段中的小段,其命名的句法为:法为:基段:子段名基段:子段名(3)段程序计数器()段程序计数器(SPC):SPC表示一个程序表示一个程序代码或数据在段内的当前地址。代码或数据在段内的当前地址。6 3.3.链接器对段的处理链接器对段的处理链接器在处理段的时候,有两个主要任务:链接器在处理段的时候,有两个主要任务:(1)(1)把一个或多个把一个或多个COFFCOFF目标文件中的各种段作为链接输目标文件中的各种段作为链接输入段,经链接后在一个可以执行的入段,经链接后在一个可以执行的COFFCOFF输出模块中建立各输出模块中建立各个输出段。个输出段。(2)(2)
8、为各个输出段选定存储器地址。为各个输出段选定存储器地址。链接器的默认分配算法链接器的默认分配算法:存储器起始地址为存储器起始地址为0 0;假定假定有有2 23232字的存储器可用来分配目标代码;字的存储器可用来分配目标代码;将将. .texttext分配到起分配到起始地址为始地址为0 0的程序存储器中;的程序存储器中;将将. .datadata分配到紧接着分配到紧接着. .texttext的程序存储器中;的程序存储器中;将将. .bssbss分配到紧接着分配到紧接着. .datadata的程序存储的程序存储器中;器中; 将自定义段分配到紧接着将自定义段分配到紧接着. .bssbss的程序存储器
9、中。的程序存储器中。链接器的自定义分配:用链接器的自定义分配:用MEMORYMEMORY和和SECTIONSSECTIONS命令,可以命令,可以按需要定义目标系统的存储器配置图,包括对存储器各部按需要定义目标系统的存储器配置图,包括对存储器各部分命名,以及规定它们的起始地址和长度。这需要建立分命名,以及规定它们的起始地址和长度。这需要建立一一个个* *. .CMDCMD连接命令连接命令文件文件 7*.*.CMDCMD连接命令连接命令文件举例:文件举例:- -c c/*ROM/*ROM初始化初始化* */ /- -o demo.outo demo.out/*/*产生产生demo.outdemo.
10、out可执行文件可执行文件* */ /- -m demo.mapm demo.map/*/*产生产生demo.outdemo.out映像文件映像文件* */ /- -lrts30.liblrts30.lib/*TMS320C30/*TMS320C30库函数库函数* */ /Demo.Demo.objobj/*/*链接的目标文件链接的目标文件* */ /MEMORYMEMORY/*/*配置内存资源(即按指定起始位置和长度分割内存块)配置内存资源(即按指定起始位置和长度分割内存块)* */ / VECS:origin=0x000000,length=0x40VECS:origin=0x000000
11、,length=0x40ROM:origin=0x000040,length=0xFC0ROM:origin=0x000040,length=0xFC0RAM0:origin=0x809800,length=0x400RAM0:origin=0x809800,length=0x400RAM1:origin=0x809C00,length=0x400RAM1:origin=0x809C00,length=0x400 SECTIONSSECTIONS/*/*指定存储器资源的分配,即为各个程序段(包括自动生成指定存储器资源的分配,即为各个程序段(包括自动生成的程序段,和的程序段,和. .OBJOBJ
12、文件中的程序段)分配内存资源文件中的程序段)分配内存资源* */ / vectors:vectors: load= load=vecsvecs/*/*自定义的自定义的vectorsvectors块分配至块分配至VECSVECS中中* */ /. .text: load=ROM text: load=ROM /*.text/*.text块分配至块分配至ROMROM中中* */ /. .data: load=RAM0data: load=RAM0/*.data/*.data块分配至块分配至ROMROM中中* */ /newvarsnewvars: load=RAM1: load=RAM1/* /*
13、 自定义的自定义的NewvarsNewvars块块分配至分配至RAM1RAM1中中* */ / 84.4.程序重定位程序重定位汇编器处理每个段都是从地址汇编器处理每个段都是从地址0 0开始,因此链接器必须通开始,因此链接器必须通过以下方法对各个段进行重新定位:过以下方法对各个段进行重新定位:(1 1)将各个段定位到存储器图中,这样一来每个段都从)将各个段定位到存储器图中,这样一来每个段都从一个恰当的地址开始。一个恰当的地址开始。 (2 2)将符号的数值调整到相对于新的段地址的数值。)将符号的数值调整到相对于新的段地址的数值。(3 3)调整对重新定位后符号的引用。)调整对重新定位后符号的引用。例
14、例: :产生重定位代码产生重定位代码1 1 . .refrefX X2 2 00000000 00000000.text.text3 3 00000000 60000000! 00000000 60000000!BR XBR X; ;产生一个重定位项产生一个重定位项X,XX,X的参考为外部参考的参考为外部参考( (用用! !表示表示) )4 00000001 082000024 00000001 08200002LDI Y,R0LDI Y,R0; ;产生一个重定产生一个重定位项位项Y,YY,Y的参考为内部定义的可重定位符号的参考为内部定义的可重定位符号( (用用表示表示) ) 5 000000
15、02 060000000 5 00000002 060000000 Y:IDLEY:IDLE假设假设X X重定位至地址重定位至地址100100H,.textH,.text块重定位至起始地址块重定位至起始地址200200H,H,则连接器利用这则连接器利用这2 2个重定位相在目标代码中补上这个重定位相在目标代码中补上这2 2个参考个参考: :6000000 6000000 BR X BR X 变为变为 6000010060000100 08200002 08200002 LDI Y,R0 LDI Y,R0 变为变为 082002020820020295.COFF文件中的符号文件中的符号COFF文件
16、中有一张符号表,用来存放程序中的符号信息。文件中有一张符号表,用来存放程序中的符号信息。链接时进行重新定位时要用到它,调试程序时也要用到它。链接时进行重新定位时要用到它,调试程序时也要用到它。外部符号外部符号:所谓外部符号,是在一个模块中定义、又可在另所谓外部符号,是在一个模块中定义、又可在另一个模块中引用的符号。可以用一个模块中引用的符号。可以用.def、.ref或或.global命令来指命令来指出外部符号:出外部符号:.def在当前模块中定义,并可在别的模块中使用的符在当前模块中定义,并可在别的模块中使用的符号号.ref在当前模块中使用,但在别的模块中定义的符号在当前模块中使用,但在别的模
17、块中定义的符号.global可以是上面的随便哪一种情况可以是上面的随便哪一种情况库文件:库文件:库文件(库文件(Lib)的结构就是的结构就是“一堆一堆”目标文件目标文件的集合。把目标文件做成库以后,在使用目标文件中所实现的的集合。把目标文件做成库以后,在使用目标文件中所实现的功能时,连接程序会自动在库文件里查找相应的目标文件,并功能时,连接程序会自动在库文件里查找相应的目标文件,并使用它。这大大减少了对目标文件的管理工作,减轻了代码重使用它。这大大减少了对目标文件的管理工作,减轻了代码重用的负担。用的负担。Lib文件中的节:文件中的节:Lib格式有四种类型的节(格式有四种类型的节(Sectio
18、n),),即即FirstSec,SecondSec,LongnameSec和和ObjSec;其中其中SecondSec与与LongnameSec是可选节。是可选节。FirstSec是第一个节。它包含是第一个节。它包含了库中所有的符号名以及这些符号所在的目标文件在库中的位了库中所有的符号名以及这些符号所在的目标文件在库中的位置(绝对偏移)。置(绝对偏移)。SecondSec就是第二节。它的内容和就是第二节。它的内容和FirstSec是相同的。不同的是,是相同的。不同的是,SecondSec是一个有序表,通过它来查是一个有序表,通过它来查找库中的符号比通过找库中的符号比通过FirstSec来查找要
19、快很多。来查找要快很多。106.1.3 6.1.3 COFFCOFF格式编程举例格式编程举例;文件名:demo.asm.data;汇编至.data块Coeff.word011h,022h,033h.bssvar1,1;在.bss块为var1.bssbuffer,10变量保存1个字的空间ptr.word0123h;汇编至.data块.text;汇编至.text块add: LDI10,AR1LDI0,R1Aloop:ADDI*AR0+,R1DBNZAR1,ALOOPSTIR1,var1.data;汇编至.data块ivals.word0aah,0bbh,0cchvar2.usect“newvars
20、”,1;自定义一个数据块inbuf.usect“newvars”,7.text;汇编至.text块mpy: LDI10,AR1LDI0,R1Mloop:MPYI*AR0+,R1DBNZAR1,mloopSTIR1,var2.sect“vectors”;为中断矢量定义一个块.wordadd,mpy汇编后得到目标文件中汇编后得到目标文件中共共5 5个模块个模块: :. .text text 包含包含2 2段程序代码段程序代码, ,共共1010个字个字; ;. .data data 包含包含7 7个初始化的个初始化的数据字数据字; ;. .vectors vectors 自定义块自定义块, ,包包含
21、含2 2个初始化的数据字个初始化的数据字; ;. .bssbss 在存储器中保留在存储器中保留1111个字空间个字空间; ;. .newvarsnewvars 自定义块自定义块, ,在在存储器中保留存储器中保留8 8个字空间个字空间; ;116.1.46.1.4DSPDSP芯片的开发工具介绍芯片的开发工具介绍C C编译器编译器( (C compiler)C compiler) 产生汇编语言源代码。产生汇编语言源代码。汇汇编编器器( (assembler)assembler)把把汇汇编编语语言言源源文文件件翻翻译译成成机机器器语语言言目目标标文文件件,机器语言格式为公用目标格式(机器语言格式为公
22、用目标格式(COFFCOFF)。)。连接器连接器( (linker)linker)把多个目标文件组合成单个可执行目标模块。把多个目标文件组合成单个可执行目标模块。归档器(归档器(archiverarchiver)把一组文件收集到一个归档文件中。把一组文件收集到一个归档文件中。助助记记符符到到代代数数汇汇编编语语言言转转换换公公用用程程序序(mnimonicmnimonic_to_to_algebricalgebric assembly assembly translator translator utilityutility)把把含含有有助助记记符符指指令令的的汇汇编编语语言言源源文文件件转换
23、成含有代数指令的汇编语言源文件。转换成含有代数指令的汇编语言源文件。运运行行支支持持库库( (run_time_support run_time_support libraries)libraries) 包包括括C C编编译译器器所所支支持持的的ANSIANSI标标准准运运行行支支持持函函数数、编编译译器器公公用用程程序序函函数数、浮浮点点运运算算函函数数和和C C编编译译器器支支持持的的I/OI/O函函数数。可可以以利利用用建建库库程程序序(library_build library_build utilityutility)建建立满足你自己要求的立满足你自己要求的“运行支持库运行支持库”。
24、十十六六进进制制转转换换公公用用程程序序( (hex hex conversion conversion utility)utility) 把把COFFCOFF目目标标文文件件 转转 换换 成成 TI-TaggedTI-Tagged、 ASCII-hexASCII-hex、 IntelIntel、 Motorola-SMotorola-S、 或或 Tektronix Tektronix 等目标格式。等目标格式。交交叉叉引引用用列列表表器器(cross_reference cross_reference listerlister)用用目目标标文文件件产产生生参参照照列表文件,可显示符号及其定义,
25、以及符号所在的源文件。列表文件,可显示符号及其定义,以及符号所在的源文件。绝绝对对列列表表器器(absolute absolute listerlister)输输入入目目标标文文件件,输输出出. .absabs文文件件,通过汇编通过汇编. .absabs文件可产生含有绝对地址的列表文件。文件可产生含有绝对地址的列表文件。126.26.2 DSPDSP软件集成开发平台软件集成开发平台CCSCCS6.2.16.2.1CCSCCS的基本特征和安装设置的基本特征和安装设置TITI公司提供的高效的公司提供的高效的C C编译器和集成开发环境编译器和集成开发环境CCSCCS(Code Code Compos
26、er StudioComposer Studio)是用来开发是用来开发DSPDSP程序的套装软件,它提供一程序的套装软件,它提供一个完整的个完整的集成开发环境集成开发环境IDEIDE(IntergratedIntergrated Development Development EnvironmentEnvironment), , 允许编辑、编译和调试允许编辑、编译和调试DSPDSP目标程序。目标程序。 1.1.仿真器仿真器仿真电缆MPSD电 缆 插座MPSD方式JTAG方式JTAG电缆插座JTAGMPSD仿真盒底视132.CCSCCS的安装设置(以的安装设置(以TMS320VC33TMS320
27、VC33为例)为例)(1 1)安装)安装Code ComposerCode Composer:执行执行 CCSSetup.exeCCSSetup.exe(2 2)完成后在仿真器下安装驱动程序仿真器下安装驱动程序: :运行运行Setup Setup CC3x4x.exeCC3x4x.exe(3 3)安装安装sdgovc3x.sdgovc3x.dvrdvr( (运行运行cc33updcc33upd文件文件) )并安装相应的驱并安装相应的驱动程序,这样就安装好了仿真系统。动程序,这样就安装好了仿真系统。3.驱动程序的配置驱动程序的配置(1)双双击击桌桌面面上上的的Setup CC,出现后图出现后图.
28、(2)按安装向导步骤配置按安装向导步骤配置:点点击击光光标标处处Install a Devicedriver在在弹弹出出的的对对话话框框中中选选择择要安装的要安装的XX.dvr打开打开确定确定14154.4. 驱动程序的驱动程序的端口设置端口设置双击双击XX.XX.dvrdvr 弹出右图弹出右图按按boardproperties弹出下左弹出下左图图:修改端口修改端口按按processorconfiguration卡卡弹出下右图弹出下右图:选择处理器选择处理器Finish165. 5. 默认目录和文件类型默认目录和文件类型(1)(1)目录目录o bin. o bin. 各种应用程序各种应用程序o
29、 bios. DSP/BIOS APIo bios. DSP/BIOS API的程序编译时使用的文件的程序编译时使用的文件o o cgtoolscgtools. Texas instruments. Texas instruments源代码生成工具源代码生成工具o examples. o examples. 源程序实例源程序实例o o rtdxrtdx. .RTDXRTDX文件文件o tutorial. o tutorial. 本手册中使用的实例文件本手册中使用的实例文件o ccbin. o ccbin. 关于关于CCSCCS环境的文件环境的文件o ccgel. o ccgel. 与与CCSC
30、CS一起使用的一起使用的GELGEL文件文件o docs. PDSo docs. PDS格式的文件和指南格式的文件和指南o o myprojectsmyprojects. . 用户文件夹用户文件夹(2)(2)常用文件类型常用文件类型o project.o project.makmak.CCS.CCS使用的工程文件使用的工程文件o program.c.Co program.c.C程序源文件程序源文件o program.o program.asmasm. . 汇编程序源文件汇编程序源文件o filename.h.Co filename.h.C程序的头文件,包含程序的头文件,包含DSP/BIOS A
31、PIDSP/BIOS API模块的头文模块的头文件件o filename.lib.o filename.lib.库文件库文件o project.o project.cmdcmd. .连接命令文件连接命令文件o program.o program.objobj. .由源文件编译或汇编而得的目标文件由源文件编译或汇编而得的目标文件o program.out.o program.out.(经完整的编译、汇编以及连接的)可执行文经完整的编译、汇编以及连接的)可执行文件件176.2.2 6.2.2 CCSCCS集成环境集成环境1.1.CCSCCS集成环境集成环境(1)(1)启动启动CCS:CCS:执行执
32、行CC_3x4x,CC_3x4x,进入界面如下图进入界面如下图. .18(2)菜单File19Edit20View21Project22Debug23Profiler24Option25Gel(通用扩展语言通用扩展语言)Tools26(3)(3)工具栏工具栏CCSCCS提供提供5 5种工具栏种工具栏: :Standard ToolbarStandard Toolbar;GEL ToolbarGEL Toolbar;Project ToolbarProject Toolbar;Debug ToolbarDebug Toolbar;Edit ToolbarEdit Toolbar。Standard
33、ToolbarGELToolbarDebugToolbarProjectToolbarEditToolbar272.2.程序开发过程程序开发过程(1)(1)打打开开CCSCCS仿仿真真环环境境新新建建一一个个工工程程(会会生生成成一一个个* *. .makmak的的工工程程文文件件): :ProjectProjectNewNew 。(2)(2)把把 程程 序序 文文 件件 加加 入入 到到 工工 程程 中中: :ProjectProjectAdd Add Files Files to to ProjectProject。工工程程文文件件中中包包括括C C源源程程序序*.*.c c 、汇汇编编源
34、源程程序序*.*.asmasm 、. .objobj目目标标文文件件、. .liblib库库文文件件、连连接接命命令令文文件件*.*.cmdcmd、包包含含文文件件*.*.h h 、配置文件配置文件*.*.cdbcdb。(3)(3)新建一个新建一个* *. .CMDCMD文件。文件。* *. .CMDCMD文文件为程序的命令文件,负责为件为程序的命令文件,负责为CSSCSS工程工程分配内存和联接各个分配内存和联接各个OBJOBJ文件。绝对要文件。绝对要避免对非法地址的分配和操作,否则,避免对非法地址的分配和操作,否则,后边的工程根本没有办法运行。后边的工程根本没有办法运行。(4)(4)汇编器和
35、连接器选项设置汇编器和连接器选项设置工程视窗28编译器、汇编器常用选项(在Compiler中)2930链接器常用选项(在Linker中)31323.3.使用断点使用断点当需要在程序执行过程中检查变量的值当需要在程序执行过程中检查变量的值, ,可用断点和观察可用断点和观察窗口来观察。程序执行到断点后,还可以使用单步执行窗口来观察。程序执行到断点后,还可以使用单步执行命令。命令。(1)(1)选择选择FileReload Program.FileReload Program.(2)(2)把光标放到设置断点的程序行上把光标放到设置断点的程序行上(3)(3)点击工具栏按钮或按点击工具栏按钮或按F9F9,
36、该行显示为高亮紫红色。该行显示为高亮紫红色。(如果愿意的话,可通过(如果愿意的话,可通过OptionColorOptionColor改变颜色。)改变颜色。)(4)(4)选择选择DebugDebugRunRun或按或按F5F5。 (5)CCS(5)CCS提供提供的的stepstep命令:命令:Step Into (F2) Step Into (F2) Step over (F10) Step over (F10) Step Out (Shift F7) Step Out (Shift F7) Run to Cursor (Ctrl F10) Run to Cursor (Ctrl F10) (6
37、)(6)选择选择DebugDebugBreakpoitsBreakpoits。在在Breakpoints tabBreakpoints tab中中点击点击Delete AllDelete All,然后点击然后点击OKOK,全部断点都被清除。全部断点都被清除。334.4.使用观察窗口观察使用观察窗口观察structurestructure变量变量(1)(1)选择选择ViewViewWatch WindowWatch Window。CCSCCS窗口右下角会出现一个窗口右下角会出现一个独立区域,在程序运行时,独立区域,在程序运行时,观察窗除了观察简单变量的值以外,观察窗除了观察简单变量的值以外,还可
38、观察结构中各元素元素的值。还可观察结构中各元素元素的值。(2)(2)在在watch Windowwatch Window区域中点击鼠标右键,并从弹出表中选区域中点击鼠标右键,并从弹出表中选择择Insert New ExpressionInsert New Expression。(3)(3)键入键入strstr 作为表达式并点击作为表达式并点击OKOK。显示着显示着+ +strstr=的一的一行出现在行出现在Watch WindowWatch Window中。中。+ +符号表示这是一个结构。符号表示这是一个结构。点击符号。点击符号。CCSCCS展开这一行,列出该结构的所有元素以及展开这一行,列出
39、该结构的所有元素以及它们的值。它们的值。双击结构中的任意元素就可打开该元素的双击结构中的任意元素就可打开该元素的Edit VariableEdit Variable窗窗口口, ,改变变量的值并点击改变变量的值并点击OKOK。(4)(4)键入表达式键入表达式 * * ,并点击并点击OKOK。( (注意注意: :变变量被列在量被列在Watch windowWatch window中,但由于程序当前并未执行到该变量的中,但由于程序当前并未执行到该变量的mainmain()()函数,因此没有定义。函数,因此没有定义。) )(5)(5)选择选择DebugRunDebugRun或按或按F5F5。程序运行程
40、序运行, ,在断点处在断点处Watch Watch WindowWindow中显示被观察变量的值。中显示被观察变量的值。345.5.探点的设置及从探点的设置及从PCPC机文件中读取数据机文件中读取数据(1)将光标放在程序的)将光标放在程序的某某一行上。一行上。(2)单击鼠标,该行旁边蓝色标志表示设置了一个探点。)单击鼠标,该行旁边蓝色标志表示设置了一个探点。(3)在)在File菜单中选择菜单中选择File I/O,打开打开File I/O对话框。点击对话框。点击File Input标签,然后单击标签,然后单击Add File按钮。按钮。 (4)在弹出的框中选择文件后,单击)在弹出的框中选择文件
41、后,单击Open按钮,出现该按钮,出现该文件的控制窗口,可以在运行程序时使用这个窗口来控制数据文件的控制窗口,可以在运行程序时使用这个窗口来控制数据文件的开始、停止、前进、后退等操作。文件的开始、停止、前进、后退等操作。(5)在)在File I/O对话框中,在对话框中,在Address域中填入域中填入inp_buffer,在在Length域中填入域中填入100,同时选中,同时选中Wrap Around复选框。复选框。(6)在)在FileI/O对话框中单击对话框中单击AddProbePoint按钮,弹出按钮,弹出Break/ProbePoints对话框,如后图所示。对话框,如后图所示。(7)在)
42、在Connect域,单击下拉箭头,并从列表中选择域,单击下拉箭头,并从列表中选择某文某文件件。(8)单击单击Replace按钮,按钮,Probe Point列表指示列表指示Probe Point已与已与该该文件相关联。文件相关联。(9)单击)单击“确定确定”按钮。注意,按钮。注意,File I/O对话框对话框Probel栏已栏已变为变为Connected,表示文件已连至一个探点。表示文件已连至一个探点。(10)单击)单击“确定确定”按钮,关闭按钮,关闭File I/O对话框。对话框。35366.静态静态图形显示图形显示(1)选择菜单)选择菜单ViewGraphTime/Frequency,弹出
43、弹出Graph Property(图形属性)对话框。图形属性)对话框。(2)在)在Graph Property对话框中更改图形的标题、对话框中更改图形的标题、起始地址、缓冲区大小、显示数据大小、起始地址、缓冲区大小、显示数据大小、DSP数据类数据类型、自动标尺属性及最大型、自动标尺属性及最大Y值,如图所示。值,如图所示。(3)单击)单击OK按钮,将出现按钮,将出现Input图形窗口。在图图形窗口。在图形窗口中右击,从弹出菜单中选择形窗口中右击,从弹出菜单中选择Clear Display,清清除已有显示波形。除已有显示波形。(4)再次执行菜单命令)再次执行菜单命令ViewGraphTime /F
44、requency。这次将这次将Graph Title改为改为output,开始地开始地址栏改为址栏改为out_buffer。其他设置不变。其他设置不变。(5)单击)单击OK按钮,出现一个显示按钮,出现一个显示out_buffer波形波形的图形窗口,同样单击右键,从弹出菜单中选的图形窗口,同样单击右键,从弹出菜单中选Clear Display,清除已有显示波形。清除已有显示波形。37387. 动态图形显示动态图形显示(1)在在Volume.c窗窗口口,将将光光标标放放在在调调用用某某行上。行上。(2)在)在行行设置断点。设置断点。(3)在在Debug工工具具栏栏中中单单击击Animate按按钮钮
45、或或按按F12键键398. 8. 函数执行时间分析函数执行时间分析(1)选选择择菜菜单单命命令令FileReload Program,重重新新加加载载程程序序Volume1.out 。(2)选选择择菜菜单单命命令令ProfilerStart New Session,在在打打开开的的对话框框中中输入入Volume1_profile作作为为代代码码分分析析统统计计观观察察窗窗口口的的名名称称,然然后后单单击击OK按按钮钮,则则打打开开分分析析(Profiler)窗窗口口,单单击击Functions标签,如图标签,如图6-22所示。所示。 (3)在工程视图中双击)在工程视图中双击volume.c以显
46、示文件内容。以显示文件内容。(4)程程序序运运行行约约1分分钟钟后后停停止止,看看到到如如图图6-23所所示示的的分分析析结果。结果。40分析窗口的Functions标签函数执行时间分析结果419. 某段程序执行时间分析某段程序执行时间分析1)在分析窗口中单击)在分析窗口中单击Ranges标签,在工程视标签,在工程视图中双击图中双击程序名程序名以在右框显示源程序。以在右框显示源程序。(2)将)将一段程序一段程序行高亮显示并拖曳至分析窗口。行高亮显示并拖曳至分析窗口。(3)选择菜单命令)选择菜单命令ViewDisassembly以打以打开开disassembly窗口,在窗口,在disassemb
47、ly窗口中右击,窗口中右击,选择选择Start Address,然后输入然后输入c_int00作为起始地作为起始地址。址。(4)在)在disassembly窗口将窗口将c_int00下面的下面的4行行拖曳到分析窗口,如图所示。拖曳到分析窗口,如图所示。(5)选择菜单命令)选择菜单命令DebugRestart.,然后选然后选择择DebugRun。程序运行约程序运行约1分钟后停止,看到分钟后停止,看到如图所示的分析结果。如图所示的分析结果。42分析窗口的Ranges标签某段程序执行时间分析结果436.2.3 6.2.3 DSP/BIOS DSP/BIOS 插件插件在软件开发周期的分析阶段,调试依赖
48、于时间的例程时,在软件开发周期的分析阶段,调试依赖于时间的例程时,传统调试方法效率低下。传统调试方法效率低下。DSP/BIOSDSP/BIOS插件支持实时分析,可用于插件支持实时分析,可用于探测、跟踪和监视具有实时性要求的应用例程,下图显示了一探测、跟踪和监视具有实时性要求的应用例程,下图显示了一个执行了多个线程的应用例程时序。个执行了多个线程的应用例程时序。 DSP/BIOS API DSP/BIOS API 具有下列实时分析功能:具有下列实时分析功能:oo程序跟踪(程序跟踪(Program tracingProgram tracing)显示写入目标系统日志显示写入目标系统日志(target
49、 logtarget log)的事件,反映程序执行过程中的动态控制流。的事件,反映程序执行过程中的动态控制流。o o性能监视(性能监视(Performance monitoringPerformance monitoring)跟踪反映目标系跟踪反映目标系统资源利用情况的统计表,诸如处理器负荷和线程时序。统资源利用情况的统计表,诸如处理器负荷和线程时序。o o文件流(文件流(File streamingFile streaming)把目标系统的把目标系统的I/OI/O对象和主机对象和主机文件联系在一起。文件联系在一起。DSP/BIOS DSP/BIOS 也提供基于优先权的调度函数,它支持函数和也
50、提供基于优先权的调度函数,它支持函数和多优先权线程的周期性执行。多优先权线程的周期性执行。 441.1.DSP/BIOS DSP/BIOS 配置配置在在CCSCCS环境中,可以利用环境中,可以利用DSP/BIOS APIDSP/BIOS API定义的对象创建配置定义的对象创建配置文件,这类文件简化了存储器映象和硬件文件,这类文件简化了存储器映象和硬件ISRISR矢量映象,所以,矢量映象,所以,即使不使用即使不使用DSP/BIOS API DSP/BIOS API 时,也可以使用配置文件。时,也可以使用配置文件。配置文件有两个任务:配置文件有两个任务:o o 设置全局运行参数。设置全局运行参数。
51、o o 可视化创建和设置运行对象属性,这些运行对象可视化创建和设置运行对象属性,这些运行对象由目标系统应用程序的由目标系统应用程序的DSP/BIOS APIDSP/BIOS API函数调用,它们包括软中函数调用,它们包括软中断,断,I/OI/O管道和事件日志。管道和事件日志。DSP/BIOSDSP/BIOS对象是静态配置的,并限制在可执行程序空间范对象是静态配置的,并限制在可执行程序空间范围内,而运行时创建对象的围内,而运行时创建对象的APIAPI调用需要目标系统额外的开销调用需要目标系统额外的开销(尤其是代码空间)。静态配置策略通过去除运行代码能够使(尤其是代码空间)。静态配置策略通过去除运
52、行代码能够使目标程序存储空间最小化,能够优化内部数据结构,在程序执目标程序存储空间最小化,能够优化内部数据结构,在程序执行之前能够通过确认对象所有权来及早地检测出错误。行之前能够通过确认对象所有权来及早地检测出错误。保存配置文件时将产生若干个与应用程序联系在一起的文保存配置文件时将产生若干个与应用程序联系在一起的文件件:.1:.1个个CMDCMD文件文件,1,1个头文件个头文件,1,1个汇编源文件个汇编源文件. .45 2. 2. DSP/BIOS API DSP/BIOS API 模块模块 传统调试(传统调试(debugingdebuging)相对于正在执行的程序而相对于正在执行的程序而言是
53、外部的,而言是外部的,而DSP/BIOS APIDSP/BIOS API要求将目标系统程序和要求将目标系统程序和特定的特定的DSP/BIOS APIDSP/BIOS API模块连接在一起。通过在配置文模块连接在一起。通过在配置文件中定义件中定义DSP/BIOSDSP/BIOS对象,一个应用程序可以使用一个对象,一个应用程序可以使用一个或多个或多个DSP/BIOSDSP/BIOS模块。在源代码中,这些对象声明为模块。在源代码中,这些对象声明为外部的,并调用外部的,并调用DSP/BIOS APIDSP/BIOS API功能。功能。 每个每个DSP/BIOSDSP/BIOS模块都有一个单独的模块都有
54、一个单独的C C头文件或汇头文件或汇编宏文件,它们可以包含在应用程序源文件中,这样编宏文件,它们可以包含在应用程序源文件中,这样能够使应用程序代码最小化。能够使应用程序代码最小化。 为了尽量少地占用目标系统资源,必须优化(为了尽量少地占用目标系统资源,必须优化(C C和汇编源程序)和汇编源程序)DSP/BIOS APIDSP/BIOS API调用。调用。DSP/BIOS APIDSP/BIOS API划分为下列模块,模块内的任何划分为下列模块,模块内的任何APIAPI调用均以下述代码开头。调用均以下述代码开头。 46o o CLKCLK 片内定时器模块片内定时器模块, ,控制片内定时器并提供控
55、制片内定时器并提供1 1个个3232位实时逻位实时逻辑时钟,它能够控制中断的速度,使之快则可达单指令周期时间,辑时钟,它能够控制中断的速度,使之快则可达单指令周期时间,慢则需若干毫秒或更长时间。慢则需若干毫秒或更长时间。o o HST HST 主机输入主机输入/ /输出模块输出模块, ,管理主机通道对象,使应用程序在管理主机通道对象,使应用程序在目标系统和主机之间交流数据。主机通道通过静态配置为输入或输目标系统和主机之间交流数据。主机通道通过静态配置为输入或输出。出。o o HWI HWI 硬件中断模块硬件中断模块, ,提供对硬件中断服务例程的支持,可在配提供对硬件中断服务例程的支持,可在配置
56、文件中指定当硬件中断发生时需要运行的函数。置文件中指定当硬件中断发生时需要运行的函数。o o IDL IDL 空闲函数模块空闲函数模块, ,管理空闲状态函数,在目标系统程序没有管理空闲状态函数,在目标系统程序没有更高优先权的程序运行时更高优先权的程序运行时, ,DSPDSP处于空闲状态。处于空闲状态。o o LOG LOG 日志模块日志模块, ,管理管理LOGLOG对象,在目标系统程序执行时实时捕对象,在目标系统程序执行时实时捕捉事件。开发者可以使用系统日志或定义自己的日志,在捉事件。开发者可以使用系统日志或定义自己的日志,在CCSCCS中实中实时观察这些日志。时观察这些日志。o o MEM
57、MEM 存储器模块存储器模块, ,允许指定存放目标程序的代码和数据所需的允许指定存放目标程序的代码和数据所需的存储器段。存储器段。o o PIP PIP 数据通道模块数据通道模块, ,管理数据通道,它被用来缓存输入和输出管理数据通道,它被用来缓存输入和输出数据流。这些数据通道提供一致的软件数据结构,可以使用它们驱数据流。这些数据通道提供一致的软件数据结构,可以使用它们驱动动DSPDSP和其它实时外围设备之间的和其它实时外围设备之间的I/OI/O通道。通道。47o o PRD PRD 周期函数模块周期函数模块, ,管理周期对象,它触发应管理周期对象,它触发应用程序的周期性执行。周期对象的执行速率
58、可由时钟模块用程序的周期性执行。周期对象的执行速率可由时钟模块控制或控制或PRDPRDticktick的规则调用来管理,而这些函数的周期性的规则调用来管理,而这些函数的周期性执行通常是为了响应发送或接收数据流的外围设备的硬件执行通常是为了响应发送或接收数据流的外围设备的硬件中断。中断。o o RTDX RTDX 实时数据交换模块实时数据交换模块, ,允许数据在主机和允许数据在主机和目标系统之间实时交换,在主机上使用自动目标系统之间实时交换,在主机上使用自动OLEOLE的客户都可的客户都可对数据进行实时显示和分析。对数据进行实时显示和分析。o o STS STS 统计模块统计模块, ,管理统计累
59、积器,在程序运行管理统计累积器,在程序运行时,它存储关键统计数据并能通过时,它存储关键统计数据并能通过CCSCCS浏览这些统计数据。浏览这些统计数据。o o SWI SWI 软件中断软件中断模模, ,块管理软件中断。当目标程块管理软件中断。当目标程序通过序通过APIAPI调用发送调用发送SWISWI对象时,对象时,SWISWI模块安排相应函数的执模块安排相应函数的执行。软件中断可以有高达行。软件中断可以有高达1515级的优先级,但这些优先级都级的优先级,但这些优先级都低于硬件中断的优先级。低于硬件中断的优先级。oo TRC TRC 跟踪模块跟踪模块, ,管理一组跟踪控制位,它们通管理一组跟踪控
60、制位,它们通过事件日志和统计累积器控制实时捕捉程序信息。如果不过事件日志和统计累积器控制实时捕捉程序信息。如果不存在存在TRCTRC对象,则在配置文件中就无跟踪模块。对象,则在配置文件中就无跟踪模块。483.3.硬件仿真和实时数据交换硬件仿真和实时数据交换( (RTDX)RTDX)TI TI DSPsDSPs提供在片仿真支持,它使得提供在片仿真支持,它使得CCSCCS能够控制程序的执行,实能够控制程序的执行,实时监视程序运行。增强型时监视程序运行。增强型JTAGJTAG连接提供了对在片仿真的支持,它是一连接提供了对在片仿真的支持,它是一种可与任意种可与任意DSPDSP系统相连的低侵扰式的连接。
61、仿真接口提供主机一侧系统相连的低侵扰式的连接。仿真接口提供主机一侧的的JTAGJTAG连接,评估板提供在板连接,评估板提供在板JTAGJTAG仿真接口。仿真接口。片上仿真硬件提供多种功能:片上仿真硬件提供多种功能:o DSPo DSP的启动、停止或复位功能的启动、停止或复位功能o o 向向DSPDSP下载代码或数据下载代码或数据o o 检查检查DSPDSP的寄存器或存储器的寄存器或存储器o o 硬件指令或数据相关的断点硬件指令或数据相关的断点o o 包括指令周期的精确计算在内的多种记数能力包括指令周期的精确计算在内的多种记数能力o o 主机和主机和DSPDSP之间的实时数据交换(之间的实时数据
62、交换(RTDXRTDX)CCSCCS提供在片能力的嵌入式支持;另外,提供在片能力的嵌入式支持;另外,RTDXRTDX通过主机和通过主机和DSPDSPAPIsAPIs提供主机和提供主机和DSPDSP之间的双向实时数据交换,它能够使开发者实时之间的双向实时数据交换,它能够使开发者实时连续地观察到连续地观察到DSPDSP应用的实际工作方式。应用的实际工作方式。49RTDXRTDX由目标系统和主机两部分组成。小的由目标系统和主机两部分组成。小的RTDXRTDX库函数在目标系统库函数在目标系统DSPDSP上运行。开发者通过调用上运行。开发者通过调用RTDXRTDX软件库的软件库的APIAPI函数将数据输
63、入或输函数将数据输入或输出目标系统的出目标系统的DSPDSP,库函数通过在片仿真硬件和增强型库函数通过在片仿真硬件和增强型JTAGJTAG接口将数接口将数据输入或输出主机平台,数据在据输入或输出主机平台,数据在DSPDSP应用程序运行时实时传送给主机。应用程序运行时实时传送给主机。在主机平台上,在主机平台上,RTDXRTDX库函数与库函数与CCSCCS一道协同工作。显示和分析工一道协同工作。显示和分析工具可以通过具可以通过COM APICOM API与与RTDXRTDX通信,从而获取目标系统数据,或将数据通信,从而获取目标系统数据,或将数据发送给发送给DSPDSP应用例程。开发者可以使用标准的
64、显示软件包,诸如应用例程。开发者可以使用标准的显示软件包,诸如National Instruments National Instruments LabVIEWLabVIEW,Quinn-Curtis Real-Time Quinn-Curtis Real-Time Graphics ToolsGraphics Tools,或或Microsoft ExcelMicrosoft Excel。同时,开发者也可研制他们同时,开发者也可研制他们自己的自己的Visual BasicVisual Basic或或Visual C+Visual C+应用程序。应用程序。RTDXRTDX适合于各种控制、伺服和音
65、频应用。例如,无线电通信产品适合于各种控制、伺服和音频应用。例如,无线电通信产品可以通过可以通过RTDXRTDX捕捉语音合成算法的输出以检验语音应用程序的执行捕捉语音合成算法的输出以检验语音应用程序的执行情况;嵌入式系统也可从情况;嵌入式系统也可从RTDXRTDX获益;硬磁盘驱动设计者可以利用获益;硬磁盘驱动设计者可以利用RTDXRTDX测试他们的应用软件,不会因不正确的信号加到伺服马达上而测试他们的应用软件,不会因不正确的信号加到伺服马达上而与驱动发生冲突;引擎控制器设计者可以利用与驱动发生冲突;引擎控制器设计者可以利用RTDXRTDX在控制程序运行在控制程序运行的同时分析随环境条件而变化的
66、系数。对于这些应用,用户都可以的同时分析随环境条件而变化的系数。对于这些应用,用户都可以使用可视化工具,而且可以根据需要选择信息显示方式。未来的使用可视化工具,而且可以根据需要选择信息显示方式。未来的 TI TI DSPsDSPs 将增加将增加RTDXRTDX的带宽,为更多的应用提供更强的系统可视性。的带宽,为更多的应用提供更强的系统可视性。506.2.4GEL语言的使用通用扩展语言通用扩展语言GEL GEL (General Extension General Extension LauguageLauguage) 是是C C语语言的一个子集,它可以用来扩展言的一个子集,它可以用来扩展CCS
67、CCS的功能。用户编写的的功能。用户编写的GELGEL函数函数可以载可以载到到CCSCCS中执行。利用中执行。利用GELGEL语言,可以访问目标板存储器空间,语言,可以访问目标板存储器空间,给给CCSCCS添加额外的菜单等。添加额外的菜单等。GELGEL特别适合于自动测试和定制用户工特别适合于自动测试和定制用户工作空间。用户可以在任何可以输入表达式的地方调用作空间。用户可以在任何可以输入表达式的地方调用GELGEL函数,函数,也可以在观察窗口中添加也可以在观察窗口中添加GELGEL函数以便在每次遇到断点时自动执函数以便在每次遇到断点时自动执行行6.2.4.1 6.2.4.1 GELGEL语言组
68、成语言组成GELGEL语言支持以下几种类型的语句:函数定义、函数参数、语言支持以下几种类型的语句:函数定义、函数参数、调用调用GELGEL函数、返回语句、函数、返回语句、if-elseif-else语句、语句、while while 语句、语句、GELGEL注释、注释、预处理语句。预处理语句。1.1.GELGEL函数定义函数定义: :函数名函数名(参数参数,.),.) 语句语句 512.2.GELGEL函数参数函数参数GELGEL函数的参数无需定义参数类型,其类型由调用的实际参函数的参数无需定义参数类型,其类型由调用的实际参数所确定。数所确定。GELGEL函数可以是以下类型之一函数可以是以下类
69、型之一: :(1)(1)DSPDSP程序符号值程序符号值; ;(2)(2)数字常量数字常量(3)(3)字符串常量字符串常量例例: :定义和调用定义和调用GELGEL函数函数定义定义: :Initialize(a,filename,b)Initialize(a,filename,b) targVartargVar=b;=b;a=);a=);GEL_Load(filename);GEL_Load(filename);return b*b:return b*b: 调用调用: : Initialize(targetSymbol,”C:myfile.out”,23*5+2.Initialize(targ
70、etSymbol,”C:myfile.out”,23*5+2.6)6)当调用当调用GELGEL函数时函数时, ,DSPDSP程序符号程序符号targetSymboltargetSymbol传递给传递给a,a,字符字符串常量串常量”C:C:myfilemyfile.out”.out”传递给传递给filename,filename,数字常量数字常量23*5+2.623*5+2.6传递给传递给b b。传递的数据要合法,且类型和传递的数据要合法,且类型和GELGEL函数中使用要一致。函数中使用要一致。523.调用调用GELGEL函数函数可以在任何键入可以在任何键入C C表达式的地方调用表达式的地方调用
71、. .GELGEL语言支持以下语句语言支持以下语句: :(1)(1)return return 表达式表达式 (2)(2)if-elseif-else(3)while(3)while4. 4. 注释注释:/*.*/:/*.*/5. 5. 预处理语句预处理语句: #: #define define 是是GELGEL支持的唯一预处理语句支持的唯一预处理语句. .536.2.2.4 6.2.2.4 GEL GEL 语言使用语言使用1.1.GELGEL函数加函数加/ /卸载卸载加载加载: :File-Load Gel File-Load Gel 或或 工程视图窗的工程视图窗的Gel FilesGel
72、Files右键菜单右键菜单- - Load Load Gel Gel 卸载卸载: :双击工程视图窗的双击工程视图窗的Gel Files-Gel Files-对要卸载的对要卸载的Gel Gel 文件右键菜单文件右键菜单- -Remove from the menuRemove from the menu2.2.将将GELGEL函数添加到函数添加到GELGEL菜单菜单( (1)1)hotmenuhotmenu关键词关键词格式格式: : hotmenuhotmenu uncnameuncname()()statementsstatements将将GELGEL函数添加到函数添加到GELGEL菜单菜单,
73、 ,在菜单中选择时在菜单中选择时, ,该该GELGEL函数立即执行函数立即执行. .例例: :menuitemmenuitem “My Function” “My Function”hotmenuhotmenu InitargetInitarget()()*waitstatewaitstate=0x11;=0x11; hotmenuhotmenu LoadMyProgLoadMyProg()()GEL_Load(“C:GEL_Load(“C:mydirmydirmyfilemyfile.out”);.out”);以上以上GELGEL函数添加到函数添加到GELGEL菜单的步骤菜单的步骤: : 编
74、辑以上程序并存盘编辑以上程序并存盘 把该文件加载到把该文件加载到CCSCCS工程列表的工程列表的“GEL File”GEL File”目录下目录下. . 在在CCSCCS下运行该程序下运行该程序. .54(2)(2)dialog dialog 关键词关键词格式格式: : dialogdialog uncnameuncname( (参数参数1 “1 “参数参数1 1说明说明”, ,参数参数2 2 “参数参数2 2说明说明”,),) 语句语句该关键词将该关键词将GELGEL函数添加到函数添加到GELGEL菜单菜单, ,在菜单中选择在菜单中选择时时, ,将弹将弹出一个对话框窗口,提示输入参数。通过对
75、话框窗口出一个对话框窗口,提示输入参数。通过对话框窗口, ,最多可以最多可以向向GELGEL函数传递函数传递6 6个参数。个参数。例例: :menuitemmenuitem “My Function “My Function”;”; dialogdialog InitargetInitarget ( (StartAddressStartAddress “ “起始地址起始地址”, ,EndAddressEndAddress “ “结束地址结束地址”) ) statementsstatements dialogdialog LoadMyProgLoadMyProg()()statementssta
76、tements55(3)(3)sliderslider关键词关键词格式格式: : sliderslider paramparam_definition(_definition(minValminVal, ,maxValmaxVal,increment,increment,pageIncrepageIncrementment, ,paramNameparamName) )statementsstatements该关键词将该关键词将GELGEL函数添加到函数添加到GELGEL菜单菜单, ,在菜单中选择时在菜单中选择时, ,将出将出现滑动条对象,它控制传递给现滑动条对象,它控制传递给GELGEL函数
77、的参数值。参数值由滑函数的参数值。参数值由滑杆的位置决定,杆的位置决定, slider GELslider GEL函数共有函数共有5 5个参数。个参数。例例: :menuitemmenuitem “My Function”; “My Function”; sliderslider VolumecontrolVolumecontrol O,10,1,1,volume) O,10,1,1,volume) targVarVolumetargVarVolume=volume;=volume;此例将向此例将向GELGEL菜单添加一个菜单添加一个My FunctionMy Function子菜单子菜单,
78、,执行执行VolumecontrolVolumecontrol命令时命令时将出现滑动条将出现滑动条, ,当拖动滑动杆时修改的当拖动滑动杆时修改的是是volumevolume的值的值, ,同时同时DSPDSP程序中的程序中的targVarVolumetargVarVolume变量值会变量值会跟着变化跟着变化. .566.2.2.5 6.2.2.5 嵌入嵌入GEL GEL 函数函数CCSCCS提供一系列嵌入提供一系列嵌入GEL GEL 函数函数, ,使用它们使用它们, ,可以控制仿真可以控制仿真/ /实实际目标板的状态际目标板的状态,访问仿真访问仿真/ /实际目标板存储器实际目标板存储器, ,并在
79、输出窗口并在输出窗口中显示结果。中显示结果。嵌入嵌入GEL GEL 函数都以前缀函数都以前缀“GEL_”GEL_”标志标志, ,以和用户自定义函以和用户自定义函数区别。数区别。1.1.调试类调试类( (Debug)Debug)GEL_Animate()GEL_Animate()GEL_Go(address)GEL_Go(address)GEL_Run(“Condition”)GEL_Run(“Condition”)GEL_Halt()GEL_Halt()GEL_GEL_RunFRunF()()GEL_RestartGEL_Restart2.2.断点类断点类( (Breakpoint)Break
80、point)GEL_GEL_BreakPtAddBreakPtAdd(address,”Condition”)(address,”Condition”)GEL_ GEL_ BreakPtDelBreakPtDel(address)(address)GEL_ GEL_ BreakPtResetBreakPtReset()()573.窗口类GEL_GEL_OpenWindowsOpenWindows(“(“windowsNamewindowsName”,”,windowsTypewindowsType, ,maxLinesmaxLines) )GEL_ GEL_ CloseWindowsClose
81、Windows(“(“windowsNamewindowsName”)”)GEL_ GEL_ TextOutTextOut(“text”,“(“text”,“windowsNamewindowsName”,”,textColortextColor, ,lineNumberlineNumber, ,appenappendToEnddToEnd.param1,param2,param3,param4).param1,param2,param3,param4)GEL_GEL_TargetTextOutstartAddressTargetTextOutstartAddress,page,page,ma
82、xlengthmaxlength,format,”,format,”wiwindowsNamendowsName,text ,text CorlorCorlor, ,lineNumberlineNumber, ,appendToEndappendToEnd, ,changeHighlightchangeHighlight) )GEL_Exit()GEL_Exit()4.4.程序加载类程序加载类GEL_ Load(“GEL_ Load(“fileNamefileName”,”,”cpuNamecpuName”)”)GEL_ GEL_ SymbolLoadSymbolLoad(“(“fileNam
83、efileName”,”,”cpuNamecpuName”)”)5.5.存储器类存储器类GEL_GEL_MapDeleteMapDelete(address,page)(address,page)GEL_GEL_MapOnMapOn()()GEL_GEL_MapOffMapOff()()GEL_GEL_MemoryResetMemoryReset()()GEL_GEL_MemoryFillMemoryFill( (startAddressstartAddress,page,length,pattern),page,length,pattern)GEL_GEL_MemoryLoadMemoryL
84、oad( (startAddressstartAddress,page,length,”,page,length,”fileNamefileName”)”)GEL_ GEL_ MemorySaveMemorySave( (startAddressstartAddress,page,length,”,page,length,”fileNamefileName”)”)586.插入汇编代码类插入汇编代码类GEL_ GEL_ PatchAssemblyPatchAssembly( (startAddressstartAddress,page,” ,page,” PatchStringPatchStri
85、ng”)”)7.7.工程类工程类GEL_GEL_ProjectBuildProjectBuild()()GEL_GEL_ProjectLoadProjectLoad(“(“fileNamefileName”)”)GEL_GEL_ProjectRebuildAllProjectRebuildAll()()8.8.系统类系统类GEL_System(“GEL_System(“dosCommanddosCommand”,param1,param2,.param4)”,param1,param2,.param4)9.9.观察窗口类观察窗口类GEL_GEL_WatchAddWatchAdd(“expres
86、sion”,”label”)(“expression”,”label”)GEL_ GEL_ WatchDelWatchDel(“expression”)(“expression”)GEL_ GEL_ WatchResetWatchReset()()10.10.扩展存储器类扩展存储器类GEL_GEL_XMDefXMDef(Map,(Map,RegAddrRegAddr,Type,Start,Mask),Type,Start,Mask)GEL_GEL_XMOnXMOn()()59606.3 DSP应用系统的高级语言程序设计与调试6.3.1 6.3.1 开发一个简单的应用程序开发一个简单的应用程序建
87、立一个工程myhello(1)选择菜单项ProjectNew。(2)在SaveNewProjectAs窗口中选择你所建立的工作文件夹并点击Open。键入myhello作为文件名并点击Save,CCS就创建了myhello.mak的工程文件,它存储你的工程设置,并且提供对工程所使用的各种文件的引用。2.向工程添加文件(1)选择ProjectAddFilestoProject,选择hello.c并点击open(2)按方法(1)分别选择相关的Vectors.asm、hello.cmd、rts.lib等文件添加。613.查看源代码查看源代码双击ProjectView中的文件hello.c,可在窗口的右
88、半部看到源代码。/*=hello.c=*/#include#includehello.h#defineBUFSIZE30structPARMSstr=2934,9432,213,9432,&str;/*=main=*/voidmain()#ifdefFILEIOinti;charscanStrBUFSIZE;charfileStrBUFSIZE;size_treadSize;FILE*fptr;#endif/*writeastringtostdout*/puts(helloworld!n);#ifdefFILEIO/*clearchararrays*/for(i=0;iBUFSIZE;i+)s
89、canStri=0/*deliberatesyntaxerror*/fileStri=0;/*readastringfromstdin*/62scanf(%s,scanStr);/*openafileonthehostandwritechararray*/fptr=fopen(file.txt,w);fprintf(fptr,%s,scanStr);fclose(fptr);/*openafileonthehostandreadchararray*/fptr=fopen(file.txt,r);fseek(fptr,0L,SEEK_SET);readSize=fread(fileStr,siz
90、eof(char),BUFSIZE,fptr);printf(Reada%dbytechararray:%sn,readSize,fileStr);fclose(fptr);#endif633. 3. 编译和运行程序编译和运行程序(1) (1) 点击工具栏按钮或选择点击工具栏按钮或选择ProjectRebuild All ProjectRebuild All ,CCSCCS重新编译、汇编和连接工程中的所有文件,有关重新编译、汇编和连接工程中的所有文件,有关此过程的信息显示在窗口底部的信息框中。此过程的信息显示在窗口底部的信息框中。(2) (2) 选择选择FileLoad ProgramFile
91、Load Program,选择刚重新编译过选择刚重新编译过的程序的程序myhellomyhello.out.out并点击并点击OpenOpen。CCSCCS把程序加载到目把程序加载到目标系统标系统DSPDSP上,并打开上,并打开DisDis_Assembly_Assembly窗口,该窗口显示窗口,该窗口显示反汇编指令。(注意,反汇编指令。(注意,CCSCCS还会自动打开窗口底部一个还会自动打开窗口底部一个 标有标有StdoutStdout的区域的区域, ,该区域用以显示程序送往该区域用以显示程序送往StdoutStdout的的输出。)输出。)(3) (3) 点击工具栏按钮点击工具栏按钮 或选择
92、或选择DebugRunDebugRun。当运当运行程序时,可在行程序时,可在StdoutStdout窗口中看到窗口中看到hello worldhello world消息消息 644. 4. 修改程序选项和纠正语法修改程序选项和纠正语法错误错误当没有定义FILEIO,预处理器命令(#ifdef 和#endif)之间的程序没有运行。这里,使用CCS设置一个预处理器选项,并找出和纠正语法错误。(1)选择ProjectOptions。(2)从Build Option窗口的Compiler栏的Category列表中选择Symbles。在Define Symbles框中键入FILEIO并按Tab键。此时在
93、编译参数栏中看到-dFILEIO,即:编译命令包含-d选项,当你重新编译该程序时,程序中#ifdef FILEIO语句后的源代码就包含在内了65(3)点击OK保存新的选项设置。(4)点击RebuildAll工具按钮或选择ProjectRebuildAll。重新编译所有文件。(5)出现一条说明程序含有编译错误的消息,点击Cancel。在Buildtab区域移动滚动条,就可看到一条语法出错信息。双击描述语法错误位置的红色文字(hello.c源文件是打开的),光标会落在错误行上:fileStri=0(缺少分号)(6)修改语法错误。(7)保存修改后的文件,重新编译已被更新的文件。665. 5. 使用断
94、点和观察窗口使用断点和观察窗口(1)(1)把光标放到把光标放到hello.chello.c程序程序的的fprintffprintf( (fptrfptr, “%S”, , “%S”, scacStrscacStr););行上:点击工具栏按钮行上:点击工具栏按钮或按或按F9F9,该行显示为高亮紫红色。该行显示为高亮紫红色。(2)(2)选择选择ViewWatch WindowViewWatch Window。CCSCCS窗口的右下角会出现一个独立窗口的右下角会出现一个独立区域,在程序运行时,该区域将区域,在程序运行时,该区域将显示被观察变量的值。显示被观察变量的值。(3)(3)在在Watch Wi
95、ndowWatch Window区域中点区域中点击鼠标右键,从弹出的表中选择击鼠标右键,从弹出的表中选择Insert New ExpressionInsert New Expression。(4)(4)键入表达式键入表达式* *scanStrscanStr并点并点击击OKOK。(5)(5)选择选择DebugRunDebugRun或按或按F5F5。(6)(6)在相应提示下,键入在相应提示下,键入goodbyegoodbye并点击并点击OKOK。StdoutStdout框以蓝框以蓝色显示输入的文字。色显示输入的文字。Watch Watch WindowWindow中显示出中显示出* *scanSt
96、rscanStr的值。的值。 676.6.使用观察窗口观察使用观察窗口观察structurestructure变量变量观察窗除了观察简单变量的值以外,还可观察结构中各元素元素的值。(1)在watch Window区域中点击鼠标右键,并从弹出表中选择Insert New Expression。(2)键入str 作为表达式并点击OK。显示着+str=的一行出现在Watch Window中。+符号表示这是一个结构。类型为PARMS的结构被声明为全局变量,并在hello.c中初始化。结构类型在hello.h中定义。点击符号。CCS展开这一行,列出该结构的所有元素以及它们的值。(3)双击结构中的任意元素
97、就可打开该元素的Edit Variable窗口。(4)改变变量的值并点击OK。注意Watch Window中的值改变了,而且其颜色也相应变化,表明该值已被修改了。(5)在Watch Window中选择str变量并点击右键,从弹出表中选择Remove Cuurent Expression。在Watch Window中重复上述步骤。687. 7. 测算源代码执行统计测算源代码执行统计(1)(1)选选 择择 ProfilerEnable ProfilerEnable ClockClock。 标标 记记 “”“”出出 现现 在在ProfileProfile菜单菜单Enable ClockEnable
98、Clock项的旁边,使能计算指令周期。项的旁边,使能计算指令周期。(2) (2) 在在Project ViewProject View中双击文件中双击文件hello.c.hello.c.(3)(3)选选择择ViewMixed ViewMixed Source/ASMSource/ASM,灰灰色色的的汇汇编编指指令令紧紧随随在在C C源代码行后面。源代码行后面。(4)(4)将光标放在下述行上:将光标放在下述行上:puts(“hello world!n”);puts(“hello world!n”);(5)(5)点点击击工工具具栏栏按按钮钮 ( (Toggle Toggle Profile_poi
99、nt),Profile_point),该该C C源源代代码码行行和第一条汇编指令被用绿色加亮。和第一条汇编指令被用绿色加亮。(6) (6) 将光标放在将光标放在for (i = 0; iBUFSIZE;i+)for (i = 0; iBUFSIZE;i+)行上:行上:(7) (7) 点击工具栏按点击工具栏按钮或者在该代码行钮或者在该代码行上点击右键并从弹上点击右键并从弹出菜单中选择出菜单中选择Toggle Profile PtToggle Profile Pt。( (两个观测点两个观测点) )69(8)(8)选选择择ProfileView ProfileView StatisticsStati
100、stics,窗窗口口底底部部出出现现一一个个显显示示测测试点统计数据的区域。试点统计数据的区域。(9)(9)点点击击( (RUN)RUN)工工具具栏栏按按钮钮 或或按按F5F5键键运运行行该该程程序序并并在在提提示示窗窗口口中中键入一串字符。键入一串字符。(10) (10) 注注意意对对第第二二个个测测试试点点所所显显示示的的指指令令周周期期数数,它它应应该该大大约约为为28002800个个周周期期(显显示示的的实实际际数数目目可可能能会会变变化化),这这是是执执行行putsputs()()函函数数所所需需的的指指令令周周期期数数。由由于于这这些些指指令令只只执执行行了了一一次次,所所以平均值
101、、总数、最大值和最小值都是相同的。以平均值、总数、最大值和最小值都是相同的。 释放测试期间所占用的资源:释放测试期间所占用的资源: (1) (1)进入进入profilerprofiler菜单并撤消菜单并撤消 Enable ClockEnable Clock使能使能 (2)(2)点点击击鼠鼠标标右右键键从从弹弹出出菜菜单单中中选选择择HideHide从从而而关关闭闭ProfileProfile StatistcsStatistcs窗口。窗口。 (3)(3)进进入入profilerprofile_pointsprofilerprofile_points, 选选择择DleteDlete AllAll
102、并并点点击击OKOK。 (4) (4)进入进入ViewView菜单,并撤消菜单,并撤消 Mixed Source/ASMMixed Source/ASM使能。使能。706.3.2算法和数据测试实例这这里里创创建建一一个个完完成成基基本本信信号号处处理理的的程程序序,可可用用存存储储在在PCPC机机文文件件中中的的数数据据来来建建立立和和测测试试一一个个简简单单的的算算法法,也也可可利利用用CCSCCS的的探探针针断断点点、图图形显示、动态运行和形显示、动态运行和GELGEL文件。文件。711.1.打开和查看工程打开和查看工程(1)(1)点点击击符符号号展展开开Project Project V
103、iewView, 在在 ProjectProject中中 包包 含含 VOLUME.MAKVOLUME.MAK、 IncludeInclude、 LibrariesLibraries、 SourceSource。 设设 该该ProjectProject中的主要文件有:中的主要文件有:o o volume.c volume.c 包包含含main()main()函函数数的的C C源程序源程序ovolume.h ovolume.h 源源程程序序volume.cvolume.c包包含的头文件,其中义了各种常数和结构。含的头文件,其中义了各种常数和结构。oload.oload.asm asm 此此文文件
104、件包包含含loadload子子程程序序,该该子子程程序序是是个个能能从从C C函函数数中中调调用用的简单汇编循环子程序的简单汇编循环子程序。 ovectors.ovectors.asm asm 此此文文件件定定义义DSPDSP的的中断向量表中断向量表ovolume.ovolume.cmd cmd 连连接接命命令令文文件件,它它将各段映射到存储器中。将各段映射到存储器中。o o rtsrts.lib .lib 为为DSPDSP目目标标系系统统提提供供运运行支持行支持。 722. 2. 查看源程序查看源程序在ProjectView窗口中双击volume.c文件,源程序就显示在CCS窗口的右边。注意
105、实例中的下面几部分:o主函数打印完信息后,应用程序处于无限循环状态。此循环,主函数调用dataIO和processing()函数。oprocessing()函数将增益与输入缓存区中的各值相乘并将结果存入输出缓存区;同时也调用汇编Load子程序,该子程序占用的指令周期取决于传递给它的processingLoad值。dataIO函数是一个空函数,它的作用类似于return语句。可利用CCS中的探针(Probe Point)功能把主机文件中的数据读取到inp_buffer缓存区,此法优于用C代码来完成I/O功能。73#include#includevolume.h/*Globaldeclaratio
106、ns*/intinp_bufferBUFSIZE;/*processingdatabuffers*/intout_bufferBUFSIZE;intgain=MINGAIN;/*volumecontrolvariable*/unsignedintprocessingLoad=BASELOAD;/*processingload*/*Functions*/externvoidload(unsignedintloadValue);staticintprocessing(int*input,int*output);staticvoiddataIO(void);74/*=main=*/voidmain(
107、)int*input=&inp_buffer0;int*output=&out_buffer0;puts(volumeexamplestartedn);/*loopforever*/while(TRUE)/*ReadusingaProbePointconnectedtoahostfile.*/dataIO();/*applygain*/processing(input,output);75/*=processing=* FUNCTION: apply signal processing transform to inputsignal.*PARAMETERS:addressofinputand
108、outputbuffers.*RETURNVALUE:TRUE.*/staticintprocessing(int*input,int*output)intsize=BUFSIZE;while(size-)*output+=*input+*gain;/*additionalprocessingload*/load(processingLoad);return(TRUE);76/*=dataIO=* FUNCTION: read input signal and write outputsignal.*PARAMETERS:none.*RETURNVALUE:none.*/staticvoidd
109、ataIO()/*dodataI/O*/return;773 3 为为I/OI/O文件增加探针断点文件增加探针断点探针可以从PC机的文件中读取数据,它是开发算法的一个有效工具。其使用方法如下:(1)将来自PC主机文件中的输入数据传送到目标系统的缓存器中供算法使用。(2)将来自目标系统缓存器中的输出数据传送到PC主机的文件中供分析。(3)用数据更新窗口,如图形窗口。和断点类似,它们都挂起目标系统来完成自己的动作,但存在如下几个方面的差别:o当程序运行到探针时暂停执行,在更新与之相连接的窗口后,再自动继续运行程序。o断点暂停程序执行,且更新所有打开的窗口,直到人工恢复其运行为止,。o探针可与FIL
110、EIO配合,在目标板和PC文件之间传送数据,而断点则不行。78如如何何利利用用探探针针把把PCPC机机文文件件内内容容传传送送到到目目标标系系统统中中作作为为测测试试数数据据使使用用。当当到到达达探探测测点点时时,同同时时使使用用断断点点更更新新所所有有打打开开的的窗窗口,这些窗口包括输入和输出数据的图形窗口。口,这些窗口包括输入和输出数据的图形窗口。(1)(1)点击工具栏按钮或选择点击工具栏按钮或选择ProjectRebuild All ProjectRebuild All 。(2)(2)选选择择FileLode FileLode ProgramProgram并并选选取取volume.out
111、 volume.out ,然然后后点点击击OpenOpen。(3)(3)在在Project ViewProject View窗口中,双击窗口中,双击volume.cvolume.c文件。文件。(4)(4)将将光光标标置置于于主主函函数数中中的的 dataIOdataIO( ( ) )这这一一行行上上。DataIODataIO函函数数起起占占位位符符作作用用。现现在在,它它是是一一个个很很好好的的与与探探针针断断点点相相连连接接的的地方,以便于从地方,以便于从PCPC机文件输入数据。机文件输入数据。(5)(5)点点击击工工具具栏栏按按钮钮Probe Probe PointPoint添添加加探探针
112、针,则则光光标标所所在在行行变为兰色高亮。变为兰色高亮。(6)(6)选选择择FileFile FileFile I/O,I/O,在在File File I/O I/O 对对话话窗窗中中可可选选择择输输入和输出文件。入和输出文件。(7)(7)在在File Input File Input 栏中,点击栏中,点击Add FileAdd File。(8)(8)选择选择sine.sine.dat dat 文件。与文件。与volume.cvolume.c同同目录目录注注意意:在在文文件件类类型型框框中中可可以以选选择择数数据据格格式式,sine.sine.dat dat 文文件件包含正弦波形的包含正弦波形
113、的1616进制值。进制值。79(9)(9)点点击击OpenOpen,将将该该文文件件添添加加到到File File I/OI/O对对话话框框的的列列表表上上,接接着着出出现现sine.sine.datdat文文件件控控制制窗窗口口(CCSCCS窗窗口口可可以以覆覆盖盖它它)。在在运运行行程程序序时时,可可用用这这个个窗窗口口控控制制数数据据文文件件的的开开始始、停停止止、重重复复、前前进进、后后退退等操作。等操作。(10)(10)在在 File File I/OI/O对对 话话 框框 中中 , 将将AddressAddress修修改改为为 inpinp_buffer_buffer,Length
114、Length修修改改为为100100,选选中中WrapWrapAroundAround框框。对对话话框框中:中:AddressAddress栏栏中中的的值值指指定定来来自自文文件件的的数数据据将将要要存存放放的的位位置置,inpinp_buffer _buffer 是是由由volume.cvolume.c文件声明为文件声明为BUFSIZEBUFSIZE的整数数组。的整数数组。LengthLength栏栏中中的的值值指指定定每每次次探探针针到到达达时时读读入入多多少少个个数数据据样样点点,使使用用100100是是因因为为BUFSIZEBUFSIZE常常数数已已由由volume.h(0x64)vo
115、lume.h(0x64)设设置置为为100100。Wrap Wrap AroundAround选选项项表表明明读读取取数数据据的的循循环环特特性性。当当探探针针到到达达文文件件结结尾尾时时,使使CCSCCS自自动动从从文文件件头头开开始始读读数数据据。这这样样将将从从数数据据文文件件中中读读取取一一个个连连续续(周周期期性性)的的数数据流。据流。80(11)(11)点点 击击 Add Add Probe Probe PointPoint, 出出 现现BreakProbe BreakProbe Profile Profile Points Points 对对话话窗窗,选选中中的的Probe Po
116、intProbe Point栏。栏。(12)(12)在在Probe Probe PointPoint列列表表中中,高高亮亮显显示示第第五步的断点设置。五步的断点设置。(13)(13)点点击击ConnectConnect栏栏尾尾处处的的下下箭箭头头,在在其其下拉菜单中选择下拉菜单中选择sine.sine.dat dat 文件。文件。(14) (14) 点点击击ReplaceReplace。 Probe Probe PointPoint列列表表将显示探测点已连接到将显示探测点已连接到sine.sine.dat dat 文件。文件。(15) (15) 点点击击OKOK。 File File I/OI
117、/O对对话话框框则则显显示示文文件现已被连接到探测点。件现已被连接到探测点。(16) (16) 点击点击OKOK,关闭关闭File I/OFile I/O对话框对话框 。814.4.显示图形显示图形CCS CCS 提提供供了了多多种种用用图图形形处处理理数数据据的的方方法法。在在本本例例中中,你你将将看到一个基于时间绘制的图形(时域波形)。看到一个基于时间绘制的图形(时域波形)。(1)(1)选择选择ViewGraph Time/ FrequencyViewGraph Time/ Frequency。(2)(2)在在弹弹出出的的Graph Graph Property Property Dial
118、ogDialog对对话话窗窗中中, 将将 Graph Graph TitleTitle,Start Start AddressAddress,Acquisition Acquisition Buffer Buffer SizeSize,Display Display Data Data SizeSize,DSP DSP Data Data TypeType,AutoscaleAutoscale和和Maximum Maximum Y-value Y-value 的的属属性性改改变变为为如如下下图图所所示示。向向下下滚滚动动或或调调整整 dialog dialog 框的大小可看到所有的属性。框的大
119、小可看到所有的属性。( (3)3)点击点击OKOK,将出现显示将出现显示inpinp_buffer _buffer 波形的图形窗。波形的图形窗。(4)(4)在在上上述述窗窗中中右右击击鼠鼠标标,从从弹弹出出的的菜菜单单中中选选择择Clear Clear DisplayDisplay。(5)(5)再次选择再次选择View-Graph-Time/FrequencyView-Graph-Time/Frequency。(6)(6)改改变变Graph Graph TitleTitle的的属属性性为为Output Output BufferBuffer,改改变变Start Start AddressAdd
120、ress的属性为的属性为Out_bufferOut_buffer,其余的设置都不变。其余的设置都不变。(7) (7) 点点击击OKOK,将将出出现现显显示示Out_buffer Out_buffer 波波形形的的图图形形窗窗。在在该图形窗内右击鼠标,从弹出的菜单中选择该图形窗内右击鼠标,从弹出的菜单中选择Clear DisplayClear Display。 82835.5.执行程序和绘制图形执行程序和绘制图形设设置置一一个个可可刷刷新新图图形形的的断断点点,使使用用Animate Animate 命命令令在在遇遇到到断断点点后,自动恢复目标系统应用程序的运行。后,自动恢复目标系统应用程序的运
121、行。(1) (1) 在在C C源程序源程序volume.cvolume.c窗口中,将光标放置在窗口中,将光标放置在dataIOdataIO行。行。(2) (2) 点点击击Toggle Toggle BreakpointBreakpoint工工具具栏栏按按钮钮或或按按F9F9,该该行行显显示示为为红红色色和和蓝蓝色色高高亮亮,表表明明在在这这一一行行已已经经设设置置了了断断点点和和探探针针。在在同同一一行行上上既既放放置置探探针针又又放放置置断断点点,它它能能够够使使目目标标系系统统只只暂暂停停一一次次而而完成两个操作:数据传输和图形刷新。完成两个操作:数据传输和图形刷新。(3) (3) 重新安
122、排窗口以便能同时能看到这两个图形。重新安排窗口以便能同时能看到这两个图形。(4)(4)点点击击工工具具栏栏AnimateAnimate按按钮钮或或按按F12F12运运行行程程序序。AnimateAnimate命命令令与与RunRun命命令令相相似似,它它使使目目标标系系统统应应用用程程序序一一直直运运行行到到断断点点,随随后后,目目标标系系统统应应用用程程序序暂暂停停并并刷刷新新窗窗口口。但但是是,与与RunRun命命令令不不同同的的是是,AnimateAnimate命命令令恢恢复复目目标标系系统统应应用用程程序序运运行行到到下下一一个个断断点点,而而且且此此过过程程是是连连续续的的,直直到到
123、目目标标系系统统被被人人工工停停止止。所所以以,AnimateAnimate命命令令可看作可看作“运行中断继续运行中断继续”(run-break continuerun-break continue)过程。过程。84(5)(5)每每次次到到达达探探测测点点时时,CCS CCS 从从sine.sine.datdat文文件件中中得得到到100100个个值值,再再将将这这100100个个值值写写入入inpinp_buffer_buffer地地址址。由由于于sine.sine.dat dat 文文件件包包含含4040个个采采样样值值的的正正弦弦波波形形数数据据, ,因因此此每每个个图图形形包包含含2.
124、52.5个个周周期期的的正正弦弦波波形形,且且在在程程序序运运行行过过程程中中两两个个图图形形反反向向。符符号号相相反反是是因因为为输输入入缓缓冲冲区区包包含含的的值值是是从从sine.sine.datdat文文件件中中读读取取的的,而而输输出出缓缓冲冲区区最最后的值是经过函数处理后得到的。后的值是经过函数处理后得到的。856.6.调节增益调节增益在在WhileWhile循环中用如下语句将增益与输入缓存区中的各值相乘并循环中用如下语句将增益与输入缓存区中的各值相乘并将结果存入输出缓存区将结果存入输出缓存区: :* *output+ = *input+ * gain;output+ = *inp
125、ut+ * gain;增增益益gaingain被被初初始始化化为为MINGAINMINGAIN,在在volume.hvolume.h中中定定义义为为1 1。要要改改变变输出幅度得修改输出幅度得修改gaingain值。修改值。修改gaingain值的一种方法是采用观察变量。值的一种方法是采用观察变量。1.1.选择选择viewWatch WindowviewWatch Window2.2.在在WatchWatch窗中右键菜单中选择窗中右键菜单中选择Insert New ExpressionInsert New Expression。3.3.在在ExpressionExpression区敲入区敲入g
126、aingain并单击并单击OKOK,变量值出现在变量值出现在WatchWatch窗口。窗口。4.4.如如果果程程序序已已暂暂停停,点点击击工工具具栏栏按按钮钮( (AminateAminate) ),重重新新开开始始运运行程序。行程序。5.5.在在WatchWatch窗口中双击窗口中双击gaingain。6.6.在在Edit VariableEdit Variable窗口中修改窗口中修改gaingain值为值为1010,并点击,并点击OKOK。注意在注意在Output BufferOutput Buffer图形中信号幅度变化反映了增益的提高。图形中信号幅度变化反映了增益的提高。 867 7 观
127、察范围外变量观察范围外变量当想查看的变量的作用域不在当前设置的断点范围内时,则可使用访问堆栈来查看。(1)点击工具栏按钮或按ShiftF5暂停程序运行。(2).用CCS重新查看volume.c程序。注意在main与processing函数中已经定义了变量*input,但在dataIO函数中没有定义。(3)把光标放置在dataIO()函数的return行。(4)点击工具栏Toggle BreakpointToggle Breakpoint按钮设置断点。(5)点击F5执行程序,CCS将自动把断点移到相应函数的下一条汇编指令处。对话框通知你将把断点移到下一行。(6)点击OK87(7)(7)按按下下F
128、5F5,程程序序运运行行直直到到dataIOdataIO()()函函数数末末尾尾的的断断点点处处暂停。暂停。(8)(8)在在WatchWatch窗窗口口中中点点击击鼠鼠标标右右键键并并从从弹弹出出菜菜单单中中选选择择Insert New ExpressionInsert New Expression。(9)(9)在在ExpressionExpression区键入区键入* *inputinput并点击并点击OKOK。(10)(10)在在WatchWatch窗窗口口中中显显示示是是一一个个未未知知符符号号,这这是是因因为为* *input input 没有在没有在dataIOdataIO()()函
129、数内定义。函数内定义。(11)(11)选择菜单选择菜单ViewCall StackViewCall Stack,则可看到堆栈窗。则可看到堆栈窗。(12)(12)在在堆堆栈栈窗窗中中点点击击main()main()就就可可在在主主函函数数范范围围内内查查看看* *inputinput的值。的值。(13)(13)可可以以点点击击堆堆栈栈窗窗的的最最后后一一行行, , 可可以以看看到到gaingain是是全全局局变量,而变量,而* *inputinput则不是。则不是。(14)(14)在堆栈窗中点击鼠标右键并从弹出菜单中选择在堆栈窗中点击鼠标右键并从弹出菜单中选择HideHide。(15)(15)撤
130、撤消消第第4 4步步中中放放置置的的断断点点( (将将光光标标放放置置在在datdIOdatdIO()()函函数中的数中的returnreturn之后的行上,点击工具栏按钮或单击之后的行上,点击工具栏按钮或单击F9)F9)。888 8 使用使用GELGEL文件文件CCS CCS 提提供供了了修修改改变变量量的的另另一一种种方方法法,该该方方法法使使用用一一种种扩扩展展语言语言GELGEL来创建可修改变量的窗口。来创建可修改变量的窗口。(1)(1)选选择择FileLoad FileLoad GELGEL。在在Load Load GEL GEL FileFile对对话话框框中中选选择择volume
131、.gelvolume.gel文文件件并并点点击击OpenOpen,这这个个选选项项是是在在上上步步加加载载GELGEL文文件件时自动增加的。时自动增加的。(2)(2)选选择择GELApplication GELApplication ControlGainControlGain,弹弹出出如如右右图图所示的小窗口。所示的小窗口。(3)(3)如如果果程程序序已已经经暂暂停停,点点击击工工具具栏栏按按钮钮AnimateAnimate。注注意意即即使使在在弹弹出出的的gaingain小小窗窗口口中中值值为为零零,其其实实gaingain的的当当前前值值仍仍为为1 1。只有滑动指针时只有滑动指针时gai
132、ngain值才发生变化。值才发生变化。(4)(4)在在gaingain窗窗口口中中用用滑滑动动指指针针改改变变gaingain值值,则则在在Output Output BufferBuffer窗窗口口中中的的正正弦弦波波形形幅幅度度相相应应改改变变, ,在在WatchWatch窗窗口口的的变变量量gaingain的值将随之改变。的值将随之改变。(5)(5)点击工具栏点击工具栏HaltHalt按钮或按下按钮或按下Shift F5Shift F5暂停程序运行。暂停程序运行。896.6.在在VOLUME.GELVOLUME.GEL文文件件上上双双击击鼠鼠标标便便可可查查看其内容看其内容: :menu
133、itemmenuitem Application Control Application Controldialog Load(dialog Load(loadParmloadParm Load) Load) processingLoadprocessingLoad = = loadParm loadParm; ; slider Gain(0, 10 ,1, 1,slider Gain(0, 10 ,1, 1, gainParm gainParm) ) gain =gain = gainParm gainParm; ; GainGain函函数数定定义义的的滑滑动动指指针针范范围围:0 0到到1
134、010,其其步步长长为为1 1。当当移移动动滑滑动动指指针针时时,变变量量gaingain的的值将随滑动指针的改变而改变。值将随滑动指针的改变而改变。909 9 调节和测试调节和测试processingLoadprocessingLoad函数函数使使用用Profile-pointProfile-point测测试试点点查查看看变变量量processingLoadprocessingLoad改改变变 后后 的的 结结 果果 , 此此 结结 果果 将将 传传 递递 给给 汇汇 编编 LoadLoad程程 序序 。 ProcessingLoadProcessingLoad初初 始始 化化 为为 BAS
135、ELOADBASELOAD, 而而 BASELOADBASELOAD在在volume.hvolume.h中定义为中定义为1 1。(1)(1)选选 择择 ProfilerEnable ProfilerEnable ClockClock, 确确 保保 Enable Enable ClockClock使能。使能。(2)(2)在在Project View Project View 中,双击中,双击volume.cvolume.c文件。文件。(3)(3)选选择择ViewMixed ViewMixed Source/ASMSource/ASM使使能能,查查看看C C源源程程序序及其相应汇编指令。及其相应汇
136、编指令。(4)(4)把把光光标标放放置置在在load(load(processingLoadprocessingLoad) )行行后后的的汇汇编指令上编指令上(5) (5) 点点击击工工具具栏栏按按钮钮或或点点击击鼠鼠标标右右键键选选择择Toggle Toggle Profile -point Profile -point 。(6) (6) 把把光光标标放放置置在在return(true)return(true)行行后后的的汇汇编编指指令令上。上。(7) (7) 点击工具栏按钮点击工具栏按钮( (Toggle Profile-point)Toggle Profile-point)。91(8)选
137、 择 ProfilerViewStatistics。 在 ProfileStatistics窗口中的location栏显示了新增测试点对应的汇编指令或地址。可以通过改变Statisticsarea区域的大小查看更多内容;或者在Statisticsarea区域内点击鼠标右键,选择AllowDocking可在一个单独窗口中显示Statistics。(9)点击工具栏AnimateAnimate按钮或按F12。(10)注意在第二个测试点处显示的最大周期数大约为44(真实值可能不同),当processingLoad1时,它表明执行Load程序所需的指令周期数。(11)选择GELApplicationCo
138、ntrolLoad。(12)在load域输入2,然后点击Execute,则对应于第 二 个 测 试 点 的 最 大 周 期 数 改 变 为 75。 每 当processingLoad增加1时,指令周期数就增加31。这些指令周期数表明load函数的执行时间,load函数包含在load.asm文件中。92(13)在ProfileStatistics窗口中点击鼠标右键,从弹出菜单中选择ClearAll,这将把Statistics复位为0。平均值、最大值和最小值都等于当前processingLoad的指令周期数。(14)点击工具栏按钮或按ShiftF5暂停程序运行。在进行其他操作前,执行下列步骤释放本
139、节中使用的资源o关 闭 Load、 Gain控 制 窗 口 、 sine.dat控 制 窗 口 以 及Time/Frequency图形窗。o选择FileFileI/O并点击RemoveFile删除sine.dat文件。o选择Profiler菜单撤消EnableClock前的“”。oProfileStatistics窗口鼠标右键并在弹出菜单中选择Hide。o选择DebugBreakpoints,然后选择DeleteAll并点击OKo选择DebugProbePoints,然后选择DeleteAll并点击OKo选择Profilerprofile-point,然后选择DeleteAll并点击OK。o选
140、择View菜单撤消MixedSource/ASM前的“”。o关闭打开的窗口和工程(ProjectClose)。o在 project View中 的 volume.gel上 击 鼠 标 右 键 并 选 择Remove。o 在Watch Window中删除表达式并隐藏Watch Window。936.3.3 6.3.3 控制控制变数变数大小大小1.exam1.c源程序如下所示#include#includefloatbuffer100;floatgain=1.0;voidcal_cos()inti=0;for(i=0;iLoadProgram,把把exam1.outload到到目标板目标板的的DS
141、P中中.(6)在在cal_cos行設定行設定breakpoint.(7)通过菜单通过菜单View-WatchWindow打开打开WatchWindow窗口窗口,并在该窗口并在该窗口右键菜单选择右键菜单选择InsertNewExpression(8)在在弹出的对话框弹出的对话框WatchAddExpression输入输入gain变量变量95( (9)9)通过菜单通过菜单View-View- Graph Graph 打开打开Graphical DisplayGraphical Display 窗口窗口, ,在该窗口右键菜单选择在该窗口右键菜单选择Propty Propty 打开属性设置框打开属性设
142、置框, ,进行如图中设置进行如图中设置. .( (10)10)选择选择 Debug-Animate ,Debug-Animate ,运行程序运行程序, ,可以看到可以看到gaingain的值和的值和显示波形显示波形. .( (Run Run 和和 Animate Animate 不同不同: : Run Run 遇遇到到 breakpoint breakpoint 时时会会自自动暂动暂停停; ; Animate Animate 遇到遇到 breakpintbreakpint时会时会更新更新图图形形或或 watch window watch window 中要中要观察的变数观察的变数, , 然然后
143、继续后继续往下執往下執行程式行程式. . ) )963.利用利用GEL控制控制变数变数大小大小(1)exam2.c源程序如源程序如exam1.c所示所示(2)调试调试:和例二类似和例二类似.(3)另外加入另外加入exam2.gel的程的程序序如下如下:menuitemApplicationControlsliderGain(0,10,1,1,gainParm)gain=gainParm;加入加入exam2.gel的的方法方法:File-LoadGEL把把exam2.gel載入載入CCStudio中中,這這时时可以在可以在projectwindow中看到中看到exam2.gel已加入已加入.(4
144、)在在菜单选菜单选GEL-ApplocationControl-Gain会会出現一出現一个个Gain的控制的控制选选項項,移移动滑标动滑标,可以隨可以隨时时改改变变gain的值的值,波形随着变化波形随着变化.97984.观察观察程式程式执行执行的的时间时间如如果果要要知知道道程程式式執執行行的的效效率率,必必須須要要观观察察指指令令到到底底執執行行了了几几个个指指令令周周期期(instructioncycle).这这是是利用利用Profiler中的中的ViewStatistics來來观察观察.(1)按按照照例例三三的的步步驟驟, 把把 exam2.out 載載入入到到DSP 中中后后,选选中中
145、程程序序的的cal_cos行行利利用用Profiler-Profile-points設定設定profilepoin.(2)选选择择Profiler-ViewStatistics,在在右右下下角角出出現現一一個個視視窗窗.其其中中Count是是指指這這个个函函數數目目前前呼呼叫叫過過的的次次數數,Average是是指指執執行行這這個個函函數數平平均均用用了了几几个个周周期期,Total是是周周期期的的累累加加,Maximum是是指指执执行行這這個個函函數數所所需需要要最最多多几几個個cycle,Minimum是是指執行這個函數所需要最少幾個指執行這個函數所需要最少幾個cycle.(3)选择选择Profiler-EnableClock.(4)選擇選擇Debug-Run可以看到可以看到表表上上数数值值变变化的結果化的結果99