当前位置:文档之家› DSP实验指导书(DSP处理器原理与应用)

DSP实验指导书(DSP处理器原理与应用)

DSP实验指导书(DSP处理器原理与应用)
DSP实验指导书(DSP处理器原理与应用)

实验一:DSP软件集成开发环境CCS

一. 实验目的

1.了解DSP 软件开发集成环境Code Composer Studio (CCS) 的安装和配置过程;

2.熟悉并掌握CCS 的操作环境和基本功能,了解DSP软件开发的一般流程:

(1) 学习创建工程和管理工程的方法;

(2) 了解工程文件和映像文件的基本内容;

(3) 了解基本的编译和调试功能;

(4) 学习使用观察窗口。

二. 实验设备

计算机、Code Composer Studio 2.2 或以上版本

三. 背景知识

1.DSP 应用系统开发一般需要借助以下调试工具:

―软件集成开发环境(CCS):完成系统的软件开发,进行软件和硬件仿真调试;

―硬件开发及测试平台:实现系统的硬件仿真与调试,包括仿真器和评估模块。

https://www.doczj.com/doc/2b6461936.html,S 集成了适用于所有TI 器件的源码编辑、编译链接、代码性能评估、调试仿真等功能,为

设计人员提供了一个完整的嵌入式系统软件开发环境。

3.系统软件部分可以通过CCS 建立的工程文件进行管理,工程文件一般包含以下几种文件:

―源程序文件:C 语言或汇编语言文件(*.ASM 或*.C)

―头文件(*.H)

―命令文件(*.CMD)

―库文件(*.LIB, *.OBJ)

四. 实验步骤

1. 创建工程文件

双击 CCStudio 图标,启动 CCS ,CCS 的初始界面包括工程管理区和工作区两部分。 在菜单中选择“Project —>New…”,弹出“Project Create ”窗口:

在“Project ”编辑框内填入项目名称,例如“hello1”;有必要的话,可以更改项目文件夹位置 (Location);“Project ”下拉框用以确定输出文件类型;目标硬件类型在“Target ”下拉框中指定。

点击“完成”后,CCS 自动在指定目录下生成“hello1.pjt ”工程文件。工程文件中保存了对应工程的设置信息和内部文件的引用情况。展开工程管理窗口“Projects ”下的“hello1.pjt ”,可以看到所有项目均为空。

任务 1:在 notepad 中打开“hello1.pjt ”,了解并记录工程文件提供的设置信息

若标题栏显示xxxx Emulator, 则需要先运行 Setup CCS, 选择合适的软件仿真环境

2.在工程文件中添加程序文件

选择Files -->new --> Source File,在编辑窗内输入以下源程序:

#include

void main(void)

{

printf("Hello world!\n");

}

将该文件命名为“hello1.c”,保存到工程文件夹下。选择“Project --> Add Files to Project...”,或右键点击工程管理区的“Scource”标签选择“Add Files to Project...”,将该文件添加到本工程。点击“Source”标签左边的“+”,可以看到新加入的源文件。

3.编译和链接

选择“Project-->Build/Rebuild all”,或单击工具栏中的相应按钮,启动编译、汇编和链接过程。主窗口下部的“Output”提示窗会实时显示编译信息。若无错误,将生成可执行.out 文件。

本工程文件链接出错,提示信息为“符号_printf 未做定义”。错误原因是没有在工程中加入正确的库文件。涉及到标准库函数调用的C语言源程序必须包含TI公司提供的“rts.lib”库文件。该文件位于安装目录下的\Cxxxx\cgtools\lib子目录,例如,C:\CCS\C5400\cgtools\lib。按照前述步骤将该库文件添加到工程文件的“Libraries”标签下,重新编译链接,顺利通过,但仍然有警告信息。

除直接添加库文件外,还可以通过修改链接参数引入库文件。在工程管理窗中右键点击工程文件名,选择”Build Options”,将”Linker--> Libraries --> Inc. Libraries (-l)”设置为”rts.lib”。

4.运行程序

选择“File --> Load Program…”,将链接生成的.out文件加载到目标DSP;此时CCS会自动打开反汇编窗口,并在其中显示加载程序的反汇编指令。注意:保险起见,每次加载或重新加载可执行文件前,请先重置CPU,方法是选择“Debug-->Reset CPU”。

