您的当前位置:首页正文

实验一编写一个以C语言为基础的DSP

2024-06-26 来源:独旅网

实验一编写一个以C语言为基础的DSP

实验一编写一个以C语言为基础的DSP程序6500字

实验报告

一、实验目的

1.学习用标准C语言编制程序;了解常用的C语言程序设计方法和组成部分。

2.学习编制连接命令文件,并用来控制代码的连接。

3.学会建立和改变map文件,以及利用它观察DSP内存使用情况的方法。

4.熟悉使用软件仿真方式调试程序。二、实验设备

PC兼容机一台,操作系统为Windows_P,安CCS软件。

三、实验原理

1.标准C语言程序

CCS支持使用标准C语言开发DSP应用程序。当使用标准C语言编制的程序时,其源程序文件名的后缀应为.c(如:volume.c)。CCS在编译标准C语言程序时,首先将其编译成相应汇编语言程序,再进一步编译成目标DSP的可执行代码。最后生成的是coff格式的可到DSP中运行的文件,其文件名后缀为.out。

由于使用C语言编制程序,其中调用的标准C的库函数由专门的库提供,在编译连接时编译系统还负责构建C运行环境。所以用户工程中需要注明使用C的支持库。

2.命令文件的作用

命令文件(文件名后缀为cmd)为链接程序提供程序和数据在具体DSP硬件中的位置分配信息。通过编制命令文件,我们可以将某些特定的数据或程序按照我们的意图放置在DSP所管理的内存中。命令文件也为链接程序提供了DSP外扩存储器的描述。在程序中使用CMD文件描述硬件存储区,可以只说明使用部分,但只要是说明的,必须和硬件匹配,也就是只要说明的存储区必须是存在的和可用的。

3.内存映射(map)文件的作用

一般地,我们设计、开发的DSP程序在调试好后,要固化到系统的ROM中。为了更精确地使用ROM空间,我们就需要知道程序的大小和位置,通过建立目标程序的map文件可以了解DSP代码的确切信息。当需要更改程序和数据的大小和位置时,就要适当修改cmd文件和源程序,再重新生成map文件来观察结果。另

外,通过观察map文件,可以掌握DSP存储器的使用和利用情况,以便进行存储器方面的优化工作。

4.源程序分析

四、实验内容与步骤

1.实验准备

建立PC机器与DSP仪器之间的来连接,设置软件模式。

2.建立新的工程文件

(1)双击桌面上图标,

启动CodeComposerStudio2.21。

(2)进行以下设置(如图2-2):

3.编辑输入源程序

(1)C语言程序

-先新建源程序窗口:

-输入源程序:

int_,y,z;

main()

_=1;y=2;

while(1)

z=_+y;

图2-3新建源文件

-保存源程序为CProgram.c:

(2)连接命令文件

-如同第(1)步操作,建立空的源程序窗口。

-输入连接命令文件内容:

-lrts2800.lib

-stack400h

-heap100

MEMORY

PAGE0:PROG(R):origin=0_3E8000,length=0_10000PAGE0:BOOT(R):origin=0_3FF000,length=0_FC0PAGE0:RESET(R):origin=0_3FFFC0,length=0_2PAGE0:VECTORS(R):origin=0_3FFFC2,length=0_3EPAGE1:M0RAM(RW):origin=0_000000,length=0_400PAGE1:M1RAM(RW):origin=0_000400,length=0_400

PAGE1:L0L1RAM(RW):origin=0_008000,length=0_2000图2-4保存为c文件

PAGE1:H0RAM(RW):origin=0_3F8000,length=0_2000}

SECTIONS

/22-bitprogramsections/

.reset:>RESET,PAGE=0

vectors:>VECTORS,PAGE=0

.pinit:>PROG,PAGE=0

.cinit:>PROG,PAGE=0

.te_t:>PROG,PAGE=0

/16-Bitdatasections/

.const:>L0L1RAM,PAGE=1

.bss:>L0L1RAM,PAGE=1

.stack:>M1RAM,PAGE=1

.sysmem:>M0RAM,PAGE=1

/32-bitdatasections/

.ebss:>H0RAM,PAGE=1

.econst:>H0RAM,PAGE=1

.esysmem:>H0RAM,PAGE=1

}-lrts2800.lib

-如同第(1)步操作,将文件存为:

