教你如何使用CCS进行DSP编程-从入门到精通【最全】

教你如何使用CCS进行DSP编程-从入门到精通【最全】
教你如何使用CCS进行DSP编程-从入门到精通【最全】

使用CCS进行DSP编程(一)

——CCS编程入门

pacificxu

TI公司提供了高效的C编译器和集成开发环境Code Composer Studio,学习‘C6X的编程应该从学习CCS的使用开始。

首先安装CCS,CCS的安装有详细的说明,并配有简短的Quick Time的多媒体介绍,对于没有购买CCS的用户,可以从TI处得到30天的试用版(没有硬件仿真功能)。

使用CCS前需要对CCS进行设置,以Simulator为例,运行Setup CCS C6000 1.20,安装Device Driver,对于有硬件支持的仿真器,可以选择配套的CCS驱动,设置完成的画面如下图所示:用户的界面大致相同。

接下来就可以运行CCS了,CCS提供了比较好的例子,对于初学者,仔细学习这些例子,会起到事半功倍的效果。在CCS的Help菜单的Tutorial子菜单下,给出了四个教程,分别是:Code Composer Studio Tutorial、Advanced DSP/BIOS Tutorial、Compiler Tutorial和RTDX Tutorial,用户可以从简单的CCS功能

开始,如创建一个工程文件Project,到创建一个完善的用户程序一步一步的进行。

下面是Code Composer Studio Tutorial的例子:

分别从生成一个简单的“Hello World”程序,到使用DSP/BIOS功能,到程序的调试,实时分析,I/O操作等分6课来讲解,可以领略TI的CCS的强大功能。

下面以“Hello World”程序为例讲一下CCS的使用。

首先打开一个Project文件

这些文件的路径如下图所示:

打开hello.mak,会看到如下图所示的界面。将File View栏中的“+”号都打开,会看到整个项目工程中的所有资源。

其中*.c文件和*.h文件与普通的C语言编程中是一致的(TI编译器支持ANSI C标准)。需要指出的是三个文件:HELLO.CMD、RTS6201.LIB、VECTORS.ASM。HELLO.CMD文件给出了程序空间和数据空间的设置、及编译后各程序段在程序或数据空间的具体位置。RTS6201.LIB文件为DSP运行时库,VECTORS.ASM为中断

向量表,都是区别于纯软件编程的独到之处,熟悉以后会有更深的体会。

下图为HELLO.CMD文件的代码,MEMORY分为程序空间IPRAM和数据空间IDRAM,并分别给出了起始地址origin和长度len,各段在MEMORY空间的分配也作了定义。对于实际的目标板硬件系统,由实际的存储器空间及DSP芯片上的存储空间决定。对于软件仿真,可以不考虑有没有MEMORY资源。

直接对该工程进行编译,会得到如下结果,试一下吧!也可以试一下快捷工具条上的按钮,随便点击鼠标右键,也会有意外的收获。怎么样?没有错误吧!

自己在编写工程项目文件时,经常会遇到下面的问题,没有C语言程序的入口函数,细心比较一下会发现工程文件中缺少了一个运行时支持库RTS6201.LIB,不同的DSP芯片需要不同的运行时库来支持。

下面向项目工程中加上运行时库RTS6201.LIB来纠正刚才的编译错误,同样的方法可以用来向工程中添加*.c、*.cmd、*.asm文件。*.h文件在编译时会自己找到(当然需要在环境变量中设置好啦,一般不需要改动)。

运行时库在TI的缺省路径下,注意将文件类型改为*.lib,

大家可能注意到,在HELLO.C文件中有这样的定义:

#ifdef FILEIO

int i;

char scanStr[BUFSIZE];

char fileStr[BUFSIZE];

size_t readSize;

FILE *fptr;

#endif

#ifdef FILEIO

/* clear char arrays */

for (i = 0; i < BUFSIZE; i++) {

scanStr[i] = 0 /* deliberate syntax error */

fileStr[i] = 0;

}

/* read a string from stdin */

scanf("%s", scanStr);

/* open a file on the host and write char array */

fptr = fopen("file.txt", "w");

fprintf(fptr, "%s", scanStr);

fclose(fptr);

/* open a file on the host and read char array */ fptr = fopen("file.txt", "r");

fseek(fptr, 0L, SEEK_SET);

readSize = fread(fileStr, sizeof(char), BUFSIZE, fptr);

printf("Read a %d byte char array: %s \n", readSize, fileStr);

fclose(fptr);

#endif

其中还有一些变量的定义和对文件的操作,运行编译好的程序后好象这些语句都没有执行,因为在CCS的编译环境中这个参数还没有定义。按下图进行设置:

设置完成后可以进行重新编译,会发现新的错误(如果没有出现这个错误,说明设置的不对)。双击这个错误,在HELLO.C文件中,光标会出现在出错的地方。

在第52行的这一句,可以看到语句的后面没有加“分号”,

scanStr[i] = 0

加上“分号”后重新编译,ok?!加载hello.out运行,会出现下面的输入界面,

输入一串文字并确定,在“Stdout”窗口会有下面的显示,

小结:在这里简单介绍了CCS的使用,包括CCS的设置、帮助文件的使用,(TI 的帮助文件系统、详细地介绍了CCS的使用,强烈建议用户认真学习。)

