CCS开发指南

您所在的位置:网站首页 ccs添加c文件 CCS开发指南

CCS开发指南

2024-01-06 18:55| 来源: 网络整理| 查看: 265

第一章  CCS概述 1

1.1 CCS概述 1

1.2 代码生成工具 3

1.3 CCS集成开发环境 5

1.3.1 编辑源程序 5

1.3.2创建应用程序6

1.3.3 调试应用程序 6

1.4 DSP/BIOS 插件 7

1.4.1 DSP/BIOS 配置 7

1.4.2 DSP/BIOS API 模块8

1.5 硬件仿真和实时数据交换 10

1.6 第三方插件 13

1.7 CCS文件和变量 14

1.7.1安装文件夹14

1.7.2文件扩展名14

1.7.3环境变量15

1.7.4增加DOS环境空间 16

第二章  开发一个简单的应用程序 17

2.1 创建工程文件 17

2.2 向工程添加文件 19

2.3 查看源代码 21

2.4 编译和运行程序 23

2.5 修改程序选项和纠正语法错误 24

2.6 使用断点和观察窗口 26

2.7 使用观察窗口观察structure变量 28

2.8 测算源代码执行时间 29

2.9 进一步探索 31

2.10进一步学习31

第三章  开发DSP/BIOS程序 32

3.1 创建配置文件 32

3.2 向工程添加DSP/BIOS文件 34

3.3 用CCS 测试 36

3.4 测算DSP/BIOS代码执行时间 38

3.5 进一步探索 40

3.6 进一步学习 40

第四章   算法和数据测试41

4.1 打开和查看工程 41

4.2 查看源程序 43

4.3 为I/O文件增加探针断点 45

4.4 显示图形 47

4.5 执行程序和绘制图形 48

4.6 调节增益 50

4.7 观察范围外变量 51

4.8 使用GEL文件 53

4.9 调节和测试processing函数 54

4.10 进一步探索 56

4.11 进一步学习 57

第五章 程序调试 58

5.1 打开和查看工程 58

5.2 查看源程序 60

5.3 修改配置文件 63

5.4 用Execution Graph查看任务执行情况66

5.5 修改和查看load值 67

5.6 分析任务的统计数据 70

5.7 增加STS显式测试 72

5.8 观察显式测试统计数据 73

5.9 进一步探索 75

5.10 进一步学习 75

第六章 实时分析 76

6.1 打开和查看工程 76

6.2 修改配置文件 77

6.3 查看源程序 79

6.4 使用RTDX控制修改运行时的load值 81

6.5 修改软中断优先级 84

6.6 进一步探索 85

6.7 进一步学习 85

第七章 I/O86

7.1 打开和查看工程 86

7.2 查看源程序 87

7.3 Signalprog应用程序 90

7.4 运行应用程序 91

7.5 使用HST和PIP模块修改源程序 93

7.6 HST和PIP资料 96

7.7 在配置文件中增加通道和SWI 97

7.8 运行修改后的程序 100

7.9 进一步学习 100

第一章  CCS概述

本章概述CCS(Code Composer Studio)软件开发过程、CCS组件及CCS使用的文件和变量。

CCS提供了配置、建立、调试、跟踪和分析程序的工具,它便于实时、嵌入式信号处理程序的编制和测试,它能够加速开发进程,提高工作效率。

1.1 CCS概述

CCS提供了基本的代码生成工具,它们具有一系列的调试、分析能力。CCS支持如下所示的开发周期的所有阶段。

在使用本教程之前,必须完成下述工作:

o 安装目标板和驱动软件。按照随目标板所提供的说明书安装。如果你正在用仿真器或目标板,其驱动软件已随目标板提供,你可以按产品的安装指南逐步安装。

o 安装CCS.遵循安装说明书安装。如果你已有CCS仿真器和TMS320c54X代码生成工具,但没有完整的CCS,你可以按第二章和第四章所述的步骤进行安装。

o 运行CCS安装程序SETUP. 你可以按步骤执行第二章和第四章的实验。SETUP程序允许CCS使用为目标板所安装的驱动程序。

CCS包括如下各部分:

o CCS代码生成工具:参见1.2节

o CCS集成开发环境(IDE):参见1.3节

o DSP/BIOS插件程序和API:参见1.4节

o RTDX插件、主机接口和API:参见1.5节

CCS构成及接口见图1-1。

图1-1  CCS构成及接口

1.2 代码生成工具     代码生成工具奠定了CCS所提供的开发环境的基础。图1-2是一个典型的软件开发流程图,图中阴影部分表示通常的C语言开发途径,其它部分是为了强化开发过程而设置的附加功能。

图1-2 软件开发流程

图1-2描述的工具如下:

o C编译器(C compiler) 产生汇编语言源代码,其细节参见TMS320C54x最优化C编译器用户指南。

o 汇编器(assembler) 把汇编语言源文件翻译成机器语言目标文件,机器语言格式为公用目标格式(COFF),其细节参见TMS320C54x汇编语言工具用户指南。

o 连接器(linker) 把多个目标文件组合成单个可执行目标模块。它一边创建可执行模块,一边完成重定位以及决定外部参考。连接器的输入是可重定位的目标文件和目标库文件,有关连接器的细节参见TMS320C54x最优化C编译器用户指南和汇编语言工具用户指南。

o 归档器(archiver)允许你把一组文件收集到一个归档文件中。归档器也允许你通过删除、替换、提取或添加文件来调整库,其细节参见TMS320C54x汇编语言工具用户指南。

o 助记符到代数汇编语言转换公用程序(mnimonic_to_algebric assembly translator utility)把含有助记符指令的汇编语言源文件转换成含有代数指令的汇编语言源文件,其细节参见TMS320C54x汇编语言工具用户指南。

o 你可以利用建库程序(library_build utility)建立满足你自己要求的“运行支持库”,其细节参见TMS320C54x最优化C编译器用户指南。

o 运行支持库(run_time_support libraries) 它包括C编译器所支持的ANSI标准运行支持函数、编译器公用程序函数、浮点运算函数和C编译器支持的I/O函数,其细节参见TMS320C54x最优化C编译器用户指南。

o 十六进制转换公用程序(hex conversion utility) 它把COFF目标文件转换成TI-Tagged、ASCII-hex、 Intel、 Motorola-S、或 Tektronix 等目标格式,可以把转换好的文件下载到EPROM编程器中,其细节参见TMS320C54x汇编语言工具用户指南。

o 交叉引用列表器(cross_reference lister)它用目标文件产生参照列表文件,可显示符号及其定义,以及符号所在的源文件,其细节参见TMS320C54x汇编语言工具用户指南。

o 绝对列表器(absolute lister)它输入目标文件,输出.abs文件,通过汇编.abs文件可产生含有绝对地址的列表文件。如果没有绝对列表器,这些操作将需要冗长乏味的手工操作才能完成。

1.3 CCS集成开发环境

CCS集成开发环境(IDE)允许编辑、编译和调试DSP目标程序。

1.3.1 编辑源程序 CCS允许编辑C源程序和汇编语言源程序,你还可以在C语句后面显示汇编指令的方式来查看C源程序。

集成编辑环境支持下述功能:

o 用彩色加亮关键字、注释和字符串。

o 以圆括弧或大括弧标记C程序块,查找匹配块或下一个圆括弧或大括弧。 

o 在一个或多个文件中查找和替代字符串,能够实现快速搜索。

o 取消和重复多个动作。

o 获得“上下文相关”的帮助。

o 用户定制的键盘命令分配。

1.3.2创建应用程序

应用程序通过工程文件来创建。工程文件中包括C源程序、汇编源程序、目标文件、库文件、连接命令文件和包含文件。编译、汇编和连接文件时,可以分别指定它们的选项。在CCS中,可以选择完全编译或增量编译,可以编译单个文件,也可以扫描出工程文件的全部包含文件从属树,也可以利用传统的makefiles文件编译。

1.3.3 调试应用程序

CCS提供下列调试功能:

o 设置可选择步数的断点

o 在断点处自动更新窗口

o 查看变量

o 观察和编辑存储器和寄存器

o 观察调用堆栈

o 对流向目标系统或从目标系统流出的数据采用探针工具观察,并收集存储器映象

o 绘制选定对象的信号曲线

