实验1.docx
《实验1.docx》由会员分享,可在线阅读,更多相关《实验1.docx(19页珍藏版)》请在冰豆网上搜索。
![实验1.docx](https://file1.bdocx.com/fileroot1/2023-1/27/04c1e64a-8ec4-4abe-9ce5-4905611f92ef/04c1e64a-8ec4-4abe-9ce5-4905611f92ef1.gif)
实验1
实验一集成开发环境CCS应用基础
1、实验目的:
1.通过创建一个简单的应用工程,初步熟悉CodeComposerStudio(简称CCS)的集成开发环境(IDE)及其工具的使用。
2.掌握汇编语言源程序的基本框架和编写方法,了解CCS的工程结构以及编译、汇编、连接、运行和调试的基本过程。
3.了解ST0、ST1的控制位对计算过程的控制以及计算结果对状态位的影响。
二、实验内容:
1. 学习使用 CCS 集成开发环境(IDE)的各种工具。
包括下列内容:
(1)编辑、汇编和连接。
(2)查看和修改存储器映像寄存器的内容。
(3)查看和修改 ST0、ST1 及 PMST 的有关位。
(4)查看和修改程序存储器和数据存储器的内容。
(5)断点操作。
(6)运行程序(单步运行、连续运行和断点运行)。
2. 观察并理解 COFF 段结构的划分及存储空间的分配。
3. 观察控制位 SXM、OVM、C16 及 FRCT 置 1 或清 0 对执行结果的影响。
4. 观察标志位 TC、C、OVA 及 OVB 的变化情况。
3、实验步骤:
1.准备工作
在D盘下,建立以自己学号命名的子目录,(如:
D:
\DSP\2013073006)以后自己的所有实验程序都在此子目录下运行。
将实验一的文件夹拷贝至自己的子目录内。
在 PC 机的 CCS 软件仿真环境(Simulator)下,选择 TMS320C5416 软件仿真模式,并在此模式下进行实验。
2.预习实验程序
实验一提供了三个有关程序:
汇编主程序 test1.asm、中断矢量处理程序 vectors.asm 及命令文件 test1.cmd(参见实验一参考程序)。
(1)读懂主程序 test1.asm,分析程序中各操作所提供的原始数据、中间过程和最终结果。
在实验前先填写主程序注释中的括号部分,然后通过实验验证自己的分析正确否。
(2)通过预习程序(特别是预习 test1.cmd),了解该工程中 COFF 格式段的划分及存储器的分配情况。
(3)在程序 vectors.asm 中有从复位中断(RESET)到主程序入口 c_int00 的一些汇编指令。
通过阅读它们,了解在 CCS 软件仿真环境(Simulator)下,怎样编写中断矢量入口的处理程序。
3.运行CCSsetup,选择“C5416DeviceSimulator”,如图1-1所示。
单击“Import”按钮,即可将其添加到系统配置(System Configuration)中,单击“Save and Quit”按钮,就可以启动CCS在C5416软件仿真环境下工作。
图1 CCS安装界面
4.创建一个新的工程项目
启动CCS。
从CCS的主菜单“Project”下选择子菜单“New”,将出现“Project Creation”对话框,如图1-2所示。
在对话框的“Project Name”处输入“test1”,在“Location”处用浏览方式选入在第1步中建立的文件夹,在“Project Type”处选择“Executable(.out)”类型,在“Target”中选择 CCS 所配置的目标DSP类型,最后单击“Finish”完成。
5.向工程添加各类型文件
(1)在主菜单中单击“Project”,选择“Add Files to Project”命令,然后在弹出的添加文件对话框中找到文件 vectors.asm及test1.asm,单击“Open”。
也可在工程图标处单击鼠标右键,然后在快捷菜单中选择“Add Files to Project”,或将文件拖入工程视图窗口的文件夹中)。
(2)在主菜单中单击“Project”,选择“Add Files to Project”命令,使用上述同样的方法选择链接命令文件“test1.cmd”,单击Open。
图2新建工程窗口
(注:
在一个工程项目中,通常包括源程序、库文件、链接命令文件和头文件等。
本工程项目中没有库文件和头文件,因此不需添加它们)。
实验所需的3个文件到此添加完毕。
在工程浏览窗中,单击工程名左边的“+”标记展开工程文件列表,如图3所示。
在工程浏览窗里的某个文件名上双击鼠标,即可在CCS的编辑窗中看到该文件的源代码。
图3展开工程文件列表图4 装载程序
6.建造和装载程序
在主菜单中单击“Project”,选择“Rebuild All”命令或者单击工具条图标,即可自动完成编译、汇编和连接这三个步骤,并在底部窗口中同步的显示汇编连接信息。
连接完毕,将生成一个“test1.out”文件,默认存放在目录“test1”下的“debug”目录内。
在修改文件后,选择“ReBuild All”命令,或者单击工具条图标,CCS将重新对工程中的所有文件进行编译、汇编和连接。
建造完毕后,在主菜单中单击“File”,选择“Load Program”如图4所示。
在对话框中选择文件test1.out,单击“Open”打开。
这样,CCS就将可执行代码载入到目标DSP中。
选择主菜单“View”下的“Mixed Source/ASM”,将同时看到汇编源代码和相应的机器代
码,如图5所示。
如果要查找某条汇编指令的功能,只需将光标放在该汇编指令的前面,并
按F1键,CCS就会搜索并显示该条指令的帮助信息,这在调试中是很有用的。
图5观察指令代码
7.运行和调试
选择主菜单“Debug”下的“Run”或单击工具按钮,可使程序全速运行。
通过“Debug”
下的“Halt”或单击工具按钮可停止程序的运行。
设置断点的方法是:
把光标移到某一行,按F9键或单击工具按钮,在这一行前面会出现一个红点,表示在该行加了一个断点。
8.寄存器的察看和修改
选择主菜单“View”下的“Registers——>CPU Registers”或点击CCS操作界面左侧的调试工具栏图标,就会在CCS工作区底部打开一个CPU寄存器窗口,其中列出了所有CPU寄存器的值,并列出了ST0、ST1和PMST中有特殊意义的位和位域,如图6所示。
要修改某个寄存器值,只要双击该寄存器名称,既可出现“Edit Register”对话框,只要在“Value”文本框中输入新的值,单击“Done”按纽,即修改成功。
图6 CPU寄存器窗口
选择主菜单“View”下的“Memory”或点击CCS操作界面左侧的调试工具栏图标,就会弹出一个“MemoryWindowOptions”对话框,如图7所示。
选择Data或Program,输入存储器的地址,即可观察以该存储器地址开始的内容,如图1-8所示。
要修改某个存储器地址中的内容,可以双击该地址,在出现的对话框中修改即可。
图 1-7 存储器窗口
图 1-8 存储器显示及修改对话框
图7存储器显示
9.观察存储器映象Map文件
选择主菜单“File”下的“Open”,打开test1.Map文件,观察存储器的配置、段的定位及全局符号等各项内容,将它们与test1.cmd文件中的设置进行比较,进一步理解cmd文件的作用。
四、实验结果:
1、实验源程序清单及运行结果。
(1)主程序 test1.asm
;************************************************************************;
;实验一集成开发环境 CCS 应用基础
;************************************************************************
.title"example1.asm"
.mmregs;使能存储器映像寄存器
stack.usect"STACK",10h
.def_c_int00
;------------------------------------------------------------------------------
.text
_c_int00:
stm# stack+10h, SP;设置堆栈指针
stm#0x0000, SWWSR;所有存储器未加软件延迟
;================================================
stm#0x70,AR2
st#0xff80,*AR2
;================================================
;观察控制位 SXM 的作用
;当 SXM =0 时,进行无符号数的加载
rsbxSXM
nop
ld*AR2, A;(A)=(00 0000 FF80)
;------------------------
;当 SXM =1 时,进行有符号数的加载
ssbxSXM
nop
ld*AR2, A;(A)=(FF FFFF FF80)
;================================================
;================================================
;观察控制位 OVM 的作用
;当 OVM=0 时,对溢出不进行处理
rsbxOVM
ld#0x7fff, 16, B
add#0x7fff, 16, B;(B)=(00 FFFE 0000)
;------------------------
;当 OVM=1 时,对溢出进行处理
ssbxOVM
ld#0x7fff, 16, B
add#0x7fff, 16, B;(B)=(00 7FFFF FFFF)
;================================================
;================================================
;观察控制位 C16 的作用
;当 C16=0 时,进行 32 位双精度数加法运算
ssbxOVM
ld#0x0001, 16, A
add#0x7fff, A
dstA, *AR2
ld#0x0001, 16, A
or#0xffff, A
rsbxC16
nop
dadd*AR2, A, B;(B)=(00 0003 7FFE)
;------------------------
;当 C16=1 时,进行两个独立的 16 位数加法运算
ssbxC16
nop
dadd*AR2, A, B;(B)=((00 0002 7FFE)
;================================================
;================================================
;观察控制位 FRCT 的作用
;当 FRCT=0 时,对乘积不进行移位
ld#0x1234, 16, A
rsbxFRCT
nop
mpya*AR2;(B)=(00 0000 1234)
;------------------------
;当 FRCT=1 时,对乘积左移 1 位
ssbxFRCT
nop
mpya*AR2;(B)=(00 0000 2468)
;================================================
;================================================
;观察测试位 TC
bitf*AR2, #0x8000;(TC)=(0)
nop
nop
;------------------------
bitf*AR2, #0x0001;(TC)=
(1)
nop
nop
;================================================
;================================================
;观察标志位 C
ssbxSXM
ld#0x7fff, A
ld#0x8000, B
maxA;(C)=(0)
nop
nop
;------------------------
minB;(C)=
(1)
nop
nop
;================================================
;================================================
;观察标志位 OVA, OVB
ssbxSXM
rsbxOVA
ld#0x7fff, 16, A
add#0xffff, A;(OVA)=(0)
nop
nop
;------------------------
add#0x7fff, 16, A;(OVA)=
(1)
nop
nop
;================================================
dead_loop:
nop
nop
nop
nop
bdead_loop
.end
;------------------------------------------------------------------------------
(2)命令文件 test1.cmd
vectors.obj
test1.obj
-otest1.out
-m test1.map
MEMORY
{
PAGE 0:
EPROM:
org=0xE000, len=0x100
VECS:
org=0xFF80, len=0x80
PAGE 1:
SPRAM:
org=0x0060, len=0x0020
DARAM:
org=0x0080, len=0x100
}
SECTIONS
{.text :
>EPROM PAGE 0
.data:
>EPROM PAGE 0
.bss :
>SPRAM PAGE 1
STACK :
>DARAM PAGE 1
vectors:
>VECSPAGE 0
}
(3)中断矢量处理程序 vectors.asm
.ref _c_int00
.sect "vectors"
int_RESET:
b_c_int00;复位时跳转至_c_int00
nop
nop
.space124*16;没有其它中断应用,为它们留出空间
(4)运行结果(如图8所示)
图8实验结果
2、程序分析
(1)说明3个文件的作用,说明各个文件中伪指令的作用。
1)text1.asm文件为实验主程序。
Vectors.asm文件用于处理中断,在本程序中规定了上电复位的跳转地址,并屏蔽其他用不到的中断。
Test1.cmd文件是存储器分配说明文件,主要功能是指定工程中的各段分配到那段存储器中,比如有片内RAM(起始地址,大小)和SDRAM等,为连接器提供段定位信息。
2)EPROM程存空间为从E000h开始的100h个存储单元,SPRAM数据空间为从0060h开始的32个存储单元,VECS程存空间为从FF80h开始的128个存储单元,DARAM数据空间为从0080h开始的256个存储单元。
设置的.text段和.data段在0页EEPROM存储空间,.bss段在1页SPRAM存储空间,STACK段在1页DARAM存储空间,Vectors段在0页VECS存储空间。
3)ext1.asm中使用了以下伪指令:
.title “example.asm”允许汇编器在每页顶部打印标题
.mmregs将存储映射寄存器送入符号表中
.usect“STACK”为未初始化变量保留存储空间的自定义段STACK
.def _c_int00在当前模块中定义符号_c_int00,使其在其他模块中可使用
.text设置已初始化段.text
.end终止汇编,放置在源程序最后一行
Vectors.asm中使用了以下伪指令:
.ref _c_int00在模块test1.asm中定义的符号_c_int00,在当前模块中可用
.sect “vectors”设置自定义已初始化段vectors
.space 124*16在当前段中保留指定的位,共124位*16bit
.end终止汇编,放置在源程序最后一行
Test1.cmd中使用了以下伪指令:
.text 设置已初始化段.text
.data 设置已初始化段.data
.bss 设置未初始化段.bss
(2)分析主程序的结构和功能,对每条指令进行注释,写出执行结果。
;************************************************************************;
;实验一集成开发环境 CCS 应用基础
;************************************************************************
.title"example1.asm";允许汇编器在每页顶部打印标题
.mmregs;使能存储器映像寄存器
stack.usect"STACK",10h;为未初始化变量保留存储空间的自定义段STACK
.def_c_int00
;------------------------------------------------------------------------------
.text;设置已初始化段.text
_c_int00:
stm# stack+10h, SP;设置堆栈指针
stm#0x0000, SWWSR;所有存储器未加软件延迟
;================================================
stm#0x70,AR2;0x70→AR2
st#0xff80,*AR2;0xff80→0x70h
;================================================
;观察控制位 SXM 的作用
;当 SXM =0 时,进行无符号数的加载
rsbxSXM ;SXM=0时,((AR2))→A
nop
ld*AR2, A;(A)=(00 0000 FF80)
;------------------------
;当 SXM =1 时,进行有符号数的加载
ssbxSXM;SXM=1时,((AR2))→A
nop
ld*AR2, A;(A)=(FF FFFF FF80)
;================================================
;================================================
;观察控制位 OVM 的作用
;当 OVM=0 时,对溢出不进行处理
rsbxOVM ;OVM=0时,不处理溢出
ld#0x7fff, 16, B;0x7fff左移16位后送B
add#0x7fff, 16, B;(B)=(00 FFFE 0000)
;------------------------
;当 OVM=1 时,对溢出进行处理
ssbxOVM ;0VM=1时,处理溢出
ld#0x7fff, 16, B;0x7fff左移16位后送B
add#0x7fff, 16, B;(B)=(00 7FFFF FFFF)
;================================================
;================================================
;观察控制位 C16 的作用
;当 C16=0 时,进行 32 位双精度数加法运算
ssbxOVM;当OVM=1时,处理溢出
ld#0x0001, 16, A ;(A)=00 0001 0000
add#0x7fff, A;(A)=00 0001 7FFF
dstA, *AR2 ;暂存00 0001 7FFF
ld#0x0001, 16, A ;(A)=00 0001 0000
or#0xffff, A ;(A)=00 0001 FFFF
rsbxC16
Nop ;等待流水线
dadd*AR2, A, B;(B)=(00 0003 7FFE)
;------------------------
;当 C16=1 时,进行两个独立的 16 位数加法运算
ssbxC16;OVM=1,处理溢出
nop
dadd*AR2, A, B;(B)=(00 0002 7FFE)
;================================================
;================================================
;观察控制位 FRCT 的作用
;当 FRCT=0 时,对乘积不进行移位
ld#0x1234, 16, A;0x1234左移16位后送A,(A)=00 1234 0000
rsbxFRCT
nop
mpya*AR2;(B)=(00 0000 1234)
;------------------------
;当 FRCT=1 时,对乘积左移 1 位
ssbxFRCT
nop
mpya*AR2;(B)=(00 0000 2468)
;================================================
;================================================
;观察测试位 TC
bitf*AR2, #0x8000;(TC)=(0)
nop
nop
;------------------------
bitf*AR2, #0x0001;(TC)=
(1)
nop
nop
;================================================
;================================================
;观察标志位 C
ssbxSXM;当SXM=1时,进行有符号数的加载
ld#0x7fff, A;A=00 0000 7FFF
ld#0x8000, B;B=FF FFFF 8000
maxA;(C)=(0)
nop
nop
;------------------------
minB;(C)=
(1)
nop
nop
;================================================
;=====================================