本科实验指导书修改版嵌入式实验.docx
- 文档编号:24332044
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:52
- 大小:634.80KB
本科实验指导书修改版嵌入式实验.docx
《本科实验指导书修改版嵌入式实验.docx》由会员分享,可在线阅读,更多相关《本科实验指导书修改版嵌入式实验.docx(52页珍藏版)》请在冰豆网上搜索。
本科实验指导书修改版嵌入式实验
1、ADS1.2集成开发环境练习
1.1实验目的
了解ADS1.2集成开发环境的使用方法。
1.2实验设备
硬件:
PC机一台
软件:
Windows98/XP/2000系统,ADS1.2集成开发环境
1.3实验内容
1.建立一个新的工程;
2.建立一个C源文件,并添加到工程中;
3.设置编译连接控制选项;
4.编译连接工程。
1.4实验预习要求
仔细阅读本书第2.2节ADS工程编辑的内容。
1.5实验步骤
1.启动ADS1.2IDE集成开发环境,选择【File】->【New…】,使用ARMExecutableImage
工程模板建立一个工程,工程名称为ADS,见图1。
图1建立ARM指令代码的工程
2.选择【File】->【New…】建立一个新的文件TEST1.S,设置直接添加到项目中,见
图1.2。
输入如程序清单1所示的代码,并保存,见图1.3。
图2新建文件TEST1.S
程序清单1TEST1.S文件代码
AREAExample1,CODE,READONLY;声明代码段Example1
ENTRY;标识程序入口
CODE32;声明32位ARM指令
STARTMOVR0,#15;设置参数
MOVR1,#8
ADDSR0,R0,R1;R0=R0+R1
BSTART
END
图3添加了TEST1.S的工程管理窗口
1.选择【Edit】->【DebugRelSettings…】,在DebugRelSettings对话框的左边选择ARM
Linker项,然后在Output页设置连接地址(见图1.4),在Options页设置调试入口地址(见图
1.5)。
图4工程连接地址设置
图5工程调试入口地址设置
4.选择【Project】->【Make】,将编译连接整个工程。
1.6思考
工程模板有何作用?
(提示:
编译控制设置)
如何强行重新编译工程的所有文件?
(提示:
选择【Project】->【RemoveObjectCode…】
删除工程中的*.obj文件)
2汇编指令实验1
2.1实验目的
1.了解ADS1.2集成开发环境及ARMulator软件仿真;
2.掌握ARM7TDMI汇编指令的用法,并能编写简单的汇编程序;
3..掌握指令的条件执行和使用LDR/STR指令完成存储器的访问。
2.2实验设备
硬件:
PC机一台
软件:
Windows98/XP/2000系统,ADS1.2集成开发环境
2.3实验内容
使用LDR指令读取0x40003100上的数据,将数据加1,若结果小于10则使用STR指
令把结果写回原地址,若结果大于等于10,则把0写回原地址。
使用ADS1.2软件仿真,单步、全速运行程序,设置断点,打开寄存器窗口(Processor
Registers)监视R0、R1的值,打开存储器观察窗口(Memory)监视0x40003100上的值。
2.4实验预习要求
仔细阅读《ARM与嵌入式系统基础教程》第4章ARM指令系统的内容;
仔细阅读本书第2.2、2.3节ADS工程编辑和AXD调试的内容。
(本实验使用软件仿真)
2.5实验步骤
1.启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程Instruction1。
2.建立汇编源文件TEST2.S,编写实验程序,然后添加到工程中。
3.设置工程连接地址ROBase为0x40000000,RWBase为0x40003000。
设置调试入
口地址Imageentrypoint为0x40000000。
4.编译连接工程,选择【Project】->【Debug】,启动AXD进行软件仿真调试。
5.打开寄存器窗口(ProcessorRegisters),选择Current项监视R0、R1的值。
打开存储
器观察窗口(Memory)设置观察地址为0x40003100,显示方式Size为32Bit,监视
0x40003100地址上的值。
说明:
在Memory窗口中点击鼠标右键,Size项中选择显示格式为8Bit、16Bit、32Bit。
如图1.6所示。
6.可以单步运行程序,可以设置/取消断点,或者全速运行程序,停止程序运行,调试
时观察寄存器和0x40003100地址上的值。
运行结果见图1.7。
图6Memory窗口显示格式设置
图7汇编实验1程序运行结果
2.6实验参考程序
汇编指令实验1的参考程序见程序清单2。
程序清单2汇编指令实验1参考程序
COUNTEQU0x40003100;定义一个变量,地址为0x40003100
AREAExample2,CODE,READONLY;声明代码段Example2
ENTRY;标识程序入口
CODE32;声明32位ARM指令
STARTLDRR1,=COUNT;R1<=COUNT
MOVR0,#0;R0<=0
STRR0,[R1];[R1]<=R0,即设置COUNT为0
LOOPLDRR1,=COUNT
LDRR0,[R1];R0<=[R1]
ADDR0,R0,#1;R0<=R0+1
CMPR0,#10;R0与10比较,影响条件码标志
MOVHSR0,#0;若R0大于等于10,则此指令执行,R0<=0
STRR0,[R1];[R1]<=R0,即保存COUNT
BLOOP
END
2.7思考
若使用LDRB/STRB代替程序清单2中的所有加载/存储指令(LDR/STR),程序会得到
正确的执行吗?
LDR伪指令与LDR加载指令的功能和应用有何区别,举例说明?
(提示:
LDR伪指令
的形式为“LDRRn,=expr”)
LDR/STR指令的前索引偏移指令如何编写?
指令是怎样操作的?
在AXD调试时如何复位程序?
(提示:
选择【File】->【ReloadCurrentImage】重新加
载映象文件)
3汇编指令实验2
3.1实验目的
1.掌握ARM数据处理指令的使用方法;
2.了解ARM指令灵活的第2个操作数。
3.2实验设备
硬件:
PC机一台
软件:
Windows98/XP/2000系统,ADS1.2集成开发环境
3.3实验内容
1.使用MOV和MVN指令访问ARM通用寄存器;
2.使用ADD、SUB、AND、ORR、CMP、TST等指令完成数据加减运算及逻辑运算。
3.4实验预习要求
仔细阅读《ARM与嵌入式系统基础教程》第4章ARM指令系统的内容;
仔细阅读本书第2.2、2.3节ADS工程编辑和AXD调试的内容。
(本实验使用软件仿真)
3.5实验步骤
1.启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程Instruction2。
2.建立汇编源文件TEST3.S,编写实验程序,然后添加到工程中。
3.设置工程连接地址ROBase为0x40000000,RWBase为0x40003000。
设置调试入
口地址Imageentrypoint为0x40000000。
4.编译连接工程,选择【Project】->【Debug】,启动AXD进行软件仿真调试。
5.打开寄存器窗口(ProcessorRegisters),选择Current项监视各寄存器的值。
说明:
使用鼠标左键选择某一个寄存器,然后点击鼠标右键,Format项中选择显示
格式Hex、Decimal等等。
如图1.8所示。
图8设置寄存器显示格式
6.单步运行程序,观察寄存器值的变化。
说明:
有变化的寄存器会以红色显示。
如图1.9所示。
图9寄存器值更新的显示
3.6实验参考程序
汇编指令实验2的参考程序见程序清单3。
程序清单3汇编指令实验2参考程序
XEQU11;定义X的值为11
YEQU8;定义Y的值为8
BIT23EQU(1<<23);定义BIT23的值为0x00800000
AREAExample3,CODE,READONLY;声明代码段Example3
ENTRY;标识程序入口
CODE32;声明32位ARM指令
START;使用MOV、ADD指令实现:
R8=R3=X+Y
MOVR0,#X;R0<=X,X的值必须是8位图数据
MOVR1,#Y;R1<=Y,Y的值必须是8位图数据
ADDR3,R0,R1;即是R3=X+Y
MOVR8,R3;R8<=R3
;使用MOV、MVN、SUB指令实现:
R5=0x5FFFFFF8-R8*8
MVNR0,#0xA0000007;0xA0000007的反码为0x5FFFFFF8
SUBR5,R0,R8,LSL#3;R8左移3位,结果即是R8*8
;使用CMP指令判断(5*Y/2)>(2*X)吗?
若大于则R5=R5&0xFFFF0000,否则R5=R5|0x000000FF
MOVR0,#Y
ADDR0,R0,R0,LSL#2;计算R0=Y+4*Y=5*Y
MOVR0,R0,LSR#1;计算R0=5*Y/2
MOVR1,#X
MOVR1,R1,LSL#1;计算R1=2*X
CMPR0,R1;比较R0和R1,即(5*Y/2)和(2*X)进行比较
LDRHIR2,=0xFFFF0000;若(5*Y/2)>(2*X),则R2<=0xFFFF0000
ANDHIR5,R5,R2;若(5*Y/2)>(2*X),则R5=R5&R2
ORRLSR5,R5,#0x000000FF;若(5*Y/2)≤(2*X),则R5=R5|0x000000FF
;使用TST指令测试R5的bit23是否为1,若是则将bit6位清零(使用BIC指令)
TSTR5,#BIT23
BICNER5,R5,#0x00000040
BSTART
END
3.7思考
指令MOVR0,#0x12345678是否正确?
为什么?
将参考程序中应用CMP指令的代码,功能改为若(5*Y/2)>(2*X)则R5=R5|0x000000FF,
否则R5=R5&0xFFFF0000,程序应如何修改?
更改参考程序的X的值为200,Y的值为163,单步运行程序,每执行一步程序的结果
是多少?
如何实现64位加法运算(R6、R5)=(R6、R5)+(R3、R2)?
(提示:
使用ADC指令)
4汇编指令实验3
4.1实验目的
1.掌握ARM乘法指令的使用方法;
2.了解子程序编写及调用。
4.2实验设备
硬件:
PC机一台
软件:
Windows98/XP/2000系统,ADS1.2集成开发环境
4.3实验内容
使用STMFD/LDMFD、MUL指令编写一个整数乘方的子程序,然后使用BL指令调用
子程序计算
的值。
4.4实验预习要求
仔细阅读《ARM与嵌入式系统基础教程》第4章ARM指令系统的内容;
仔细阅读本书第2.2、2.3节ADS工程编辑和AXD调试的内容。
(本实验使用软件仿真)
4.5实验原理
=X*X*X……*X,其中相乘的X的个数为n个。
先将X的值装入R0和R1,使用
寄存器R2进行计数,循环n-1次R0=R0*R1,运算结果就保存在R0中。
(不考虑结果溢
出问题)
注意,若n为0,则运算结果直接赋1;若n为1,则运算结果直接赋X。
4.6实验步骤
1.启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程Instruction3。
2.建立汇编源文件TEST4.S,编写实验程序,然后添加到工程中。
3.设置工程连接地址ROBase为0x40000000,RWBase为0x40003000。
设置调试入
口地址Imageentrypoint为0x40000000。
4.编译连接工程,选择【Project】->【Debug】,启动AXD进行软件仿真调试。
5.打开寄存器窗口(ProcessorRegisters),选择Current项监视寄存器R0、R1、R13(SP)
和R14(LR)的值。
6.打开存储器观察窗口(Memory)设置观察地址为0x40003EA0,显示方式Size为
32Bit,监视从0x40003F00起始的满递减堆栈区。
7.单步运行程序,跟踪程序执行的流程,观察寄存器值的变化和堆栈区的数据变化,
判断执行结果是否正确。
8.调试程序时,更改参数X和n来测试程序,观察是否得到正确的结果。
例如:
先复
位程序(选择【File】->【ReloadCurrentImage】),接着单步执行到“BLPOW”
指令,在寄存器窗口中将R0、R1的值进行修改,然后继续运行程序。
说明:
用鼠标双击寄存器窗口的寄存器,即可修改寄存器的值。
输入数据可以是十进制
数(如136、198),也可以是十六进数(如0x123,0xF0),输入数据后回车确定。
4.7实验参考程序
汇编指令实验3的参考程序见程序清单4。
程序清单4汇编指令实验3参考程序
;文件名:
TEST4.S
;功能:
计算X的n次方的值
;说明:
X和n均为无符号整数
XEQU9;定义X的值为9
nEQU8;定义n的值为8
AREAExample4,CODE,READONLY;声明代码段Example4
ENTRY;标识程序入口
CODE32;声明32位ARM指令
STARTLDRSP,=0x40003F00;设置堆栈(满递减堆栈,使用STMFD/LMDFD指令)
LDRR0,=X
LDRR1,=n
BLPOW;调用子程序POW,返回值为R0
HALTBHALT
;名称:
POW
;功能:
整数乘方运算。
;入口参数:
R0底数
;R1指数
;出口参数:
R0运算结果
;占用资源:
R0、R1
;说明:
本子程序不考虑溢出问题
POW
STMFDSP!
{R1-R12,LR};寄存器入栈保护
MOVSR2,R1;将指数值复制到R2,并影响条件码标志
MOVEQR0,#1;若指数为0,则设置R0=1
BEQPOW_END;若指数为0,则返回
CMPR2,#1
BEQPOW_END;若指数为1,则返回。
(此时R0没有被更改)
MOVR1,R0;设置DO_MUL子程序的入口参数R0和R1
SUBR2,R2,#1;计数器R2=指数值减1
POW_L1BLDO_MUL;调用DO_MUL子程序,R0=R1*R0
SUBSR2,R2,#1;每循环一次,计数器R2减1
BNEPOW_L1;若计数器R2不为0,跳转到POW_L1
POW_ENDLDMFDSP!
{R1-R12,PC};寄存器出栈,返回
;名称:
DO_MUL
;功能:
32位乘法运算。
;入口参数:
R0乘数
;R1被乘数
;出口参数:
R0计算结果
;占用资源:
R0、R1
;说明:
本子程序不会破坏R1
DO_MULMULR0,R1,R0;R0=R1*R0
MOVPC,LR;返回
END
4.8思考
若需要考虑溢出问题(使用32位运算结果,判断运算是否溢出),如何修改实验参考程
序?
(提示:
使用UMULL指令)
在实验参考程序中的DO_MUL子程序,是否可以使用B、ADD、SUB指令返回?
(提
示:
修改程序进行测试)
5汇编指令实验4
5.1实验目的
学习ARM微控制器的16位Thumb汇编指令的使用方法。
5.2实验设备
硬件:
PC机一台
软件:
Windows98/XP/2000系统,ADS1.2集成开发环境
5.3实验内容
使用Thumb指令ADD、MOV、CMP、B实现1+2+3…+N的运算(N为0时,结果为0;
N为1时结果1)。
5.4实验预习要求
仔细阅读《ARM与嵌入式系统基础教程》第4章ARM指令系统的内容;
仔细阅读本书第2.2、2.3节ADS工程编辑和AXD调试的内容。
(本实验使用软件仿真)
5.5实验原理
ARM微控制器复位后处于ARM状态,此时只能执行ARM指令,所以需要使用BX指
令切换到Thumb状态,才能开始执行Thumb指令。
程序使用R0保存结果,所以一开始就要初始化为0;循环执行R0=R0+R1,R1为循环
计数器,从1开始计数,每一次循环R1加1;当循环计数器R1的值到达N时,运算结束。
5.6实验步骤
1.启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程Instruction4。
2.建立汇编源文件TEST5.S,编写实验程序,然后添加到工程中。
3.设置工程连接地址ROBase为0x40000000,RWBase为0x40003000。
设置调试入
口地址Imageentrypoint为0x40000000。
4.编译连接工程,选择【Project】->【Debug】,启动AXD进行软件仿真调试。
5.打开寄存器窗口(ProcessorRegisters),选择Current项监视各寄存器的值。
6.单步运行程序,注意执行BXR0指令前后CPSR寄存器的T位。
说明:
在寄存器窗口的CPSR寄存器,大写字母的位表示该位为1,小写字母的位表示
该位为0(比如“T”表示T位为1,“t”表示T位为0)。
5.7实验参考程序
汇编指令实验4的参考代码见程序清单5。
程序清单5汇编指令实验4参考程序
;文件名:
TEST5.S
;功能:
计算1+2+...+N的值
;说明:
N≥0,当N=0时结果为0;当N=1时结果为1。
NEQU100;定义N的值为100
AREAExample5,CODE,READONLY;声明代码段Example5
ENTRY;标识程序入口
CODE32;声明32位ARM指令
ARM_CODELDRSP,=0x40003F00;设置堆栈指针
ADRR0,THUMB_CODE+1
BXR0;跳转并切换处理器状态
LTORG;声明文字池
CODE16;声明16位Thumb指令
THUMB_CODE
LDRR0,=N;设置子程序SUM_N的入口参数
BLSUM_N;调用子程序SUM_N
BTHUMB_CODE
;名称:
SUM_N
;功能:
计算1+2+...+N的值
;入口参数:
R0N的值
;出口参数:
R0运算结果
;占用资源:
R0
;说明:
当N=0时结果为1;当N=1时结果为1。
;若运算溢出,结果为0。
SUM_N
PUSH{R1-R7,LR};寄存器入栈保护
MOVSR2,R0;将N的值复制到R2,并影响条件码标志
BEQSUM_END;若N的值为0,则返回。
(此时R0没有被更改)
CMPR2,#1
BEQSUM_END;若N的值为1,则返回。
(此时R0没有被更改)
MOVR1,#1;初始化计数器R1=1
MOVR0,#0;初始化结果寄存器R0=0
SUM_L1ADDR0,R1;R0=R0+R1
BCSSUM_ERR;结果溢出,跳转到SUM_ERR
CMPR1,R2;将计数器的值与N比较
BHSSUM_END;若计数器的值≥N,则运算结束
ADDR1,#1
BSUM_L1
SUM_ERRMOVR0,#0
SUM_ENDPOP{R1-R7,PC};寄存器出栈,返回
END
5.8思考
在Thumb指令只有哪一条指令具有条件执行功能?
Thumb指令“ADDRd,Rm”是否会更新条件码标志?
Thumb指令“MOVR8,#0xFF000000”是否正确?
如果不正确应如何更改?
6汇编指令实验5
6.1实验目的
通过实验了解如何使用ARM汇编指令实现结构化程序编程。
6.2实验设备
z硬件:
PC机一台
z软件:
Windows98/XP/2000系统,ADS1.2集成开发环境
6.3实验内容
使用ARM汇编指令实现if条件执行;
使用ARM汇编指令实现for循环结构;
使用ARM汇编指令实现while循环结构;
使用ARM汇编指令实现do…while循环结构;
使用ARM汇编指令实现switch开关结构。
6.4实验预习要求
仔细阅读《ARM与嵌入式系统基础教程》第4章ARM指令系统的内容;
仔细阅读本书第2.2、2.3节ADS工程编辑和AXD调试的内容。
(本实验使用软件仿真)
6.5实验步骤
1.思考如何使用ARM汇编指令实现结构化编程,具体的条件自己设定。
比如if条件
执行,if(x>y)z=0,设x为R0,y为R1,z为R2,汇编代码如何编写。
2.启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程Instruction5。
3.建立汇编源文件TEST6.S,编写实验程序,然后添加到工程中。
4.设置工程连接地址ROBase为0x40000000,RWBase为0x40003000。
设置调试入
口地址Imageentrypoint为0x40000000。
5.编译连接工程,选择【Project】->【Debug】,启动AXD进行软件仿真调试。
6.打开寄存器窗口(ProcessorRegisters),选择Current项监视各寄存器的值。
7.单步运行程序,判断程序是否按设计的程序逻辑执行。
6.6实验参考程序
汇编指令实验5的参考程序见程序清单6。
程序清单6汇编指令实验5参考程序
AREAExample6,CODE,READONLY;声明代码段Example6
ENTRY;标识程序入口
CODE32;声明32位ARM指令
START;if(x>y)z=100;
;elsez=50;
;设x为R0,y为R1,z为R2(x、y、z均为无符号整数)
MOVR0,#76;初始化x的值
MOVR1,#243;初始化y的值
CMPR0,R1;判断x>y?
MOVHIR2,#100;x>y条件正确,z=100
MOVLSR2,#50;条件失败,z=50
;for(i=0;i<10;i++)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 本科 实验 指导书 修改 嵌入式