o 估算执行统计数据

o 观察反汇编指令和C指令

CCS提供GEL语言,它允许开发者向CCS菜单中添加功能。

1.4 DSP/BIOS 插件

在软件开发周期的分析阶段,调试依赖于时间的例程时,传统调试方法效率低下。

DSP/BIOS插件支持实时分析,它们可用于探测、跟踪和监视具有实时性要求的应用例程,下图显示了一个执行了多个线程的应用例程时序。

图1-3 应用例程中各线程时序

DSP/BIOS API 具有下列实时分析功能:

o 程序跟踪(Program tracing)显示写入目标系统日志(target log)的事件,反映程序执行过程中的动态控制流。

o 性能监视(Performance monitoring)跟踪反映目标系统资源利用情况的统计表,诸如处理器负荷和线程时序。

o 文件流(File streaming)把常驻目标系统的I/O对象捆绑成主机文档。

DSP/BIOS 也提供基于优先权的调度函数,它支持函数和多优先权线程的周期性执行。

1.4.1 DSP/BIOS 配置

在CCS环境中,可以利用DSP/BIOS API定义的对象创建配置文件,这类文件简化了存储器映象和硬件ISR矢量映象,所以,即使不使用DSP/BIOS API 时,也可以使用配置文件。

配置文件有两个任务:

o 设置全局运行参数。

o 可视化创建和设置运行对象属性,这些运行对象由目标系统应用程序的DSP/BIOS API函数调用,它们包括软中断,I/O管道和事件日志。

在CCS中打开一个配置文件时,其显示窗口如下:

DSP/BIOS对象是静态配置的,并限制在可执行程序空间范围内,而运行时创建对象的API调用需要目标系统额外的开销(尤其是代码空间)。静态配置策略通过去除运行代码能够使目标程序存储空间最小化,能够优化内部数据结构,在程序执行之前能够通过确认对象所有权来及早地检测出错误。

保存配置文件时将产生若干个与应用程序联系在一起的文件,这些文件的细节参见1.7.2。

1.4.2 DSP/BIOS API 模块

传统调试(debuging)相对于正在执行的程序而言是外部的,而DSP/BIOS API要求将目标系统程序和特定的DSP/BIOS API模块连接在一起。通过在配置文件中定义DSP/BIOS对象,一个应用程序可以使用一个或多个DSP/BIOS模块。在源代码中,这些对象声明为外部的,并调用DSP/BIOS API功能。

每个DSP/BIOS模块都有一个单独的C头文件或汇编宏文件,它们可以包含在应用程序源文件中,这样能够使应用程序代码最小化。

为了尽量少地占用目标系统资源,必须优化(C和汇编源程序)DSP/BIOS API调用。

DSP/BIOS API划分为下列模块,模块内的任何API调用均以下述代码开头。

o CLK。片内定时器模块控制片内定时器并提供高精度的32位实时逻辑时钟,它能够控制中断的速度,使之快则可达单指令周期时间,慢则需若干毫秒或更长时间。

o HST。主机输入/输出模块管理主机通道对象,它允许应用程序在目标系统和主机之间交流数据。主机通道通过静态配置为输入或输出。

o HWI。硬件中断模块提供对硬件中断服务例程的支持,可在配置文件中指定当硬件中断发生时需要运行的函数。

o IDL。休眠功能模块管理休眠函数,休眠函数在目标系统程序没有更高优先权的函数运行时启动。

o LOG。日志模块管理LOG对象,LOG对象在目标系统程序执行时实时捕捉事件。开发者可以使用系统日志或定义自己的日志,并在CCS中利用它实时浏览讯息。

o MEM。存储器模块允许指定存放目标程序的代码和数据所需的存储器段。

o PIP。数据通道模块管理数据通道,它被用来缓存输入和输出数据流。这些数据通道提供一致的软件数据结构,可以使用它们驱动DSP和其它实时外围设备之间的I/O通道。

o PRD。周期函数模块管理周期对象,它触发应用程序的周期性执行。周期对象的执行速率可由时钟模块控制或PRD_tick的规则调用来管理,而这些函数的周期性执行通常是为了响应发送或接收数据流的外围设备的硬件中断。

o RTDX。实时数据交换允许数据在主机和目标系统之间实时交换,在主机上使用自动OLE的客户都可对数据进行实时显示和分析,详细资料参见1.5。

o STS。统计模块管理统计累积器,在程序运行时,它存储关键统计数据并能通过CCS浏览这些统计数据。

o SWI。软件中断模块管理软件中断。软件中断与硬件中断服务例程(ISRs)相似。当目标程序通过API调用发送SWI对象时,SWI模块安排相应函数的执行。软件中断可以有高达15级的优先级,但这些优先级都低于硬件中断的优先级。

o TRC。跟踪模块管理一套跟踪控制比特,它们通过事件日志和统计累积器控制程序信息的实时捕捉。如果不存在TRC对象,则在配置文件中就无跟踪模块。

有关各模块的详细资料,可参见CCS中的在线帮助,或TMS320C54 DSP/BIOS 用户指南。

1.5 硬件仿真和实时数据交换

TI DSPs提供在片仿真支持,它使得CCS能够控制程序的执行,实时监视程序运行。增强型JTAG连接提供了对在片仿真的支持,它是一种可与任意DSP系统相连的低侵扰式的连接。仿真接口提供主机一侧的JTAG连接,如TI XSD510。为方便起见,评估板提供在板JTAG仿真接口。

在片仿真硬件提供多种功能:

o DSP的启动、停止或复位功能

o 向DSP下载代码或数据

o 检查DSP的寄存器或存储器

o 硬件指令或依赖于数据的断点

o 包括周期的精确计算在内的多种记数能力

o 主机和DSP之间的实时数据交换(RTDX)

CCS提供在片能力的嵌入式支持;另外,RTDX通过主机和DSP APIs提供主机和DSP之间的双向实时数据交换,它能够使开发者实时连续地观察到DSP应用的实际工作方式。在目标系统应用程序运行时,RTDX也允许开发者在主机和DSP设备之间传送数据,而且这些数据可以在使用自动OLE的客户机上实时显示和分析,从而缩短研发时间。

RTDX由目标系统和主机两部分组成。小的RTDX库函数在目标系统DSP上运行。开发者通过调用RTDX软件库的API函数将数据输入或输出目标系统的DSP,库函数通过在片仿真硬件和增强型JTAG接口将数据输入或输出主机平台,数据在DSP应用程序运行时实时传送给主机。

图1-4 RTDX系统组成

在主机平台上,RTDX库函数与CCS一道协同工作。显示和分析工具可以通过COM API与RTDX通信,从而获取目标系统数据,或将数据发送给DSP应用例程。开发者可以使用标准的显示软件包,诸如National Instruments’ LabVIEW,Quinn-Curtis’ Real-Time Graphics Tools,或Microsoft Excel。同时,开发者也可研制他们自己的Visual Basic或Visual C++应用程序。

图1-5 RTDX实例

RTDX能够记录实时数据,并可将其回放用于非实时分析。下述样本由National Instruments’ LabVIEW 软件产生。在目标系统上,一个原始信号通过FIR滤波器,然后与原始信号一起通过RTDX发送给主机。在主机上,LabVIEW显示屏通过RTDX COM API获取数据,并将它们显示在显示屏的左边。利用信号的功率谱可以检验目标系统中FIR滤波器是否正常工作。处理后的信号通过LabVIEW,将其功率谱显示在右上部分;目标系统的原始信号通过LabVIEW的FIR滤波器,再将其功率谱显示在右下部分。比较这两个功率谱便可确认目标系统的滤波器是否正常工作。

RTDX适合于各种控制、伺服和音频应用。例如,无线电通信产品可以通过RTDX捕捉语音合成算法的输出以检验语音应用程序的执行情况;嵌入式系统也可从RTDX获益;硬磁盘驱动设计者可以利用RTDX测试他们的应用软件,不会因不正确的信号加到伺服马达上而与驱动发生冲突;引擎控制器设计者可以利用RTDX在控制程序运行的同时分析随环境条件而变化的系数。对于这些应用,用户都可以使用可视化工具,而且可以根据需要选择信息显示方式。未来的 TI DSPs 将增加RTDX的带宽,为更多的应用提供更强的系统可视性。关于RTDX的详细资料,请参见CCS中RTDX在线帮助。

