嵌入式系统实验指导书.docx
- 文档编号:16996735
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:21
- 大小:96.55KB
嵌入式系统实验指导书.docx
《嵌入式系统实验指导书.docx》由会员分享,可在线阅读,更多相关《嵌入式系统实验指导书.docx(21页珍藏版)》请在冰点文库上搜索。
嵌入式系统实验指导书
《嵌入式系统》
实验指导书
编著谭会生
湖南工业大学
电气与信息工程学院
2010年4月
目录
实验一ARM汇编指令实验11
实验二ARM汇编指令实验24
实验三汇编与C语言的相互调用实验8
实验一ARM汇编指令实验1
一、实验目的
1.初步学会使用EmbestIDEforARM开发环境及ARM软件模拟器;
2.通过实验掌握简单ARM汇编指令的使用方法。
二.实验设备
1.硬件:
PC机;
2.软件:
EmbestIDE2004集成开发环境。
Windows98/2000/NT/XP。
三.实验内容
1.熟悉开发环境的使用,并使用LDR/STR和MOV等指令访问寄存器或存储单元。
2.使用ADD/SUB/LSL/LSR/AND/ORR等指令,完成基本数学/逻辑运算。
四.实验原理
ARM处理器共有37个寄存器:
31个通用寄存器,包括程序计数器(PC),这些寄存器都是32位;6个状态寄存器,这些寄存器也是32位,但只使用了其中的12位。
1.ARM通用寄存器
通用寄存器(R0~R15)可分为3类,即不分组寄存器R0~R7.分组寄存器R8~R14.程序计数器R15。
2.存储器格式
ARM体系结构将存储器看作是从零地址开始的字节的线性组合。
字节0~3存放第一个字,字节4~7存放第2个字,以此类推。
ARM体系结构可以用两种方法存储字数据,分别称为大端格式和小端格式。
3.GNU基础知识
EmbestIDE集成了GNU汇编器as、编译器gcc和链接器ld。
因此,编写程序要符合CNU的语法和规则。
关于as.gcc和ld的具体使用,请参照EmbestIDE所带的电子文档ProgRef.chm。
五.实验操作步骤
1.实验A
(1)新建工程:
先建立一个实验文件夹,如E\DK07101\001_asm1。
运行EmbestIDE集成开发环境,选择File→NewWorkspace菜单项,弹出一个对话框,按照图1.1输入工程名asm1_a等相关内容。
单击OK按钮,将创建一个新工程,并同时创建一个与工程名相同的工作区。
此时在工作区窗口将打开该工作区和工程。
图1.1新建工作区
(2)建立源文件:
选择File→New菜单项,弹出一个新的、没有标题的文本编辑窗口,输入光标位于窗口中第一行,按照实验参考程序编辑输入源文件代码。
编辑完后,保存文件asml_a.s。
(3)添加源文件:
选择Project→AddToProject→File项,或单击工程管理窗口中的相应右键快捷菜单命令,打开文件选择对话框,在工程目录下选择刚才建立的源文件asml_a.s。
图1.2新的工作区处理器设置
(4)基本设置:
选择Project→Settings…菜单项,或按下快捷键Alt+F7,弹出工程设置对话框。
在工程设置对话框中,选择Processor属性页,按照图1.2对目标板所用处理器进行设置。
(5)生成目标代码:
选择Build→Buildasm_a菜单项,或按下快捷键F7,生成目标代码。
也可以单击工具栏上相应按钮来完成。
(6)调试设置:
选择选择Project→Settings…菜单项,或按下快捷键Alt+F7,弹出工程设置对话框。
在工程设置对话框中,选择Remote页面,按照图1.3所示对调试设备模块进行设置。
图1.3新工作区仿真器设置
选择Debug页面,按照图1.4所示进行调试模块设置。
(a)连接相关设置(b)下载相关设置
图1.4新工作区调试器配置
(7)选择Debug→RemoteConnect连接软件仿真器,执行Download命令下载程序,并打开寄存器窗口。
(8)打开存储器窗口,观察地址0x8000~0x801F的内容,以及地址0xFF0~0xFFF的内容。
(9)单步执行程序并观察和记录寄存器与存储器值的变化。
(10)结合实验内容和相关资料,观察程序运行,通过实验加深理解ARM指令的使用。
2.实验B
(1)在工作区窗口工作区名称上右击鼠标,在弹出的快捷菜单中选择“AddNewProject
toWorkspace…”。
(2)参照实验A及相应的实验参考程序,建立工程asml_b。
(3)参照实验A的步骤完成目标代码的生成与调试。
六.实验参考程序
1.实验A参考程序
.equx,45/*定义变量x,并赋值为45*/
.equy,64/*定义变量y,并赋值为64*/
.equstack_top,0x1000/*定义栈顶0x1000*/
.global_start
.text
_start:
/*程序代码开始标志*/
MOVsp,#stack_top
MOVr0,#x/*x的值放入R0*/
STRr0,[sp]/*R0的值保存到堆栈*/
MOVr0,#y/*y的值放入R0*/
LDRr1,[sp]/*取堆栈中的数到R1*/
ADDr0,r0,r1
STRr0,[sp]
stop:
Bstop/*程序结束,进入死循环*/
.end
2.实验B参考程序
.equx,45/*定义变量x,并赋值为45*/
.equy,64/*定义变量y,并赋值为64*/
.equz,87/*定义变量z,并赋值为87*/
.equstack_top,0x1000/*定义栈顶0x1000*/
.global_start
.text
_start:
/*程序代码开始标志*/
MOVr0,#x/*x的值放入R0*/
MOVr0,r0,lsl#8/*R0的值乘以2的8次方*/
MOVr1,#y/*y的值放入R1*/
ADDr2,r0,r1,lsr#1/*R1的值除以2加上r0的值放入R2*/
MOVsp,#0x1000
STRr2,[sp]
MOVr0,#z/*z的值放入R0*/
ANDr0,r0,#0xFF/*取R0的低八位*/
MOVr1,#y/*y的值放入R1*/
ADDr2,r0,r1,lsr#1/*R1的值除以2加上r0的值放入R2*/
LDRr0,[sp]/*y的值放入R1*/
MOVr1,#0x01
ORRr0,r0,r1
MOVr1,R2/*y的值放入R1*/
ADDr2,r0,r1,lsr#1/*R1的值除以2加上r0的值放入R2*/
stop:
Bstop/*程序结束,进入死循环*/
.end
七.实验报告
(1)画出程序A、程序B的实现框图,并说明实验A、B程序实现的功能是什么?
(2)记录程序A和程序B单步运行时有关寄存器与存储器的值,并分析有关结果是否正确。
实验二ARM汇编指令实验2
一、实验目的
通过实验掌握使用LDM/STM、B和BL等指令完成较为复杂的存储区访问和程序分支,学习使用条件码,加强对CPSR的认识。
二、实验设备
1.硬件:
PC机;
2.软件:
EmbestIDE2004集成开发环境。
Windows98/2000/NT/XP。
三、实验内容
1.熟悉开发环境的使用并完成一块存储区的拷贝;
2.完成分支程序设计,要求判断参数,根据不同参数,调用不同的子程序。
四、实验原理
1.ARM程序状态存储器
在所有处理器模式下,都可以访问当前程序状态寄存器CPSR。
CPSR包含条件码标志、中断禁止位、当前处理器模式以及其他状态和控制信息。
每种异常模式都有一个程序状态保存寄存器SPSR。
当异常出现时,SPSR用于保存CPSR的状态。
CPSR和SPSR的格式如下:
313029282726876543210
N
Z
C
V
Q
DNM(RAZ)
I
F
T
M
M
M
M
M
2.本实验涉及到得as语法及规则
1)标号的使用
标号由一个符号后跟一个冒号组成,它表示程序中当前的指令或者数据地址。
如果在程序中出现两个相同的标号,汇编器会产生一个警告,同时,只有第一个标号有效。
2)几个伪指令
(1)LDR
LDR伪指令讲一个32位常数或者一个地址值读取到寄存器中。
当需要读取到寄存器中的数据超过了MOV或者MNV指令可以操作的范围时,可以使用LDR伪指令将该数据读取到寄存器中。
在汇编编译器处理源程序时,如果该常数没有超过MOV或者MNV可以操作的范围,则LDR指令被这两条指令中的一条所替代;否则,该常数将被放在最近的一个文字池(LiteralPool)内,同时,本指令被一条基于PC的LDR指令代替。
语法格式
LDR
其中,expression为需要读取的32位常数。
Register为目标寄存器。
示例
LDRr1,=0xff
LDRr0,=0xfff0000
(2)ADR
ADR指令将基于PC的地址值或者给予寄存器的地址值读取到寄存器中。
在汇编编译器处理源程序时,ADR伪指令被编译器替换成一条合适的指令。
通常,编译器用一条ADD指令或者SUB指令来实现该伪指令的功能。
如果标号超出范围或者标号在他那个一文件(和同一段)内没有定义,则会产生一个错误,该指令不使用文字池。
语法格式
ADR
其中,register为目标寄存器。
Label为基于PC或者寄存器的地址表达式。
示例
Label1:
MOVr0,#25
ADRr2,label1
(3).ltorg
.ltorg伪操作用于在当前段(一般是.Text段)的当前地址(字对准地址)产生一个文字池。
语法格式
.ltorg
五、实验操作步骤
1.实验A
(1)新建工程:
先建立一个实验文件夹,如E\DK07101\002_asm2。
运行EmbestIDE集成开发环境,选择File→NewWorkspace菜单项,弹出一个对话框,输入工程名ARMcode等相关内容。
单击OK按钮,将创建一个新工程,并同时创建一个与工程名相同的工作区。
此时在工作区窗口将打开该工作区和工程。
(2)建立源文件:
选择File→New菜单项,弹出一个新的、没有标题的文本编辑窗口,输入光标位于窗口中第一行,按照实验参考程序编辑输入源文件代码。
编辑完后,保存文件ARMcode.s。
(3)添加源文件:
选择Project→AddToProject→File项,或单击工程管理窗口中的相应右键快捷菜单命令,打开文件选择对话框,在工程目录下选择刚才建立的源文件ARMcode.s。
(4)基本设置:
选择Project→Settings…菜单项,或按下快捷键Alt+F7,弹出工程设置对话框。
在工程设置对话框中,选择Processor属性页,对目标板所用处理器进行设置。
(5)生成目标代码:
选择Build→Buildasm_a菜单项,或按下快捷键F7,生成目标代码。
也可以单击工具栏上相应按钮来完成。
(6)调试设置:
选择选择Project→Settings…菜单项,或按下快捷键Alt+F7,弹出工程设置对话框。
在工程设置对话框中,选择Remote页面,对调试设备模块进行设置。
选择Debug页面,对进行调试模块设置。
(7)选择Debug→RemoteConnect连接软件仿真器,执行Download命令下载程序,并打开寄存器窗口。
(8)打开存储器窗口,观察地址0x8054~0x80A0的内容,以及地址0x80A4~0X80F0的内容。
(9)单步执行程序并观察和记录寄存器与存储器值的变化,注意观察步骤8的地址中的内容变化。
当执行STMFD、LDMFD、LDMIA和STMIA指令时,注意观察其后面的参数所指的地址段或寄存器段的内容变化。
(10)结合实验内容和相关资料,观察程序运行,通过实验加深理解ARM指令的使用。
2.实验B
(1)创建新的工程,工程名为ARMcode2。
(2)按照参考程序,重新编写源代码文件,并保持为ARMcode2.s,并把它们加入工程中。
(3)按照编译→汇编器设置→链接器设置→调试器设置来设置新工程,并编译、链接工程。
(4)下载调试文件,打开Memrory/Register/Watch/Variable/CallStack窗口,单步执行程序。
通过以上窗口,跟踪程序运行,观察分析并记录运行结果,通过实验学会使用EmbestIDE进行应用程序的开发与调试。
六、实验参考程序
1实验A参考程序
.global_start
.text
.equnum,20/*Setnumberofwordstobecopied*/
_start:
LDRr0,=src/*r0=pointertosourceblock*/
LDRr1,=dst/*r1=pointertodestinationblock*/
MOVr2,#num/*r2=numberofwordstocopy*/
MOVsp,#0x400/*setupstackpointer(r13)*/
blockcopy:
MOVSr3,r2,LSR#3/*numberofeightwordmultiples*/
BEQcopywords/*lessthaneightwordstomove?
*/
STMFDsp!
{r4-r11}/*savesomeworkingregisters*/
octcopy:
LDMIAr0!
{r4-r11}/*load8wordsfromthesource*/
STMIAr1!
{r4-r11}/*andputthematthedestination*/
SUBSr3,r3,#1/*decrementthecounter*/
BNEoctcopy/*...copymore*/
LDMFDsp!
{r4-r11}/*don'tneedthesenow-restoreoriginals*/
copywords:
ANDSr2,r2,#7/*numberofoddwordstocopy*/
BEQstop/*Nowordslefttocopy?
*/
wordcopy:
LDRr3,[r0],#4/*awordfromthesource*/
STRr3,[r1],#4/*storeawordtothedestination*/
SUBSr2,r2,#1/*decrementthecounter*/
BNEwordcopy/*...copymore*/
stop:
Bstop
.ltorg
src:
.long1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4
dst:
.long0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.end
2.实验B参考程序
.global_start
.text
.equnum,2/*Numberofentriesinjumptable*/
_start:
MOVr0,#0/*setupthethreeparameters*/
MOVr1,#3
MOVr2,#2
BLarithfunc/*callthefunction*/
stop:
Bstop
arithfunc:
/*labelthefunction*/
CMPr0,#num/*Treatfunctioncodeasunsignedinteger*/
BHSDoAdd/*Ifcodeis>=2thendooperation0.*/
ADRr3,JumpTable/*Loadaddressofjumptable*/
LDRpc,[r3,r0,LSL#2]/*Jumptotheappropriateroutine*/
JumpTable:
.longDoAdd
.longDoSub
DoAdd:
ADDr0,r1,r2/*Operation0,>1*/
MOVpc,lr/*Return*/
DoSub:
SUBr0,r1,r2/*Operation1*/
MOVpc,lr/*Return*/
.end/*marktheendofthisfile*/
七、实验报告
(1)画出程序A的实现框图,并说明实验A程序实现的功能是什么?
(2)记录程序A和程序B单步运行时有关寄存器与存储器的值,并分析有关结果是否正确。
实验三汇编与C语言的相互调用实验
一、实验目的
1.阅读EmbestS3CEV40启动代码,观察处理器启动过程。
2.学会使用EmbestIDE辅助信息窗口来分析判断调试过程和结果
3.学会在EmbestIDE环境中编写、编译与调试汇编和C语言相互调用的程序。
二、实验设备
1.硬件:
PC机;
2.软件:
EmbestIDE2004集成开发环境。
Windows98/2000/NT/XP。
三、实验内容
使用汇编完成一个随机数产生函数,通过C语言调用该函数,产生一系列随机数,存放到数组中。
四、实验原理
1.ARM过程调用ATPCS(ARM)
ATPCS是一系列规定应用程序之间相互调用的基本规则,包括:
●支持数据栈限制检查;
●支持只读段位置无关(ROPI);
●支持可读/写段位置无关(RWPI);
●支持ARM程序和Thumb程序的混合使用;
●处理浮点运算。
使用以上规定的ATPCS规则是,应用程序必须遵守如下:
●程序编写遵守ATPCS;
●变量传递以中间寄存器和数据栈完成;
●汇编器使用-apcs开关选项。
关于其他ATPCS规则,用户可以参考ARM处理器相关书籍或登录ARM公司网站。
程序只要遵守ATPCS相应规则,就可以使用不同的源代码来编写程序。
程序间的相互调用最主要的是解决参数传递问题。
应用程序之间使用中间及数据栈来传递参数,其中,第1~4个参数使用R0~R3,多用4个参数数据栈进行传递。
这样,接受参数的应用程序必须知道参数的个数。
但是,在应用程序被调用时,一般无从知道所传递参数的个数。
用不同语言编写的应用程序在调用时可以自定义传递的约定。
使用具有一定意义的形式来传递,可以很好地解决参数个数的问题。
常用方法是把第1个或最后1个参数作为参数个数(包括个数本身)传递给应用程序。
ATPCS中寄存器的相应关系如表3.1所列。
表3.1ATPCS规则中寄存器列表
ARM
寄存器
ATPCS
别名
ATPCS寄存器说明
ARM
寄存器
ATPCS
别名
ATPCS寄存器说明
R0~R3
a1~a4
参数/结果/scratch寄存器1~4
R10
v7、sl
ARM状态局部变量寄存器7,数据栈限制指针寄存器
R4
v1
局部变量寄存器1
R11
v8
ARM状态局部变量寄存器8
R5
v2
局部变量寄存器2
R12
ip
子程序内部调用的临时(scratch)寄存器
R6
v3
局部变量寄存器3
R13
sp
数据栈指针寄存器
R7
v4、wr
局部变量寄存器4
Thumb状态工作寄存器
R14
lr
链接寄存器
R8
v5
ARM状态局部变量寄存器5
R15
PC
程序计数器
R9
v6、sb
ARM状态局部变量寄存6
RWPI的静态基址寄存器
2.main()与__gccmain()函数
当应用程序中包含了main()函数时,会引起对C运行时库的初始化。
该初始化是通过函数__gccmain()实现的,即在main()函数入口处,编译器会首先调用__gccmain()函数,然后才是执行编写的代码。
__gccmain()函数在GCC的标准库里实现。
当应用程序中没有包含main()函数时,不会引起对C运行时库的初始化。
这时,C运行时库的很多功能在应用程序中是不能使用的。
如果使用main()函数作为应用程序的主函数,那么可以在源代码中间加入一个空的__gccmain()函数(用C语言或汇编语言即可)
五、实验操作步骤
1.创建新的工程,工程名为explasm。
2.按照参考程序,重新编写源代码文件,并分别保持为randtest.c、init.s、random.s和ldscript,并把它们加入工程中。
3.按照编译→汇编器设置→链接器设置→调试器设置来设置新工程,并编译、链接工程。
4.下载调试文件,打开Memrory/Register/Watch/Variable/CallStack窗口,单步执行程序。
通过以上窗口,跟踪程序运行,观察分析并记录运行结果,通过实验学会使用EmbestIDE进行应用程序的开发与调试。
六、实验参考程序
1.randtest.c参考源代码
/*Randomnumbergeneratordemoprogram
Callsassemblerfunction'randomnumber'definedinrandom.s
*/
//#include
/*thisfunctionprototypeisneededbecause'randomnumber'isexternal*/
externunsignedintrandomnumber(void);
intmain()
{
inti;
intnTemp;
unsignedintrandom[10];
for(i=0;i<10;i++)
{
nTemp=randomnumber();
random[i]=nTemp;
}
return(0);
}
2.init.s参考源代码
#*******************************************************
#*NAME:
44BINIT.S*
#*Version:
10.Apr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 实验 指导书