实验报告
一、实验目的
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空间,这也是工程上的需要。