1.6 第三方插件

第三方软件提供者可创建AxtiveX插件扩展CCS功能,目前已有若干第三方插件用于多种用途。

1.7 CCS文件和变量

本节简述CCS文件夹、CCS的文件类型及CCS环境变量。

1.7.1安装文件夹

安装进程将在安装CCS的文件夹(典型情况为:c:\ti)中建立子文件夹。此外,子文件夹又建立在Windows目录下(c:\windows or c:\winnt)。

C:\ti包含以下目录:

o bin.各种应用程序

o c5400\bios。DSP/BIOS API的程序编译时使用的文件

o c5400\cgtools.Texas instruments源代码生成工具

o c5400\examples.源程序实例

o c5400\rtdx. RTDX文件

o c5400\tutorial.本手册中使用的实例文件

o cc\bin.关于CCS环境的文件

o cc\gel.与CCS一起使用的GEL文件

o docs.PDS格式的文件和指南

o myprojects.用户文件夹

1.7.2文件扩展名

以下目录结构被添加到Windows目录:

o ti\drivers.各种DSP板驱动文件

o ti\plugins.和CCS一起使用的插件程序

o ti\uninstall.支持卸载CCS软件的文件

当使用CCS时,你将经常遇见下述扩展名文件:

o project.mak.CCS使用的工程文件

o program.c.C程序源文件

o program.asm. 汇编程序源文件

o filename.h.C程序的头文件,包含DSP/BIOS API模块的头文件

o filename.lib.库文件

o project.cmd.连接命令文件

o program.obj.由源文件编译或汇编而得的目标文件

o program.out.(经完整的编译、汇编以及连接的)可执行文件

o project.wks. 存储环境设置信息的工作区文件,

o program.cdb.配置数据库文件。采用DSP/BIOS API的应用程序需要这类文件,对于其它应用程序则是可选的。

保存配置文件时将产生下列文件:

u programcfg.cmd.连接器命令文件

u programcfg.h54.头文件

u programcfg.s54.汇编源文件

1.7.3环境变量

安装程序在autoexec.bat文件中定义以下变量(对Windows 95和98)或环境变量(对于Windows NT):

     表1-1  环境变量

           变  量

描     述

C54X_A_DIR

由汇编程序使用的搜索表和用于DSP/BIOS、RTDX以及代码生成工具的包含文件。可参见TMS320C54X汇编语言工具用户指南。

C54X_C_DIR                        

由编译程序和连接程序使用的搜索表和用于DSP/BIOS、RTDX以及代码生成工具的包含文件。可参见TMS320C54X 最佳C编译器用户指南。

PATH

添加到路径定义中的文件夹列表。缺省将添加文件夹c:\ti\c5400\cgtools\bin和c:\ti\bin。

1.7.4增加DOS环境空间

如果使用的是Windows 95,你可能需要增加DOS界面的环境空间,以便支持建立一个CCS应用所需的环境变量。

把下一行添加到config.sys文件中,然后重新启动计算机:

shell=c:\windows\commad.com /e:4096 /p

第二章  开发一个简单的应用程序

本章使用hello world实例介绍在CCS中创建、调试和测试应用程序的基本步骤;介绍CCS的主要特点,为在CCS中深入开发DSP软件奠定基础。

在使用本实例之前,你应该已经根据安装说明书完成了CCS安装。建议在使用CCS时利用目标板而不是仿真器。如果没有CCS而只有代码生成工具和Code Composer或者是利用仿真器在进行开发,你只要按第二章和第四章中的步骤执行即可。

2.1 创建工程文件

在本章中,将建立一个新的应用程序,它采用标准库函数来显示一条hello world 消息。

1. 如果CCS安装在c:\ti中,则可在c:\ti\myprojects建立文件夹hello1。(若将CCS安装在其它位置,则在相应位置创建文件夹hello1。)

2. 将c:\ti\c5400\tutorial\hello1中的所有文件拷贝到上述新文件夹。

3.从Windows Start菜单中选择Programs→Code Composer Studio ‘C5400→CCStudio。(或者在桌面上双击Code Composer Studio图标。) 

注:CCS设置

如果第一次启动CCS时出现错误信息,首先确认是否已经安装了CCS。如果利用目标板进行开发,而不是带有CD-ROM的仿真器,则可参看与目标板一起提供的文档以设置正确的I/O端口地址。                                                               

4. 选择菜单项Project→New。

5. 在Save New Project As窗口中选择你所建立的工作文件夹并点击Open。键入myhello作为文件名并点击Save,CCS就创建了myhello.mak的工程文件,它存储你的工程设置,并且提供对工程所使用的各种文件的引用。

2.2 向工程添加文件

1. 选择Project→Add Files to Project,选择hello.c并点击Open。

2. 选择Project→Add Files to Project,在文件类型框中选择*.asm。选择vector.asm并点击Open。该文件包含了设置跳转到该程序的C入口点的RESET中断(c_int00)所需的汇编指令。(对于更复杂的程序,可在vector.asm定义附加的中断矢量,或者,可用3.1节上所说明的DSP/BIOS来自动定义所有的中断矢量)

3. 选择Project→Add Files to Project,在文件类型框中选择*.cmd。选择hello.cmd并点击Open,hello.cmd包含程序段到存储器的映射。

4. 选择Project→Add Files to Project,进入编译库文件夹(C:\ti\c5400\cgtools\lib)。在文件类型框中选择*.o*,*.lib。选择rts.lib并点击Open,该库文件对目标系统DSP提供运行支持。

5. 点击紧挨着Project、Myhello.mak、Library和Source旁边的符号+展开Project表,它称之为Project View。                                                                                

注:打开Project View

如果看不到Project View,则选择View→Project。如果这时选择过Bookmarks图标,仍看不到Project View,则只须再点击Project View底部的文件图标即可。

6. 注意包含文件还没有在Project View中出现。在工程的创建过程中,CCS扫描文件间的依赖关系时将自动找出包含文件,因此不必人工地向工程中添加包含文件。在工程建立之后,包含文件自动出现在Project View中。

如果需要从工程中删除文件,则只需在Project View中的相应文件上点击鼠标右键,并从弹出菜单中选择Remove from project即可。

在编译工程文件时,CCS按下述路径顺序搜索文件:

o 包含源文件的目录

o 编译器和汇编器选项的Include Search Path中列出的目录(从左到右)

o 列在C54X_C_DIR(编译器)和C54X_A_DIR(汇编器)环境变量定义中的目录(从左到右)。

2.3 查看源代码

1. 双击Project View中的文件hello.c,可在窗口的右半部看到源代码。

2. 如想使窗口更大一些,以便能够即时地看到更多的源代码,你可以选择Option→Font使窗口具有更小的字型。

#include 

#include "hello.h"

#define BUFSIZE 30

struct PARMS str =

{

2934,

9432,

213,

9432,

&str

};

void main()