C:ICETEK-F2812-A-EDUlabDSP281__e_amplesLab0102-CProgram

CProgram.cmd

(3)将上述编译的源程序加入工程CProgram.pjt。

4.编译源文件、可执行程序

(1)单击菜单“Project”、“RebuildAll”。

(2)执行FileLoadProgram,在随后打开的对话框中选择刚刚建立的C:ICETEK-F2812-EDULabLab0102-CProgramdebugCProgram.out文件。完成后,系统自动打开一个反汇编窗口“Disassembly”,并在其中指示程序的入口地址为“_c_int00”。

5.打开观察窗口

开启CPU寄存器观察窗口:单击菜单View->Registers->Core。

6.观察程序运行结果

这时,在“Disassembly”代表程序运行位置的绿色箭头指向程序的入口地址,程序将从此开始执行。

(1)选择菜单中Debug->GoMain,CCS自动打开CProgram.c,程序会停在用户主程序入口main上,这从反汇编窗口和CProgram.c窗口中的指示箭头位置可以看出。

(2)在内存观察窗口中观察变量的值:

选择“View”菜单中“Memory”项,在“MemroyWindowOptions”窗口中的“Adress”项中输入_,单击“OK”完成设置;“Memory”窗口中_的当前取值显示在第1个地址的后。

(3)将变量_、y、z分别加入观察窗口:

在源程序中双击变量名,再单击鼠标右键,选择“AddtoWatchWindow”。这时,这3个变量还未作初始化。

(4)单步运行2次,在观察窗中观察到变量_、y被赋值。变化的值被显示成红色。同时

在“Memory”窗口中也能观察到_和y值的改变。

(5)再单步运行,可观察到z的值被计算出来。双击观察窗口中变量_、y在“Value”栏中的取值并修改成其他取值,单步运行后观察结果。

(6)双击观察窗口中变量_、y在“Value”栏中的取值,并修改成0;选择菜单Debug->Restart,返回程序起点。

(7)重新单步运行程序

7.内存映像文件

(1)选择菜单Project->BuildOptions,启动“BuildOptions”工程设置对话框。

(2)单击“Linker”属性页,在“MapFilename”项中观察生成的map文件名和路径。

(3)单击“取消”退出。

8.对照观察map文件和cmd文件的内容

(1)选择菜单File->Open,将找到

C:ICETEK-F2812-A-EDUlabDSP281__e_amplesLab0102-CProgramDebug目录,将文件类型改为“MemoryMapFiles”,选择CProgram.map文件、打开。

(2)打开CProgram.cmd文件。

(3)程序的入口地址:map文件中“ENTRYPOINTSYMBOL”中说明了程序入口地址(_c_int00)。

(4)内存使用情况:

-map文件中“MEMORYCONFIGURATION”标明了程序占用RAM的使用情况,共占用aaH个存储单元。

-观察map文件中的“SECTIONALLOCATIONMAP”段,可以看出CProgram.obj的入口地址为0_3e801e,这也是main函数的入口地址。

-用户堆栈段从400H开始,程序运行到main函数中后,变量_、y、z均开设在栈中。

-还能看出程序运行都需要调用rts2800.lib中的哪些模块。

9.改变内存分配

修改cmd文件中的

PAGE0:PROG(R):origin=0_3E8000,length=0_10000

PAGE0:PROG(R):origin=0_3E9000,length=0_10000

重新编译工程,观察map文件中有何变化。

10.退出CCS

五、实验结果记录

1、建立PC机器与DSP仪器之间的来连接,设置软件模式与打开工程文件:把PC机上的USB线连接到DSP硬件上的相应接口上,打开电源。然后,启动CC驱动设置窗口,安装软件仿真驱动(Simulator),单击“F2812Simulator”驱动名,单击“Import”按钮。完成设置:单击“Close”,菜单“File”、“E_it”,“是”。然后重新启动CodeComposerStudio2.2,打开工程文件UseCMD.pjt

2、观察c语言程序的特殊设置:

“AutoinitModel”项设置成“Run–timeAutoinitialization”

3、编译源文件,可执行程序:

(1)单击菜单“Project”、“RebuildAll”。

执行结果如右图:

(2)执行File->LoadProgram,在随后打开的对话框中选择刚刚建立的UseCMD.out文件。完成后,系统自动打开源程序文件UseCMD.c。

4、打开观察窗口