并以“Hello World”程序为例对CCS的使用中容易出现问题的一些地方作了一般的介绍,包括运行时库的添加、预编译定义设置等,用户在使用过程中会不断发现问题,通过使用TI的帮助文件及配套的资料会不断提高,不可急于求成,如果用户对Visual C++比较熟悉,学起来会快很多;相反,那肯定要多花一些时间来学习了,学习CCS跟学习Visual C++一样(简单/复杂?),但需要对硬件有一定的了解。

使用CCS进行DSP编程(二)

——实现FFT

pacificxu

现在讨论使用TI公司的CCS进行DSP编程,首先假定读者对CCS的使用已经比较了解,如果读者还不太了解,请参阅《使用CCS进行DSP编程(一)——CCS编程入门》及其他CCS的学习文档。

作数字信号处理的同志们总是喜欢用FFT来对信号处理系统做检验,下面用闻亭公司的C6xP板、C6xPa板硬件实现FFT算法,本算法对其他的C6x板同样实用(只是硬件资源稍微有差异),并通过闻亭公司的PCI仿真器对目标板加载运行,运行结果在CCS中可视化显示。

首先启动CCS Setup,对仿真器硬件进行设置,本人使用的是闻亭公司PCI 的仿真器自带的驱动wtxds6xxxpci.dvr,设置画面如下:

下面就可以运行CCS了,在CCS中,创建一个新的Project,

我的工程文件放置在如下的目录中,读者可以放在自己喜欢的目录下:

双击“+”展开fft.mak,可以看到整个工程文件是空的,

我们需要把*.c、*.cmd、*.lib文件添加到工程文件中,

首先是*.c文件,本例中是test.c文件,

同样的方法可以用来添加其他的文件。双击工程中的源文件,会在右边的窗口中看见原码:

如果*.c文件不存在,可以在CCS集成开发环境中生成,

本例中test.c的主程序源代码如下:

调用的子程序有三个:

从上面的源程序可以看到,使用CCS的C语言编程跟普通的C语言编程没有太大的区别,这正是TI所追求的,兼容的ANSI C标准和如此的编译高效率也正是TI的领先之处。读者可以不必学习烦琐的汇编和线性汇编,直接对数字信号处理的算法进行研究,同时享受高速的处理速度,只有在对速度要求极严的条件下,不得不使用汇编和线性汇编,那时读者已经有了一定的基础,再学习汇编语言已是水到渠成。而使用C语言编程是大势所趋。

如果有人对算法本身感兴趣,请参阅胡广书老师的《数字信号处理—理论、算法与实现》第5章快速傅立叶变换,这里不在对算法进行展开讨论。

程序的结构本身很简单,使用过C语言的朋友一看就明白,不需要再做进一步的说明,需要指出几点,

1. 本程序中的math.h与Visual C++中的math.h是不同的,TI的CCS专门

为数学计算作了运行时库,是利用硬件对计算作加速的,与Visual C++

中的速度是不可同日而语的。因此如果我们需要用到相应的“头文件”,

就应该在TI的目录中查找,同时要包含相应的运行时库(*.lib)文件,

我一直在强调这一点,初学者往往忽略这一点而出现许多编译链接错误。

下面的演示中还会看到这一点。

2. 本例是以定点DSP芯片‘C6201为例的。如果对定点运算还不太熟悉,

只好找些文档来学习一下了,这里也不再展开。在浮点DSP芯片‘C6701

中本程序可以不加修改地运行,但浮点DSP芯片中可以直接进行有硬件

支持的浮点运算,速度会更快。

3. CCS的C语言中的数据类型是与硬件相关的,使用时需要注意。

char 8 bits

bits

short 16

int 32 bits

bits

long 40

bits

float 32

double 64 bits

TMS320C6000 Online Programmer's Guide (SPRH048) Copyright?2000 Texas Instruments

接下来继续进行,向工程中添加*.cmd文件。读者现在应该会执行这个操作了,如果没有就自己造一个吧,也可以拿别人的来改造一下。其中有些不太明白也没有关系,但是在与具体的硬件相关的地方还是要搞明白。

首先要搞明白目标板“target”上到底有多少存储空间,包括DSP芯片内部有多大空间,目标板上有多少外部存储器(SDRAM、SBSRAM、双口RAM),以及它们的其始地址和长度,以我使用的闻亭公司‘C6Xpa板为例,

存储器类型起始地址存储器大小结束地址SDRAM 0x2000000 4M*32bit (0x400000*4) 0x3000000 SBSRAM 0x400000 128k*32bit (0x20000*4) 0x480000

0x1404000 DPRAM 0x1400000 4k*32bit (0x1000*4)

在这里还要强调一点,是“*32bit”,因此SDRAM的结束地址是0x2000000 + 0x400000*4 = 0x3000000

而不是

0x2000000 + 0x400000 = 0x2400000

其他存储空间也是如此。许多同志们忽略了这一点,在使用数组、指针及对空间地址操作时造成“不可理解”的错误,“我往仫个地址写数怎么找不到,#%^#&^%%^———坏了!”,好好研究一下,就不好意思这么快下结论了。

下面是我用的*.cmd文件的源代码,需要的话可以拿去用喔。

里面“.vec、.text ….”的东西可以先不考虑,留给CCS去处理好了。只要保证定义的空间在物理上存在就可以了。

心急的朋友会开始编译了,

又会出现下面的结果,

“$%*^&^,又忘了加运行时库!”。(下次再忘就不应该了!)。

这里展开一点,有些朋友说:“我包含了头文件,调用中断函数intr_hook()时怎么也编译链接通不过,去掉这一句就通过了。”大家现在就应该知

相关主题
相关文档
最新文档