{

#ifdef FILEIO

int i;

char scanStr[BUFSIZE];

char fileStr[BUFSIZE];

size_t readSize;

FILE *fptr;

#endif

puts("hello world!\n");

#ifdef FILEIO

for (i = 0; i  hello1.prn

                cd ..\hello2

                sectti hello.out > hello2.prn

比较hello1.prn和 hello2.prn文件可以发现使用stdio.h和DSP/BIOS时存储器段和空间大小的差别。与使用stdio中的puts()函数相比,DSP/BIOS调用LOG_printf时.text段占用的空间小。有关sectti工具的其它信息可参见TMS320C54x DSP/BIOS 用户指南。

3.6 进一步学习

进一步学习使用CCS 和DSP/BIOS,请参见CCS中 的在线帮助,也可参见CCS 用户指南和TMS320C54x  DSP/BIOS 用户指南。

第四章   算法和数据测试

    本章说明创建和测试一个简单算法的过程并介绍CCS附加功能。

本章将创建一个完成基本信号处理的程序,并在下两章继续介绍。

可用存储在PC机文件中的数据来建立和测试一个简单的算法,也可利用CCS的探针断点、图形显示、动态运行和GEL文件。

4.1 打开和查看工程

在CCS中打开一个工程文件并查看此工程中源文件和库文件。

1. 若CCS安装在c:\ti,那么就在c:\ti\myprojects下创建文件夹volume1(若CCS安装在其它位置,那么就在相应位置创建文件夹volume1)。

2. 将文件夹c:\ti\c5400\tutorial\volume1中的所有文件复制到新文件夹。

3. 如果CCS应用程序还未运行,则在开始菜单中选择ProgramCode Composer Studio’C5400CCStudio。

4. 选择ProjectOpen并在volume1中选择volume.mak文件并点击Open。

5. 

由于Project已经移动,CCS将显示一个对话框指示没找到库文件。点击Browse键,按路径c:\ti\c5400\cgtools\lib找到并选中rts.lib。(如果CCS安装在其它位置,那么在安装文件夹里找c5400\cgtools\lib)。

6. 点击符号+展开Project View,在Project中包含VOLUME.MAK、 Include、Libraries、Source。 

该Project中的主要文件有:

o volume.c  包含main()函数的C源程序

o volume.h 源程序volume.c包含的头文件,其中定义了各种常数和结构。

o load.asm 此文件包含load子程序,该子程序是一个能从C函数中调用的简单汇编循环子程序,该函数有一个入口参数、执行所需的指令周期为(31*argument)+13。 

o vectors.asm 此文件在第二章使用过,它定义了DSP的中断向量表

o volume.cmd 连接命令文件,它将各段映射到存储器中。

o rts.lib  为DSP目标系统提供运行支持。

4.2 查看源程序

在Project View窗口中双击volume.c文件,源程序就显示在CCS窗口的右边。

注意实例中的下面几部分:

o 主函数打印完信息后,应用程序处于无限循环状态。在此循环中,主函数调用dataIO和processing()函数。

o processing()函数将增益与输入缓存区中的各值相乘并将结果存入输出缓存区;同时也调用汇编Load子程序,该子程序占用的指令周期取决于传递给它的processingLoad值。

o dataIO函数是一个空函数,它的作用类似于return语句。可利用CCS中的探针(Probe Point)功能把主机文件中的数据读取到inp_buffer缓存区,此法优于用C代码来完成I/O功能。     

#include 

#include "volume.h"

int inp_buffer[BUFSIZE]; 

int out_buffer[BUFSIZE];

int gain = MINGAIN; 

unsigned int processingLoad = BASELOAD; 

extern void load(unsigned int loadValue);

static int processing(int *input, int *output);

static void dataIO(void);

void main()

{

int *input = &inp_buffer[0];

int *output = &out_buffer[0];

puts("volume example started\n");

while(TRUE)

{

dataIO();

processing(input, output);

}

}

static int processing(int *input, int *output)

{

int size = BUFSIZE;

while(size--){

*output++ = *input++ * gain;

}

load(processingLoad);

return(TRUE);

}

static void dataIO()

{

return;

}

4.3 为I/O文件增加探针断点

    本节介绍探针断点(Probe Point)的使用方法。探针可以从PC机的文件中读取数据,它是开发算法的一个有效工具。其使用方法如下:

o 将来自PC主机文件中的输入数据传送到目标系统的缓存器中供算法使用。

o 将来自目标系统缓存器中的输出数据传送到PC主机的文件中供分析。

o 用数据更新窗口,如图形窗口。

    与断点类似,它们都挂起目标系统来完成自己的动作,但存在如下几个方面的差别 :

o 探针立即中止目标系统,完成一个操作后,再恢复目标系统的运行。

o 断点暂停CPU直到人工恢复其运行为止,且更新所有打开的窗口。

o 探针允许自动执行文件的输入或输出,而断点则不行。

   本章介绍如何利用探针把PC机文件内容传送到目标系统中作为测试数据使用。当到达探测点时,同时使用断点更新所有打开的窗口,这些窗口包括输入和输出数据的图形窗口。第七章将阐述管理输入和输出数据流的两种方法。

1. 点击工具栏按钮或选择Project→Rebuild  All 。

2. 选择File→Lode Program并选取volume.out ,然后点击Open。

3. 在Project View窗口中,双击volume.c文件。

4. 将光标置于主函数中的 dataIO( )这一行上。DataIO函数起占位符作用。现在,它是一个很好的与探针断点相连接的地方,以便于从PC机文件输入数据。

5. 点击工具栏按钮(Toggle Probe Point),则光标所在行变为兰色高亮。

6. 选择File→File I/O,在File I/O 对话窗中可选择输入和输出文件。

7. 在File Input 栏中,点击Add  File。

8. 选择sine.dat 文件。

注意:在文件类型框中可以选择数据格式,sine.dat 文件包含正弦波形的16进制值。

9. 

点击Open,将该文件添加到File I/O对话框的列表上,接着出现sine.dat文件控制窗口(CCS窗口可以覆盖它)。在运行程序时,可用这个窗口开始、停止、重复、或快速前进来控制数据文件。

10. 

在File I/O对话框中,将Address修改为 inp_buffer,Length修改为100,选中Wrap Around。

o Address栏中的值指定来自文件的数据将要存放的位置,inp_buffer 是由volume.c文件声明为BUFSIZE的整数数组。

o Length栏中的值指定每次探针到达时读入多少个数据样点,使用100是因为BUFSIZE常数已由volume.h(0x64)设置为100。

o 当探针到达文件结尾时,Wrap Around选项使CCS从文件的开始读数据。即使数据样点只含有1000个值且每次探针到达时读取100个值,也可将数据看作连续的数据流。

11. 点击Add Probe Point,Break\Probe\Profile Points 对话窗的Probe Point栏就会出现。

12. 加亮(对话框中)显示的第五步的断点设置。

13. 点击Connect栏尾处的下箭头,在其下拉菜单中选择sine.dat 文件。

14. 点击Replace。 Probe Point列表将显示探测点已连接到sine.dat 文件。

15. 点击OK。 File I/O对话框则显示文件现已被连接到探测点。

16. 在File I/O对话框,点击OK。

4.4 显示图形

如果现在就运行程序的话,你将无法了解到更多的程序运行时的信息。可以在 inp_buffer 和 out_buffer数组的地址范围内设置观察变量,但需要设置很多变量,而且是按数字形式显示而非图形形式。

    CCS 提供了多种用图形处理数据的方法。在本例中,你将看到一个基于时间绘制的图形。本节介绍图形的打开,下节介绍程序的运行。

1. 选择View→Graph→Time/Frequency。

2. 

在弹出的Graph Property Dialog对话窗中, 将 Graph Title,Start Address,Acquisition Buffer Size,Display Data Size,DSP Data Type,Autoscale和Maximum Y-value 的属性改变为如下图所示。向下滚动或调整 dialog 框的大小可看到所有的属性。

3. 点击OK,出现输入缓存的一个图形窗。

4. 在上述窗中右击鼠标,从弹出的菜单中选择Clear Display。

5. 再次选择ViewGraphTime/Frequency。

6. 改变Graph Title的属性为Output Buffer,改变Start Address的属性为Out_buffer,其余的设置都不变。

7. 点击OK,又出现一个图形窗,在该图形窗内右击鼠标,从弹出的菜单中选择Clear Display。

4.5 执行程序和绘制图形

    到目前为止,你已经放置好了一个探针,它可临时暂停目标系统,将数据从PC主机传送到目标系统,并将恢复目标系统应用程序的运行。但是,探针不能刷新图形。在本节中,将设置一个可刷新图形的断点,使用Animate 命令在遇到断点后,自动恢复目标系统应用程序的运行。

1. 在C源程序volume.c窗口中,将光标放置在dataIO行。

2. 点击(Toggle  Breakpoint)工具栏按钮或按F9,该行显示为红色和蓝色高亮(除非用Option→Color改成其它颜色),表明在这一行已经设置了断点和探针。在同一行上既放置探针又放置断点,它能够使目标系统只暂停一次而完成两个操作:数据传输和图形刷新。

3. 重新安排窗口以便能同时能看到这两个图形。

4. 点击工具栏按钮或按F12运行程序。Animate命令与Run命令相似,它使目标系统应用程序一直运行到断点,随后,目标系统应用程序暂停并刷新窗口。但是,与Run命令不同的是,Animate命令恢复目标系统应用程序运行到下一个断点,而且此过程是连续的,直到目标系统被人工停止。所以,Animate命令可看作运行-中断-继续(run-break –continue)过程。

5. 

注意每个图形包含2.5个周期的正弦波形,且在程序运行过程中两个图形反向。每次到达探测点时,CCS 从sine.dat文件中得到100个值,再将这100个值写入inp_buffer地址。符号相反是因为输入缓冲区包含的值是从sine.dat文件中读取的,而输出缓冲区最后的值是经过函数处理后得到的。

注意:目标系统运行程序在探测点暂停

不管何时到达探测点,CCS都能暂时停止目标系统。因此,如果使用了探针,目标系统应用程序就不能满足实时期限的要求。在本开发阶段只测试算法,以后将用RTDX和DSP/BOIS分析实时性能。                                              

只使用测试点和Run命令也能刷新图形,4.10节将详细介绍。

4.6 调节增益

    回顾4.2节,processing函数将增益与输入缓存区中的各值相乘并将结果存入输出缓存区;在一个While循环中用如下语句完成此功能。

*output++ = *input++ * gain;

    该语句将增益与输入缓存区中的各值相乘并将结果存放在out_buffer中相应的位置上。gain初始化为MINGAIN,而MINGAIN已经在volume.h中定义为1。要改变输出幅度得修改gain值。修改gain值的一种方法是采用观察变量。

1. 选择view→Watch Window

2. 在Watch窗中右击鼠标,并从弹出菜单中选择Insert New Expression。

3. 在Expression区敲入gain并单击OK,变量值出现在Watch窗口。

4. 如果程序已暂停,点击工具栏按钮(Aminate),重新开始运行程序。

5. 在Watch窗口中双击gain。

6. 在Edit Variable窗口中修改gain值为10,并点击OK。

7. 注意在Output Buffer图形中信号幅度变化反映了增益的提高。

4.7 观察范围外变量

你曾使用Watch Window观察过变量并改变变量的值。但当你想查看的变量的作用域不在当前设置的断点范围内时,则可使用访问堆栈来查看。

1. 点击工具栏按钮或按Shift F5暂停程序运行。

2. 用CCS 重新查看volume.c程序。注意在主函数与processing函数中已经定义了变量*input,但它没有在数据输入输出函数中定义。

3. 在显示源程序volume.c的窗口中,把光标放置在dataIO()函数的return行上。

4. 点击工具栏按钮或按F9,该行变为红色高亮显示(除非你用Open→Color改变颜色)。

5. 

点击F5执行程序,CCS将自动把断点移到相应函数的下一条汇编指令处。对话框通知你将把断点移到下一行。

6. 点击OK

7. 按下F5,程序运行直到dataIO()函数末尾的断点处暂停。

8. 

在Watch窗口中点击鼠标右键并从弹出菜单中选择Insert New Expression。

9. 在Expression区键入*input并点击OK。

10. 

注意在Watch窗口中显示该变量是一个未知符号,这说明*input 没有在dataIO()函数内定义。

11. 选择View→Call Stack,则可看到相邻的堆栈窗与观察窗。

12. 

在堆栈窗中点击main()就可在主函数范围内查看*input的值。

13. 可以点击堆栈窗底部的地址以便看清楚gain是全局变量,而*input则不是。(地址的变化依赖于正使用的DSP)

14. 在堆栈窗中点击鼠标右键并从弹出菜单中选择Hide。

15. 将光标放置在datdIO()函数中的return之后的行上,撤消第4步中放置的断点,点击工具栏按钮或单击F9。

4.8 使用GEL文件

    CCS 提供了修改变量的另一种方法,该方法使用一种扩展语言GEL来创建可修改变量的小窗口。

1. 选择File→Load GEL。在Load GEL File对话框中选择volume.gel文件并点击Open,这个选项是在上步加载GEL文件时自动增加的。

2. 选择GEL→Application Control→Gain,弹出如右图所示的小窗口。

3. 如果程序已经暂停,点击工具栏按钮 (Animate)。注意即使在弹出的gain小窗口中值为零,其实gain的当前值并未改变。只有滑动指针时gain值才发生变化。

4. 在gain窗口中用滑动指针改变gain值,则在Output Buffer窗口中的正弦波形幅度相应改变。此外,无论任何时候移动滑动指针,在Watch窗口的变量gain的值将随之改变。

5. 点击工具栏按钮或按下Shift F5暂停程序运行。

6. 为了了解Gain GEL函数的工作情况,点击Project View中GEL文件前的 +符号,然后在VOLUME.GEL文件上双击鼠标便可查看其内容:

menuitem "Application Control"

dialog Load(loadParm "Load")

{

processingLoad = loadParm;

}

slider Gain(0, 10 ,1, 1, gainParm)

{

gain = gainParm;

}

Gain函数定义的滑动指针范围:0到10,其步长为1。当移动滑动指针时,变量gain的值将随滑动指针的改变而改变。

4.9 调节和测试processing函数

在第二章中曾使用测试点(profile-points)测试puts()所需的指令周期数。现在,来使用测试点查看变量processingLoad改变后的结果,此结果将传递给汇编Load程序。 ProcessingLoad初始化为BASELOAD, 而BASELOAD在volume.h中定义为1。

1. 选择Profiler→Enable Clock,确保Enable Clock使能。

2. 在Project View 中,双击volume.c文件。

3. 选择View→Mixed Source/ASM使能,查看C源程序及其相应汇编指令。

4. 把光标放置在 load(processingLoad) 行后的汇编指令上。

5. 点击工具栏按钮或点击鼠标右键选择Toggle Profile  Pt。

6. 把光标放置在 return(true) 行后的汇编指令上。

7. 点击工具栏按钮(Toggle Profile-point)。

8. 选择Profiler→View Statistics。在Profile Statistics 窗口中的location栏显示了新增测试点对应的汇编指令或地址。可以通过改变Statistics area区域的大小查看更多内容;或者在Statistics area区域内点击鼠标右键,选择Allow Docking可在一个单独窗口中显示Statistics。

9. 点击工具栏按钮或按F12。

10. 

注意在第二个测试点处显示的最大周期数大约为44(真实值可能不同),当processingLoad=1时,它表明执行Load程序所需的指令周期数。

11. 选择GEL→Application Control→Load。

12. 

在load域输入2,然后点击Execute,则对应于第二个测试点的最大周期数改变为75。每当processingLoad增加1时,指令周期数就增加31。这些指令周期数表明load函数的执行时间,load函数包含在load.asm文件中。

13. 在Profile Statistics窗口中点击鼠标右键,从弹出菜单中选择Clear All,这将把Statistics复位为0。平均值、最大值和最小值都等于当前processingLoad的指令周期数。

14. 点击工具栏按钮或按Shift F5暂停程序运行。

15. 在第五章开始之前,先执行下列步骤释放在本节中使用的资源

o 关闭Load、Gain控制窗口、sine.dat控制窗口以及Time/Frequency图形窗。

o 选择File→File I/O并点击Remove File删除sine.dat文件。

o 选择Profiler菜单撤消Enable Clock前的“√”。

o 在Profile Statistics窗口中点击鼠标右键并在弹出菜单中选择Hide。

o 选择Debug→Breakpoints,然后选择Delete All并点击OK。

o 选择Debug→Probe Points,然后选择Delete All并点击OK。

o 选择Profiler→profile-point,然后选择Delete All并点击OK。

o 选择View菜单撤消MixedSource/ASM前的“√”。

o 关闭打开的窗口和工程(Project→Close)。

o 在project View中的volume.gel上击鼠标右键并选择Remove。

o 在Watch Window中删除表达式并隐藏Watch Window。

4.10 进一步探索

   为了进一步了解CCS,试做如下工作:

o 把processingLoad加到Watch Window,当使用Load GEL 控制时,在Watch Window中processingLoad的值将被更新。

o 在Watch Window中点击鼠标右键,在弹出菜单中选择Insert New Expression,并点击Help按钮则可得到你可以使用的数据格式。试用各种不同的格式。例如:你可键入*input,x作为Expression观察正弦输入数据的16进制格式。

o 在volume.h文件中把BUFSIZE修改为0x78(或120)并重新编译,然后重新加载程序。选择File→File I/O,将对话框中Length值修改为0x78。选择View→Graph→Time/Frequency,在弹出的图表中将Acquisition Buffer Size和Display Data Size均修改为0x78,这将使缓存器存入3个完整的正弦波而不是2.5个。点击工具栏按钮(Animate),注意缓冲器输入输出波形是同相的。

o 试着使用时钟数来实现测试点的统计计数。用断点代替测试点,选择Profiler→View Clock。将程序运行到第一个断点, 双击clock使统计数清零。再次运行程序,时钟则显示了程序运行到第二个断点的周期数。

o 使用探针重复4.3节到4.5节,这次只使用探针和Run命令。由于一个探测点只能对应一个操作,所以需要设置三个探测点。现在,有两个图形需要刷新,一个文件作为输入,每一个操作都有各自的探针。

注意每一个探测点必须设置在不同的代码行上。结果,目标系统需要暂停三次,而且在目标系统运行时,操作不能在同一个探测点完成。由于上述原因,本节中将探针和断点结合比只使用探针更有效。

o 为了练习用CCS编译工程文件。将c:\ti\c5400\tutorial\volume1文件夹中的所有文件拷贝到一个新文件夹中。首先,删除volume.mak文件,然后使用CCS的Project 菜单项中的Project→New 和Project→Add File重建工程。可参见4.1节。     

4.11 进一步学习      

进一步学习关于Probe Points、graphs、animation和GEL文件的知识,请参见CCS中的在线帮助或CCS用户指南。 

第五章 程序调试

本章介绍程序调试技术和几个DSP/BIOS插件模块。

在本章中,将修改第四章的应用程序实例创建一个多线程的实例并为调试目的查看执行性能,还可以了解有关DSP/BIOS的更多的功能,其中包括Execution Graph、实时分析控制板(RTA Control Panel)、Statistics View和CLK、SWI、STS、TRC模块。

基本要求:目标板和CCS的DSP/BIOS组件。

5.1 打开和查看工程

首先在CCS中打开工程,查看工程中的源文件和库文件。

1. 如果CCS安装在c:\ti目录下,就创建c:\ti\myprojects\volume2目录。(如果CCS安装在其它位置,就在相应位置创建volume2目录)

2. 将目录c:\ti\c5400\tutorial\volume2下的所有文件拷贝到新目录下。

3. 从WINDOWS“开始”菜单中选择“程序”→Code Composer Studio 5400→CCStudio

4. 选择Project→Open,在文件夹中选择volume.mak文件并点击Open。点击Project、VOLUME.MAK、 DSP/BIOS Config和Source后面的+号展开Project View。根据配置文件创建的volumecfg.cmd文件包含许多DSP/BIOS头文件(不需要检查所有的头文件)

工程中的文件包括:

o volume.cdb 配置文件。

o volume.c 包含main()函数的C源程序

o volume.h 包含在volume.c中的头文件,它定义了各种常数和结构,它与前一章所用的volume.h文件相同。

o load.asm 此文件包含Load子程序,该子程序是一个能从C函数中调用的简单汇编循环子程序。它与前一章中所用的load.asm相同。

o volumecfg.cmd 连接命令文件,在保存配置文件时创建

o volumecfg.s54 汇编源文件,在保存配置文件时创建

o volumecfg.h54 头文件,在保存配置文件时创建

5.2 查看源程序

本章通过由第四章的应用程序修改而得的程序实例来介绍实时操作。该实例采用片内定时器中断模拟周期性的外部中断实现数据的输入/输出,只需对其稍加修改就可真正通过外部中断实现数据的输入/输出。

1. 在Project View中双击volume.c,则源程序显示在CCS窗口的右半部分。

2. 注意本实例中的下述几个方面:

o 数据类型的变化。DSP/BIOS提供的数据类型适用于其它处理器,它的绝大部分数据类型与C语言的数据类型相对应。

o C源程序中包括三个DSP/BIOS头文件:std.h、 log.h和swi.h,而且std.h必须放在其它DSP/BIOS头文件之前。

o 配置文件中创建的对象声明为外部变量。你可在下一节查看配置文件。

o 主函数不再调用dataIO和processing函数,而仅仅是在调用LOG_printf显示信息后返回,这将使应用程序进入DSP/BIOS空循环,而后由DSP/BIOS处理各线程。

o processing函数由processing_SWI软中断调用,软中断的优先级低于所有硬件中断。但也可以用硬件中断ISR直接完成信号处理。然而,信号处理可能需要大量机器周期而无法在下一次中断信号到达之前完成,这将妨碍中断信号的处理。

o dataIO函数调用SWI_dec,SWI_dec利用软中断作计数器减法。当计数器为0时,软中断就安排函数的执行并复位计数器。

dataIO函数仿真基于硬件的数据I/O,一个典型的程序就是在缓存区积累数据,直到有足够的处理数据为止。本实例中,每当processing函数运行一次,dataIO函数就执行10次,计数器的减计数由SWI_dec控制。

#include 

#include 

#include 

#include "volume.h"

Int inp_buffer[BUFSIZE]; 

Int out_buffer[BUFSIZE];

Int gain = MINGAIN; 

Uns processingLoad = BASELOAD; 

extern LOG_Obj trace;

extern SWI_Obj processing_SWI;

extern Void load(Uns loadValue);

Int processing(Int *input, Int *output);

Void dataIO(Void);

Void main()

{

LOG_printf(&trace,"volume example started\n");

return;

Debugging Program Behavior 

Int processing(Int *input, Int *output)

{

Int size = BUFSIZE;

while(size--){

*output++ = *input++ * gain;

}

load(processingLoad);

return(TRUE);

}

Void dataIO()

{

SWI_dec(&processing_SWI);

5.3 修改配置文件

对于本实例,DSP/BIOS的配置文件已经创建。在本节中,你可以查看缺省配置中的对象。

1. 在Project View双击volume.cdb文件(在DSP/BIOS的Config文件夹中)

2. 点击CLK、 LOG和 SWI managers旁边的符号+。

3. 点击LOG中的trace项,你可以从窗口的右半部分查看它的特性。这些特性与3.1节创建的trace LOG是一样的。volume.c调用LOG_printf将volume example started写入这个log中。

4. 

在LOG对象LOG_system上鼠标右键,从弹出菜单选择Properties。你可以看到该对象的属性对话窗。在程序运行时,它记录各种DSP/BIOS模块的系统跟踪事件。

5. 将buflen域的值修改为512,点击OK。

6. 高亮度显示CLK目标dataIO_CLK。注意,当CLK目标被激活时才调用_dataIO函数,它是volume.c中的数据I/O函数。

注:前缀与C函数名称

由于保存配置文件时会产生汇编语言文件,所以C函数名称要加一下划线作前缀。此下划线前缀是约定由汇编转而访问C函数的一种标记。(其细节可参见TMS320C54x最佳化C编译器用户指南有关C语言和汇编语言接口部分)。

此规则仅适用于用户编写的C函数,对于配置文件产生的对象或DSP/BIOS API调用则无须加下划线前缀,因为相应的两种名称会自动建立,一种会被加上前缀,一种则不会有前缀。

7. 由于dataIO函数不再在主函数中被调用,那由什么事件来激活该CLK对象呢?要想找到答案,在CLK-Clock Manager对象上点击鼠标右键并从弹出菜单中选择Properties,你将看到Clock Manager Properties对话窗口。

注意,在Enable CLK Manager项前有可选标记,当选中时由定时器中断驱动CLK管理器。

8. 

不作任何变动仅点击Cancel关闭Clock Manager Properties对话窗口。

9. 展开HWI对象查看HWI_TINT的属性,其中断源是DSP 定时器,当片内定时器引起中断时,它运行CLK_F_isr函数。CLK对象函数的运行是由CLK_F_isr硬件中断服务函数引发的,它的优先级高于软中断,一旦运行便不会被打断。(由于CLK_F_isr已经保护了寄存器现场,所以CLK 函数不需要象硬件中断服务程序中正常情况下须做的那样保存和恢复现场。)

10. 在软中断对象processing_SWI上点击鼠标右键并从弹出菜单中选择Properties。

function  软中断激活时运行processing函数,见5.2节。

o mailbox   mailbox域的值可控制何时运行软中断。有几种API调用会影响mailbox的值,并且所产生的值将决定是否登记软中断。当软中断被登记时,具有最高优先级的软中断或硬中断服务例程将运行。

o arg0, arg1  传递给processing函数的inp_buffer和 out_buffer的地址。

11. 不作任何改变仅点击Cancel关闭Properties对话窗口,。

12. 由于processing函数不再在主函数中运行,那什么事件将导致SWI对象运行其函数?在源程序volume.c中, SWI_dec被dataIO函数调用,它递减mailbox域中的值,当mailbox域中的值为0时,则登记软中断。所以,data_CLK对象运行dataIO函数10次,SWI对象就运行其函数一次。

13. 选择File→Close,将询问是否保存修改过的volume.cdb文件。点击Yes保存,保存时将产生volumecfg.cmd、volumecfg.s54和volumecfg.h54。

14. 点击工具栏按钮或选择Project→Build。

5.4 用Execution Graph查看任务执行情况

当在processing函数中设置探测点并使用图形方式观察输入输出结果时(见前一章),你已经完成了信号处理算法的测试。本阶段注意的焦点应该是明确任务可以满足实时期限的要求。

1. 选择File→Load并选取volume.out,然后点击OK。

2. 选择Debug→Go Main,程序运行到主函数的第一条语句。

3. 选择Tools→DSP/BIOS→RTA Control Panel,在CCS窗口底部将出现几个可选项。

4. 在几个可选项所在窗口区域内点击鼠标右键,取消Allow Docking显示方式或选择Float in Main Windows方式显示RTA Control Panel。调整窗口尺寸以便看到所有选项。

5. 在选择框内放置选中标志使能SWI和CLK,并使能global host enable,如右图示。

6. 选择Tools→DSP/BIOS→Execution Graph。Execution Graph出现在CCS窗口底部,并可调整其显示方式和大小。

7. 在RTA Control Panel上点击鼠标右键并从弹出菜单中选择Property Page。

8. 确认Message Log/Execution Graph的刷新频率为1秒,然后点击OK。

9. 

点击或选择Debug→Run,则Execution Graph显示如下。

10. 在Time行的标记给出了Clock Manager运行一次CLK函数的时间。按标记计算processing_SWI执行的时间间隔。在此有10个标记表明:dataIO_CLK对象每执行10次,processing_SWI对象就执行一次。这正如所预料的一样,因为被dataIO函数递减的mailbox域的起始值为10。

5.5 修改和查看load值

使用Execution Graph,你可以看到该程序满足其实时期限的要求。然而,一个典型应用程序的信号processing函数所要完成的任务会比将数据乘以一个系数并将结果拷贝到另一缓冲区中更复杂、耗费的周期数更多。为此,可以通过增加Load函数占用的指令周期来模拟这样的复杂任务。

注:在本实例中Load值

    下面的Load值适用于以100MIPS运行的C549的。如果所采用的C54x是以不同速率的运行的,则需要将值乘以该C54x的MIPS/100。如果不知道该MIPS值,可打开volume.cdb查看称之为DSP MIPS的Global Setting属性(CLKOUT)。

1. 选择Tools→DSP/BIOS→CPU Load Graph,将出现一个空白的CPU Load Graph窗口。

2. 在RTA Control Panel上点击鼠标右键并从弹出菜单选择Property Page。

3. 将Statistics View/CPU Load Graph中的Refresh Rate修改为0.5秒并点击OK。注意当前CPU的load值非常低。

由于Statistics View和CPU Load仅将少量数据从目标板传送到主机,因此你可以频繁地刷新这些窗口数据而不会对运行程序造成大的影响。Message Log和Execution Graph传送的数据是有关配置文件中定义的LOG对象的缓存长度属性的,其数据量大,因此不能频繁地刷新这两个窗口。

4. 选择File→Load GEL并选择volume.gel,然后点击Open。

5. 选择GEL→Application Control→Load。

6. 键入3000作为新的load值,然后点击Execute,CPU负荷增加到7%左右。

7. 在Execution Graph项点右键,从弹出菜单选择Clear,注意此时程序仍满足其实时期限的要求。在processing_SWI函数各次执行之间存在10个时间标记。

8. 使用GEL控制修改load值为5000,然后点击Execute。

9. 

在Execution Graph区域内点击鼠标右键并从弹出菜单中选择Clear。在processing_SWI函数执行期间出现了一个时间标记,这意味着程序不满足实时期限的要求吗?不,它只表明运行程序的功能正确。能够引起CLK对象的服务例程运行的硬中断能够中断软中断服务例程的执行,而在软中断服务例程再次运行之前,它能够完成自己的任务。

10. 使用GEL控制修改load值为3000,然后点击Execute。CPU的负荷增加到95%左右。

11. 

在Execution Graph区域内点击鼠标右键并从弹出菜单中选择Clear。因为processing_SWI在10个时间标记发生之前完成,所以程序仍满足实时期限的要求。

12. 使用GEL控制修改load值为35000,然后点击Execute。由于刷新过程在空闲任务中实现,而空闲任务在该程序中具有最低优先级,所以CPU Load Graph窗口 和 Execution Graph窗口将停止频繁刷新甚至于可以停止刷新。又由于其它高优先级线程占用了CPU的全部处理时间,因此无足够的时间用于主机控制完成更新。此时,程序不满足其实时期限的要求。

13. 选择Debug→Halt,这将暂停程序的运行并刷新Execution Graph窗口。当应用程序不满足实时期限的要求时,窗口中的Assertions行将显示出错信息。

14. 使用GEL控制修改load值为10,然后点击Execute,则CPU Load Graph和Execution Graph窗口将再次刷新。

注:采用RTDX修改Load

采用Load GEL控制可暂停目标系统。如果正在分析一个实时系统,又不想影响系统性能,则可采用RTDX修改Load。下一章将说明如何用RTDX修改实时Load。

5.6 分析任务的统计数据

可使用DSP/BIOS的其它控制功能查看DSP的Load值和processing_SWI对象的处理过程的统计数据。

1. 选择Tools→DSP/BIOS→Statistics View将出现一个Statistics View区域,它显示Load  DSP/BIOS程序和/或设置使用控制功能的属性。

2. 

在Statistics View区域中点击鼠标右键并从弹出菜单中选择Property Page,按下图加亮相应项并点击OK。

3. 

你将看到processing_SWI对象的统计域。(在该统计域上点击鼠标右键并从弹出菜单中撤消Allow Docking)可使其成为一个单独的窗口,也可调整窗口大小使得全部四个域均可见。

4. 在RTA Control Panel中,在SWI累积器前放置选中标记“√”。

5. 若已暂停程序,点击工具栏按钮    (Run)。

6. 注意Statistics View中的Max值,SWI的统计计数单位为指令周期。

7. 使用GEL控制增加load值,然后点击Execute。注意Max值的改变,这是为从processing_SWI运行开始到结束所完成的指令数增加了。

8. 使用不同的load值试验。减小load值,在Statistics View区域内点击鼠标右键并从弹出菜单中选择Clear,这将把所有统计域复位到它们各自的最小可能值,这样你可以从Max域中观察到当前的指令周期数。

9. 点击工具栏按钮(Halt),关闭所有已经打开的DSP/BIOS和GEL控制项。

5.7 增加STS显式测试

在前面的章节中,曾用Statistics View观察了软件中断服务例程执行期间完成的指令周期数。如果使用配置文件,DSP/BIOS自动支持统计功能,这称为隐式测试。也可使用API调用收集其他统计数据,这称为显式测试。

1. 在Project View中,双击volume.cdb文件(该文件在DSP/BIOSConfig文件夹中)以便打开它。

2. 在STS manager上点击鼠标右键并从弹出菜单中选择Insert STS。

3. 将新增加的对象STS0更名为processingLoad_STS。该对象的缺省属性完全是正确的。

4. 选择File→Close,将询问你是否保存修改过的volume.cdb,点击YES。

5. 在Project View中,双击volume.c打开它进行编辑。对程序作如下修改:

o 在包含swi.h的文件的那一行下中增加下列内容:

#include 

#include 

#include 

o 在标有注释 “Objects created by the Configuration Tool”的程序段中添加下述声明语句:

extern STS_Obj processingLoad_STS;

o 在load函数调用前的processing函数中添加以下内容:

if (TRC_query(TRC_USER0) == 0) {

STS_set(&processingLoad_STS, CLK_gethtime());

}

o 在load函数调用后的processing函数中的添加如下语句:

if (TRC_query(TRC_USER0) == 0) {

STS_delta(&processingLoad_STS, CLK_gethtime());

}

6. 选择File→Save保存修改过的volume.c文件。

7. 点击工具栏按钮或选择Project→Build。

5.8 观察显式测试统计数据

要观察由新增STS显式测试所提供的信息,可使用Statistics View和 RTA Control Panel。

1. 选择File→Load Program,选择你刚刚建立的程序volume.out,然后点击Open。

2. 选择Tools→DSP/BIOS→RTA Control Panel。

3. 在RTA Control Panel区域点鼠标击右键,然后取消Allow Docking选项使RTA Control Panel显示为一个独立的窗口。调整窗口尺寸到能够看到所有选项。

4. 将选中标记“√” 放置在enable SWI accumulators、enable USER0 trace和global host enable前面的选择框中 。

使能USER0跟踪,使得TRC_query(TRC_USER0)调用的返回值为0。

5. 选择Tools→DSP/BIOS→Statistics View。

6. 在Statistics View区域点击鼠标右键并从弹出菜单中选择Property Page,然后加亮对象processing_SWI和processingLoad_STS,并加亮所有的四个统计选项。

7. 

点击OK,可看到两个对象的统计域。在该域上点击鼠标右键并从弹出菜单中撤消Allow Docking,可使该区域成为一个单独的窗口,亦可调整窗口大小使全部域可见。

8. 点击工具栏按钮或选择Debug®Run。

9. 用processingLoad_STS的Max值减去processing_SWI的Max值,其结果约为1445条指令(实际显示的值可能有变化)。SWI的统计数据是用指令周期来度量的。因为曾用CLK_gethtime函数作为处理load值的基准,所以processingLoad_STS由片内定时计数器计数,它等同于指令周期数。这些指令是在processing函数中执行的,而不是在STS_set和STS_delta调用之间执行的,如下所示。

例如,当load值为10时,processingLoad_STS的Max值约为203,而processing_SWI的Max值约为1648。在STS_set函数和STS_delta函数之外的processing函数中所执行的指令周期数的计算公式为:1648 - 203 = 1445

10. 选择GEL→Application Control→Load(如果已关闭CCS 而后又重新启动它,则必须重装GEL文件)

11. 修改load值,然后点击Execute。

12. 注意当两个Max都增加时,而它们的差值却保持不变。

13. 从RTA Control Panel中取消enable USER0 trace前的选中标记“√”。

14. 在Statistics View区域内点击鼠标右键并从弹出菜单中选择Clear。

15. 注意,processingLoad_STS的统计值没有改变,这是因为没有选中USER0跟踪选项,使下面这条语句的条件不能满足:

       if (TRC_query(TRC_USER0) = = 0)

   因此,不执行对STS_set和 STS_delta的调用。

16. 完成下面的步骤,以便为下一节做准备。

o 点击工具栏按钮或按Shift F5暂停程序的运行。

o 关闭所有GEL对话窗口、DSP/BIOS插件和源程序窗口。

5.9 进一步探索

为了进一步探索DSP/BIOS,试做下述工作:

o 在配置文件中,将SWI Manager的Statistics Units的属性修改为毫秒或微秒,重新编译和加载应用程序并请注意观察Statistics View中统计值的变化情况。

o 修改volume.c源文件,用CLK_getltime函数代替CLK_gethtime函数。重新编译和加载应用程序并观察Statistics View中统计值的变化情况。函数CLK_getltime使Execution Graph窗口中时间标记分辨率变低。当使用CLK_getltime时,必须明显地增加load值以改变Statistics View中的数值。

5.10 进一步学习

欲了解有关CLK、SWI、STS和TRC模块的知识,请参见CCS中的在线帮助或TMS320C54x DSP/BIOS用户指南。

第六章 实时分析

本章介绍程序的实时分析技术并纠正程序中存在的错误。

本章中,将用第五章的例子来作实时分析并纠正与实时性有关的问题。将采用RTDX对目标系统作实时改动,将使用DSP/BIOS周期函数并设置软中断优先级等。

基本要求:CCS的DSP/BIOS和RTDX组件、目标板

6.1 打开和查看工程

本章的工作是在前一章工作基础上进行的,如果没有做前一章的工作,可以把目录c:\ti\c5400\tutrial\volume3中的文件拷贝到你的工作文件夹下。

1. 从目录c:\ti\c5400\tutrial\volume4下拷贝下述文件到你的工作文件夹中(注:不要拷贝所有文件,特别不要拷贝volume.cdb)

o volume.c 采用RTDX的源程序,它无需中止运行程序即可修改load值。

o loadctrl.exe 用VB5.0编写的Windows应用程序,它采用RTDX实时发送load值到目标板中。

o loadctrl.frm,loadctrl.frx,loadctrl.vbp 如果你拥有VB5.0开发环境,你可以用它来查看loadctrl.exe应用程序的源文件。

2. 从Windows开始菜单中,选择Programs→Code Composer Studio ’C5400→CCStudio。

3. 选择Project→Open并从你的工作文件夹中打开volume.mak。

6.2 修改配置文件

在本例中,你需要增加一个新对象到配置文件volume.cdb中(该文件已经存在于c:\ti\c5400\tutorial\volume4 目录中)

1. 在Project View的volume.cdb处双击鼠标左键。

2. 选择LOG_system,将属性值buflen修改为512并点击OK。

3. 在PRD magager处点击鼠标右键,并从弹出菜单中选择Insert PRD。

4. 将PRD0改名为loadchange_PRD。

5. 在loadchange_PRD处,点击鼠标右键,并从弹出菜单中选择Properties。

6. 将loadchange_PRD属性设置为下述值并点击OK。

o 周期值设为2。缺省状态下,PRD manager使用CLK maganer驱动PRD。CLK类触发PRD的缺省值为1ms,因此PRD对象每2ms执行一次其服务例程。

函数名修改为_loadchange。PRD对象以所选定的周期执行loadchange函数。在下一节中,可查看该函数。

7. 点击SWI maganer旁的‘+’号,可以发现已经自动增加了一个名为PRD_swi的SWI对象。在运行时,软中断执行周期函数,因此,所有PRD函数均在软中断服务例程中被调用,且调用时须保护现场。相应地,CLK函数被硬中断服务例程调用。

8. 点击CLK manager旁的‘+’号,可以发现名为PRD_clock的CLK对象调用PRD_F_tick函数,该函数促使DSP/BIOS系统时钟计时(通过调用PRD_tick API函数),如果有PRD函数需要运行将产生PRD_swi软中断。

9. 在PRD manager处,点击鼠标右键,并从弹出菜单中选择Properties。选择Use CLK Manager to drive PRD。若在你的工程文件中没有选择该属性,则PRD_clock对象将自动删除,你的程序可以从其他事件(如硬中断)中调用PRD_tick来驱动周期函数。

10. 回忆一下processing_SWI对象,它的mailbox值为10,而且mailbox值在dataIO_CLK对象中每经1ms就减1,因此processing_SWI每10ms运行1次,而loadchange_PRD每2ms运行1次。

11. 选择File→Close,根据提示选择Yes保存volume.cdb,这将自动产生volumecfg.cmd,volumecfg.s54,volumecfg.h54文件。

12. 选择Project→Rebuild All或者点击工具栏按钮(Rebuild All)。

6.3 查看源程序

在Project View的volume.c处双击鼠标左键,源文件将显示在CCS窗口的右半部分。由于文件volume.c是从c:\ti\c5400\tutorial\volume4 目录中拷贝到你的工作文件夹中的,因此它与前一章的源程序存在下述差别:

o 增加了一个头文件:

#Include 

o 增加了两条声明语句:

RTDX_CreateInputChannel(contro_channel);

Void loadchange(Void);

o 在主函数中增加了下列函数调用:

RTDX_enableInput(&control_channel)

o 下述函数为PRD对象调用的函数

Void loadchange()

{

static Int control = MINCONTROL;

if (!RTDX_channelBusy(&control_channel)) {

RTDX_readNB(&control_channel, &control,

LOG_printf(&trace,"Control value out of range");

}

else {

processingLoad = BASELOAD 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3