打开view菜单下的watchwindows工具,在watch1中的name上分别输入_,y,z三个变量,

5、察程序运行结果

在“_=1;”这一行上设置断点。方法是先把光标移动到这一行上,右键选择togglebreakpoint。

(1)执行程序(按F5键)1次,可观察到watch窗口中_和y的值无变化。如图:

(2)单步运行2次(按F8键),在变量窗口中观察到变量_、y被赋值。如图

(3)再单步运行1次(按F8键),在变量窗口中观察到变量z中保存的就是_加上y的值。如图

6、成内存映像文件

(1)单击菜单“Project”、“Options”,启动“BuildOptions”工程设置对话框。

(2)单击“Linker”属性页,在“MapFilename”项中输入需要生成的map文件名,比如可以输入UseCMD.map

(3)单击“确定”,完成设置。

(4)选择菜单“Project”、“RebuildAll”,重新编译工程,生成新设置的map文件。

7、对照观察map文件和cmd文件的内容

(1)选择菜单“File”、“Open”,将找到C:ICETEK-F2812-EDULabDSP281__e_amplesLab02-UseCMD目录,将文件类型改为“MemoryMapFiles”,选择刚刚生成的UseCMD.map文件、打开。

(2)展开工程管理窗中的UseCMD.pjt,双击其中的UseCMD.cmd文件。

(3)程序的入口地址:cmd文件的SECTION中指定.te_t段放到程序区(PAGE0)的PRAMH0中,在MEMORY中指定PRAMH0,从内存地址3f8002h开始,长度为1000h;再看map文件中“ENTRYPOINTSYMBOL”中说明了“c_int00”标号的地址为003f8002h,两者相符。

如下图所示:

(4)内存的占用情况:通过观察map文件中的“MEMORYCONFIGURATION”段可以了解内存的使用情况。可以看到te_t段放到程序区(PAGE0)的PRAMH0中,并且从其首地址开始。

.改变内存分配

修改cmd文件中的

PRAMH0:origin=0_3f8002,length=0_001000

PRAMH0:origin=0_3f8502,length=0_00500

意思是把PRAMH0的首地址入口改为0_3f8002,所占的字节长度为500h。重新编译工程,观察map文件中有何变化。

结果如下图所示:

从map文件的描述结果可以看出,“c_int00”标号的地址修改为003f8502h,可以看到PPAMH0的首地址变为了0_3f8002,长度也修改成了500.两者还是相符的。

8、题目:如果对第一个实验按上述方法对cmd文件进行修改,重新观察其map文件的变化。

过程与结果如下:

修改前查看map文件的描述:

按上述方法修改cmd文件后,结果如下:

可以看到修改后的“c_int00”标号的地址由原来的3f8018h变为了为3f8518h,在MEMORY中指定PRAMH0,由原来的内存地址3f8002h开始到修改后的3f8502h开始,长度为变为了500,te_t段也在程序区(PAGE0)的PRAMH0中,但不是从它的首地址开始,但也由原来的3f8018h变为了为3f8518h,同样增加了500,说明了修改cmd文件可以安排程序和数据在DSP内存资源中的分配和位置;通过观察map文件可以观察到修改后的程序和数据所占用的实际尺寸和地址。

六、实验总结

1、通过本实验,基本上学会了怎样建立和改变map文件以及如何利用map文件观察DSP内存使用情况的方法,学会了编制命令文件控制代码的连接的方法,进一步熟悉了使用软件仿真方式调试程序的方法。

通过实验可以发现,修改cmd文件可以安排程序和数据在DSP内存资源中的分配和位置;map文件中描述了程序和数据所占用的实际尺寸和地址。

2、实验过程中发现的问题及解决办法:

A.编译程序的时候发现了一个警告错误,具体原因是因为软件的版本漏洞问题,后来使用新的编译程序进行编译时,能够成功编译。

B.请修改程序中的.cmd文件,熟悉一下哪些地址空间是可用的,哪些是不可用的

3、实验心得与体会:机器和软件能告诉我们怎么去做,这是前人帮我们建立的基础,而我们可以通过设置参数,需要告诉机器怎么去做。适当修改cmd文件和源程序,能更改程序和数据的大小和位置,然后再通过观察机器自动生成的map文件可以了解DSP代码的确切信息,从而了解到程序的大小和位置,为了更精确地使用ROM空间,这也是工程上的需要。

显示全文