选择“View --> Registers --> CPU Registers”,打开寄存器窗口。

选择“Debug --> Run”,运行加载程序。运行结果呈现在“Ouput”窗口的“Stdout”标签下。另外要注

意,程序运行前后寄存器内容可能会发生变化,这些寄存器在寄存器窗中用红色字体标示。

任务2:点击“Debug --> Reset CPU”,记录3个状态寄存器的缺省设置,并说明其含义

5.基本调试功能测试

将源程序修改为如下形式:

#include

void main(void)

{

int i=0;

char disp_str[] = "Hello world!\n";

for (i=1; i<=5; i++)

printf("%d. %s", i, disp_str);

}

重新进行编译链接和加载(Rebuild all & Reload program),然后顺序测试或执行下列操作:

1)选择“View-->Watch Window”,或在最左侧的工具栏中选择对应按钮,打开变量观察窗;

2)在编辑窗中,双击以选中某一变量,再单击右键,选择“Quick Watch”,可打开“Quick Watch”

窗口,可以在该窗口内显示或修改变量属性;

3)在编辑窗中,双击以选中某一变量,再单击右键,选择“Add to Watch Window”,把该变量

添加到变量观察窗,可以在该窗口内显示或修改变量属性;将变量i 和disp_str 添加到变量观察窗;

4)在printf 调用之前设置断点,方法为:将光标移动至目标行,按F9 (注意:CCS 版本不同,

快捷键及菜单设置也不同),或点击右键选择“Toggle Breakpoint”(双击编辑窗左边的灰色控制条也可以设置或删除断点);

5)选择“Debug --> Run”,或按F5,运行程序;程序会自动停在断点处;再按F5,或选择“Debug

--> Run”,程序会继续运行至下一个断点;

6)调试过程中,在变量观察窗口中双击某个变量的变量值,可对其进行修改,例如,改变i 的

值可以改变重复次数,改变disp_str 可以改变输出内容。

任务3:按上述步骤,设置断点,添加观察变量;当i = 2 时,修改变量值,令i= 0,disp_str =“Hello DSP!”,记录运行结果

选做任务:选择“Debug-->Run to Cursor”,或按Ctrl+F10,会令程序执行到光标所在行,用这种

调试方法重复完成任务2

实验二:C54x C语言编程实验

一. 实验目的

1.编写一个简单的C语言程序,掌握C54x C语言开发的基本技巧;

2.进一步熟悉和掌握CCS的操作环境和基本功能:

(1) 学习如何在断点调试中从外部文件获取测试数据;

(2) 学习如何使用CCS的图形显示功能观测数据。

二. 实验设备

计算机、Code Composer Studio 2.2 或以上版本

三. 实验步骤

1.创建工程

建立工程“volume1.pjt”,加入源文件“volume.c”和头文件“volume.h”,内容如下:

/*

* ======== volume.h ========

*/

#ifndef TRUE

#define TRUE 1

#endif

#define BUFSIZE 0x64

#define GAIN 2

/*

* ======== volume.c ========

*/

#include

#include "volume.h"

// Define input & output buffers

int inp_buffer[BUFSIZE];

int out_buffer[BUFSIZE];

// Function declarations

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

static void dataIO(void);

/*

* =========== main function ==========

*/

void main()

{

int *input = &inp_buffer[0];

int *output = &out_buffer[0];

puts("volume example started!\n");

while(TRUE) // loop forever

{

// read input data

dataIO(); // ADD BREAKPOINT HERE !!!

// process the input data

processing(input, output);

}

}

/*

* ========== processing function =========

* FUNCTION: process the input signal.

* PARAMETERS: addresses of input & output buffers

* RETURN VALUE: TRUE

*/

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

{

int size = BUFSIZE;

while(size--){

*output++ = *input++ * GAIN; // simply enhance the input signal by a factor GAIN }

return(TRUE);

}

/*

* =========== dataIO function ============

* FUNCTION: read input signal and write processed output signal.

* PARAMETERS: none

* RETURN VALUE: none

*/

static void dataIO()

{

return;

}

任务1:阅读并了解该程序的结构和功能

在调用dataIO()函数前加入断点。编译、装载并运行该程序。程序自动在断点处暂停。此时,若选择“Debug-->Step into”(或按F11),会进入被调用函数内部,执行一行随即暂停;若选择“Debug--> Step over”(或按F10),则会执行调用函数的一行代码而后暂停。

2.图形显示工具

在调试程序时,可以借助变量观察窗来观察或修改变量属性,但这种数字式呈现方式很多时候显得不够直观。CCS 集成了多种图形显示工具。借助这些工具我们可以很方便的观察信号的时频域特性,从而更准确的把握程序运行流程。

将inp_buffer 加入到变量观察窗,会发现该数组的数值无序分布,这是因为我们虽然在源程序中定义了这个数组,但没有对它明确赋值,而C54x C 编译器并不会自动对变量进行初始化。利用图形显示工具,可以帮助我们更清楚的看到这一点。

选择“View-->Graph--> Time/Frequency”(在某些版本中Graph位于Tools菜单下),弹出图形属性对话框。设置方法如下图所示:

设置好图形显示属性后点击“OK ”,会弹出图形显示窗口,并显示 inp_buffer 的波形。可以看到inp_buffer 中的数据呈无序状态。若要更改显示类型等属性,可在该窗口内右键点选 “Properties ”。

任务 2:修改显示属性,观察并记录 out_buffer 的幅频和相频特性; 修改显示属性,同时观察并记录 inp_buffer 和 out_buffer 的波形; 注意输出信号的幅度并不是输入信号的幅度*GAIN ,解释原因

选择图形类型 选择数据 存储位置

数据显示的起始位置; 填入数组名表示从第一个元素开始显示

选择DSP 的数据类型

Acquisition Buffer Size/ Display Data Size: 读取/显示多少个数据

3.调试过程中的数据装载

CCS 允许我们在调试过程中使用本地存储的数据文件来装载或更新测试数据。负责读取数据的dataIO()函数目前为空,在该函数的入口或出口处调入测试数据是一个不错的选择。

选择“Debug--> Breakpoints…”打开断点管理窗;在该窗口中点击之前设置的断点的“Action”属性,默认断点行为为“Halt Target”(不同版本文字表述不同),在下拉框中选择“Read Data from File”,弹出对话框;选择读取“C:\CCStudio_v3.3\tutorial\sim62xx\sinewave\sine.dat”(或将其先复制到工程目录下再读取),其余设置参考下图;若在给定位置找不到数据文件,可在CCS安装目录下搜索sine.dat。

重新运行程序,将图形显示属性中的“Display Data Size”改为200,然后在图形显示窗口中右键点选“Refresh”,可以得到类似于下图的显示波形:

只所以观察到的波形与预期不一致,是因为程序运行时,图形显示工具并不会自动更新数据,而手动更新无法准确定时;解决办法是另外设置一处断点,专门用来更新显示。

在调用processing()函数之前设置断点,该断点会自动出现在断点管理窗口中;点击该断点的“Action”属性栏,选择“Update All Windows”(在某些版本中,只能选择“Refresh a Window”),得到如下波形:

任务3:记录两个信号的时域波形;解释信号不同步的原因;解决这一问题并记录波形选作任务:修改源程序,使得输出与输入相比延迟1/4周期,记录波形

实验三:C54x 汇编语言编程实验

一. 实验目的

1.编写简单的汇编语言程序,掌握C54x汇编语言开发的基本技巧;

2.进一步熟悉和掌握CCS的操作环境和基本功能,如变量观察窗、内存观察窗等;

3.学习阅读列表文件,进一步理解汇编器的主要功能;

4.学习编写链接命令文件,进一步理解链接器的主要功能。

二. 实验设备

计算机、Code Composer Studio 2.2 或以上版本

三. 实验步骤

1.测试常用的汇编伪指令

建立工程“spc_test.pjt”,加入一个非常简单的汇编程序“spc_test.asm”,其内容如下:

.data

coef .word 011h, 022h, 033h

.bss var1, 1

.bss buffer, 10

ptr .word 0123h

该程序无法通过编译,错误信息为“Invalid mnemonic specification”。

任务1:检查源程序,修改语法错误

缺省情况下,CCS不会输出.lst列表文件,需在“Build options--> Compiler--> Assembly”下选中“Generate Assembly Listing File”或在编辑窗中加入“-al”选项,然后重新编译。

任务2:预先判断列表文件的内容;打开“\Debug\spc_test.lst”,进行验证

编辑源程序,加入以下语句:

.byte 0aah

.word 0ccch

.xlong 0eeeefffh

.long 0eeeeffffh

.string “help”

.field 5,3

.field 9,6

.field 16,5

NUM .set 01234h

.field NUM, 20

.field NUM, 32

任务3:预先判断列表文件的内容;重新编译,打开列表文件,进行验证

选做任务1:改写源程序,测试.align & .even伪指令和其它符号定义伪指令

2.编写链接器命令文件

链接器命令文件的主要作用是引导链接器完成存储器的最终配置,即将段映射到物理存储器。如果在链接时不提供命令文件,链接器将采用缺省配置,并提出警告。

任务4:用notepad打开\Debug\spc_test.map,记录缺省情况下的存储器映射信息,验证课堂上学习过的缺省配置方案

将下面的链接器命令文件加入工程,重新编译,发现相关警告信息消失:

-e start /* Specify the entry point*/

MEMORY

{

PAGE 0: PRAM: o=0x100, l=0x0200

PAGE 1: DRAM: o=0x100, l=0x0200

}

SECTIONS

{

.text : > PRAM PAGE 0

.data :> PRAM PAGE 0

.bss :> DRAM PAGE 1

}

任务5:打开spc_test.map,与缺省配置进行比较;

选做任务2:修改链接器命令文件,将.bss 段映射到PAGE1的0x200~0x1200

3.加减运算指令和传送指令

新建工程,使用链接器缺省配置,加入下面的汇编程序(或覆盖之前建立的spc_test.asm):.mmregs

.bss x,1

.bss y,1

.bss w,1

.bss z,1

.def start

.data

table .word 30,20,10

.text

start STM #0, SWWSR

STM #x, AR1

RPT #2

MVPD table,*AR1+

LD @x,A

ADD @y,A

SUB @w,A

STL A,@z

end B end

该程序用.data段中的table数组为.bss段中的x、y、w赋值,然后计算x+y-w,并将结果存入z。实际执行后发现运行结果与预期不符。可以借助断点调试法来监控程序执行过程,查明错误原因。具体步骤为(仅供参考):

―打开寄存器观察窗(View--> Registers--> CPU Registers);

―打开内存观察窗(View--> Memory),在编辑框内输入欲观察的变量名称,例如x,根据变量

类型和链接器命令文件选择存储器,缺省情况下应选择 Data ,如下图所示;在变量观察窗中也可以观察单个变量,但有时需要进行显示类型转换,例如,*x--> *(int*)x ;

― 在 STM #x, AR1 一句前设置断点,执行程序,令其在断点处暂停;

― 重复选择“Debug--> Step Into/Step Over ”,控制程序自断点处以步进方式向下运行; ― 在此过程中观察相关变量及寄存器的变化,找出错误原因。

任务 6:使用前面给出的链接器命令文件,修改程序,使其能正确运行;总结使用直接寻址方

式时应注意的问题

选做任务 3:修改程序,使用间接寻址方式,完成计算及赋值过程

指定内存地址; 可以是符号, 数值或表达式

选择数值显示格式

选择存储器类型

实验四:C54x 混合编程实验

一. 实验目的

1.使用C54x C 语言和汇编语言编写一个简单程序,掌握混合编程的基本技巧:

(1)如何在混合编程中实现变量的互相访问;

(2)如何在C 程序中调用汇编函数;

(3)如何在C 程序中内嵌汇编语句;

2.进一步熟悉和掌握CCS的操作环境和基本功能。

二. 实验设备

计算机、Code Composer Studio 2.2 或以上版本

三. 实验步骤

1.变量的互相访问

C 编译器在对C 程序进行编译时会自动在所有标识符(函数名, 变量名等) 前添加下划线“_”,所以,要在汇编程序中访问C 全局变量或常变量“x”应使用“_x”标识符,同时还要用“.global/.ref”命令加以说明。同样的,要在汇编程序中定义一个将会被C 程序访问的变量“x”,也应使用“_x”标识符,而且要用“.global/.def”命令将其声明为全局变量。

建立一个新的工程“volume2.pjt”;将“volume1”目录下的C程序文件“volume.c”和头文件“volume.h”复制到“volume2”文件夹,对源文件进行如下修改:

(1)打开volume.h,将#define GAIN 2 一句注释掉;

(2)打开volume.c,将GAIN 声明为外部变量,即在main 函数外加入extern int GAIN;

(3)建立一个新的汇编源文件test.asm,其内容为:

.def _GAIN ; declare a global identifier

_GAIN .set 2 ; set “_GAIN” to be 2

将该汇编程序加入工程文件后,编译链接可顺利通过。这说明在volume.c 中顺利实现了对汇编常量_GAIN 的访问。

任务1:改写源程序,测试如何在汇编程序中访问C 变量;尝试在汇编程序中访问使用预处理命令#define 定义的标识符,解释失败的原因

2.内嵌汇编语句

内嵌汇编就是在C 程序中以下列方式直接“调用”汇编代码:

格式: asm (" 汇编语句");

例如: asm (" SSBX INTM");

双引号包裹的内容应完全符合汇编语言语法规则。内嵌汇编虽然形式简单,但很容易破坏运行环境,所以要慎重使用,尤其是在需要对C代码进行优化的情况下。下面用这种方式来完成一个简单的数据传送任务,即将inp_buffer 的内容复制到out_buffer:

(1)打开volume.c,将main 主函数中的processing(input, output) 一行注释掉;

(2)在该行之后加入以下代码:

asm(" STM #_inp_buffer, AR2");

asm(" STM #_out_buffer, AR3");

asm(" RPT #99"); // repeat next instruction 100 times

asm("MVDD *AR2+, *AR3+"); // check for grammar error first

asm(" NOP");

(3)重新编译链接和加载;按照实验2 中介绍的步骤,使用sine.dat中的数据进行测试,并借

助图形显示工具观察输入和输出信号的波形。

注意:将RPT指令的操作数改为_size -1 或#(_size-1)或别的形式,都不能得到正确结果。原因

在于_size为符号地址。若一定要利用_size来定义单重复次数,可先将_size-1存储到数据存储器。另一选项是使用RPTB 或BANZ 指令实现循环,但那样的话就不能发挥单重复指令的速度优势。

选做任务1:修改上述代码,利用_size 定义单指令重复次数

选做任务2:使用内嵌汇编方式实现out_buffer = inp_buffer*GAIN,记录波形图

3.汇编函数调用

建立一个新的工程“volume3.pjt”;将“volume1”目录下的C程序文件“volume.c”和头文件“volume.h”复制到“volume3”文件夹,对源文件进行如下修改:

(1)打开volume.c,定义两个全局变量gain2和size,即在main主函数外加入int gain2 = GAIN

和int size = BUFSIZE;添加外部函数声明,即加入extern void asmfunc();将main函数中的processing(input, output) 一行改成asmfunc();

(2)新建汇编源文件asm_proc.asm,并将其加入该工程;文件内容如下:

.def _asmfunc

.ref _inp_buffer

.ref _out_buffer

.ref _gain2

.ref _size

;.mmregs

.text

_asmfunc:

STM #_inp_buffer, AR2

STM #_out_buffer, AR3

MVDM _gain2, T

MVDM _size, AL

sub #1, A

STLM A, AR4

loop:

MPY *AR2+, A

STL A, *AR3+

BANZ loop, *AR4 ; *AR4-

;ret

任务2:参照讲义,阅读并理解上面给出的汇编程序;修改语法错误,重新编译链接

任务3:加载并执行生成的.out 文件;按照在实验2中介绍过的步骤,使用sine.dat数据文件进行测试,在图形显示窗中对比输入和输出信号波形并做记录

选做任务3:上述程序中的“MVDM _size, AL”负责将C变量size的内容复制到AL;如果将该句替换为“LD _size, A”还能否得到正确结果?若不能该如何修改?借助断点调试法进行验证

选做任务4:修改源程序,尝试在C程序中访问汇编变量和常量,并总结规律

相关主题
文本预览
相关文档 最新文档