嵌入式实验报告.docx
- 文档编号:5974500
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:23
- 大小:616.64KB
嵌入式实验报告.docx
《嵌入式实验报告.docx》由会员分享,可在线阅读,更多相关《嵌入式实验报告.docx(23页珍藏版)》请在冰豆网上搜索。
嵌入式实验报告
3.1实验一ARM汇编指令实验1---简单数据搬移实验
1.例题
源程序:
部分注释:
AREA用于声明一个只读或读写的代码或数据段,ENTRY声明程序入口,CODE32用于申明以下代码为32位ARM指令,END程序结束。
STRR0,[SP];将R0中的值放到SP中去
LDRR1,[SP];将SP中的值赋给R1
STRR0,[SP,#4];先执行SP+4,再将寄存器R0内容复制到SP指向的存储器
ADDR0,R0,R1;将R0+R1的值赋给R0
结果截图:
结果分析:
x和y的值分别为45,64,程序实现过程是将x放进R1,y放进R0,再将x+y放进R0,因此R0中结果为109,即为6D。
R1中结果为45,即为2D。
2.练习题
设计思路:
利用R0做基地址,将R1,R2分别存入第一个单元的内容,利用R3做循环计数器,利用R4遍历读取第2至最后一个数据,如果R1的数据小于新读入的R4数据则将R4的内容存入R1,如果R2的内容大于R4的内容则将R4的内容存入R2。
遍历完成之后,R1将存放最大数据,R2将存放最小数据。
源程序:
AREAInit,CODE,READONLY
ENTRY
CODE32
start
MOVSP,#0X400;给指针赋初值
LDRR0,=DataBuf;把数据定义表格中的值赋给R0
LDRR1,[R0],#4;取数
MOVR2,R1;R1赋给R2
MOVR3,#8;R3做循环计数器,赋值为8
compare
SUBR3,R3,#1;实现R3自减
CMPR3,#0;比较R3和0,确定循环是否结束
BEQover;若R3等于0,结束循环
LDRR4,[R0],#4
CMPR4,R1;比较R4和R1,找大值
BLTsmall1;小于跳转
MOVR1,R4
small1CMPR4,R2;比较R4和R2,找小值
BLTsmall2;小于跳转
BGTcompare;大于跳转
small2MOVR2,R4
Bcompare
over
B.
AREADatapool,DATA,READWRITE
DataBufDCD11,-2,35,47,96,63,128,-23;数据的定义采用伪指令DCD实现
END
结果截图:
结果分析:
遍历完成后,数据的最大值和最小值都已经找出,其中最大值存放在R1中,最小值存放在R2中。
由结果可知,R1中为0x00000080,即为128,R2中为0xFFFFFFE9,即为-23。
实验3.2ARM汇编指令实验2-字符串拷贝实验
1、例题
源程序:
AREAInit,CODE,READONLY
ENTRY
CODE32
START
MOVSP,#0x400;堆栈地址
LDRR0,=Src;将初始字符串地址给R0
LDRR1,=Dst;将目的字符串地址给R1
MOVR3,#0;给R3赋值0
strcopy
LDRBR2,[R0],#1;把R0给R2后加一
CMPR2,#0;比较R2和0,检测字符串是否结束
BEQendcopy;等于跳转到结束
STRBR2,[R1],#1;把R2给R1后R1+1
ADDR3,R3,#1;R3自加
Bstrcopy;循环
endcopy
LDRR0,=ByteNum;把字符数的地址给R0
STRR3,[R0];把R3的值放到R0中
B.
AREADatapool,DATA,READWRITE
SrcDCB"string\0";初始字符串存储空间
DstDCB0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;目的字符串存储空间
ByteNumDCD0
END
实验截图:
结果分析:
由程序可知,初始状态是R0存放起始字符串,R1存放目的字符串,R3赋初值0,拷贝字符串过程中,R3作为计数变量,每次自增一,拷贝借用R2做中转寄存器,每次复制到R2一个字符都要检查是否为0,若为0则字符串已经拷贝完毕,跳转到endcopy,若不为0则继续循环拷贝,直到结束。
最后将技术变量的值存放到到R0中。
实验结果截图可知,R0中为字符串长度,R1为目的字符串。
2、练习题
设计思路:
R4~R11起始值为1~8,每次加操作后把R4~R11的内容放入SP栈中,SP初始设置为0x800,最后把R4~R11清空赋值为0。
多字的加载与存储使用多寄存器寻址,使用的指令为LDM和STM。
源程序:
AREAInit,CODE,READONLY
ENTRY
CODE32
start
MOVSP,#0X800
LDRR0,=src;把src的地址赋给R0
LDRR2,=str;把str的地址赋给R2
MOVR1,#8
LDMIAR2!
{R4-R11};将以R2起始地址的值存入R4-R11
MOVR4,#1
MOVR5,#2
MOVR6,#3
MOVR7,#4
MOVR8,#5
MOVR9,#6
MOVR10,#7
MOVR11,#8;给寄存器赋初值
loop
ADDR4,R4,#1
ADDR5,R5,#1
ADDR6,R6,#1
ADDR7,R7,#1
ADDR8,R8,#1
ADDR9,R9,#1
ADDR10,R10,#1
ADDR11,R11,#1;赋值的循环部分,给每一个寄存器赋原值加一
STMIASP!
{R4-R11};
SUBSR1,R1,#1;循环变量R1自减1
BNEloop;不为0返回循环
LDMIAR0!
{R4-R11};将以R0起始地址的值存入R4~R11
HALTBHALT;停留,循环
srcDCD0,0,0,0,0,0,0,0
END
实验截图:
结果分析:
进行步的运行,观察结果可以发现,每遍历一遍,R4~R11所有值增1,循环次数为8,如此实现了8次赋值。
实验截图中为R1减到7时,此时赋值进行到R5,R5之前赋值两次,依次为3、4,R5之后赋值一次,依次为4、5、6、7、8、9。
3.3实验三ARM汇编指令实验3---ARM处理器工作模式实验
源程序:
usr_stack_legthequ64
svc_stack_legthequ32
fiq_stack_legthequ16
irq_stack_legthequ64
abt_stack_legthequ16
und_stack_legthequ16
areareset,code,readonly
entry
code32
start
movr0,#0
movr1,#1
movr2,#2
movr3,#3
movr4,#4
movr5,#5
movr6,#6
movr7,#7
movr8,#8
movr9,#9
movr10,#10
movr11,#11
movr12,#12
blinitstack;初始化各模式下的堆栈指针
;打开irp中断(将cpsr寄存器的i位清零)
mrsr0,cpsr;r0<--cpsr
bicr0,r0,#0x80;开irq中断
msrcpsr_cxsf,r0;cpsr<--r0
;切换到用户模式
msrcpsr_c,#0xd0;cpsr<--#0xd0通用寄存器到状态寄存器
mrsr0,cpsr;r0<--cpsr状态寄存器到通用寄存器
stmfdsp!
{r1-r11};?
;切换到管理模式
msrcpsr_c,#0xdf
mrsr0,cpsr
stmfdsp!
{r1-r12}
haltbhalt
initstack
movr0,lr;r0<--1r,因为各种模式下r0是相同的,而各个模式?
;设置管理模式堆栈
msrcpsr_c,#0xd3;11010011cpsr[4:
0]
ldrsp,stacksvc
stmfdsp!
{r1-r12}
;设置中断模式堆栈
msrcpsr_c,#0xd2;11010010
ldrsp,stackirq
stmfdsp!
{r1-r12}
;设置快速中断模式堆栈
msrcpsr_c,#0xd1;11010001
ldrsp,stackfiq
stmfdsp!
{r1-r12}
;设置中止模式堆栈
msrcpsr_c,#0xd7;11010111
ldrsp,stackabt
stmfdsp!
{r1-r12}
;设置未定义模式堆栈
msrcpsr_c,#0xdb;11011011
ldrsp,stackund
stmfdsp!
{r1-r12}
;设置系统模式堆栈
msrcpsr_c,#0xdf;11011111
ldrsp,stackusr
stmfdsp!
{r1-r12}
movpc,r0;返回
stackusrdcdusrstackspace+(usr_stack_legth-1)*4
stacksvcdcdsvcstackspace+(svc_stack_legth-1)*4
stackirqdcdirqstackspace+(irq_stack_legth-1)*4
stackfiqdcdfiqstackspace+(fiq_stack_legth-1)*4
stackabtdcdabtstackspace+(abt_stack_legth-1)*4
stackunddcdundstackspace+(und_stack_legth-1)*4
areareset,data,noinit,align=2
usrstackspacespaceusr_stack_legth*4
svcstackspacespacesvc_stack_legth*4
irqstackspacespaceirq_stack_legth*4
fiqstackspacespacefiq_stack_legth*4
abtstackspacespaceabt_stack_legth*4
undstackspacespaceund_stack_legth*4
end
实验结果截图:
以上截图为模式设置的寄存器值变化情况。
由cpsr可看出各个模式的设置过程。
以上截图为运行界面截图。
以上截图为复位后,寄存器值变化。
由此可以看出,复位后cpsr的值是0x000000D3,处于管理模式。
实验结果分析:
1.快速中断FIQ模式与其他模式存入的R1~R12不同,FIQ模式下R8~R12均变为0,分组寄存器的内容受保护。
2.切换到用户模式之后之后不可以从用户模式切换到其他模式,比如系统模式。
只有特权模式下可以切换到别的模式。
3.用户模式之下可以执行堆栈压栈操作。
4.模式切换过程中spsr无变化,用户模式下spsr不可用,特权模式下才可用。
上文截图中spsr发生变化是因为那时处于特权模式下设置过程。
3.4ARM汇编与C混合编程实验---ARM启动过程控制实验
源程序:
IMPORTmain
areaInit,code,readonly
entry
code32
;*********异常矢量入口表*************
startbReset_Handler
Undefined_HandlerbUndefined_Handler
SWI_HandlerbSWI_Handler
Prefetch_HandlerbPrefetch_Handler
Abort_HandlerbAbort_Handler
nop;Reservedvecto
IRQ_HandlerbIRQ_Handler
FIQ_HandlerbFIQ_Handler
Reset_Handler
blinitstack;初始化各模式下的堆栈指针
;切换到用户模式堆
msrcpsr_c,#0xd0;11010000
blmain
haltbhalt
initstackmovr0,lr;r0<--lr,因为各模式下r0是相同的而各个模式?
;设置管理模式堆栈
msrcpsr_c,#0xd3;11010011
ldrsp,stacksvc
;设置中断模式堆栈
msrcpsr_c,#0xd2;11010010
ldrsp,stackirq
;设置快速中断模式堆栈
msrcpsr_c,#0xd1;11010001
ldrsp,stackfiq
;设置中止模式堆栈
msrcpsr_c,#0xd7;11010111
ldrsp,stackabt
;设置未定义模式堆栈
msrcpsr_c,#0xdb;11011011
ldrsp,stackund
;设置系统模式堆栈
msrcpsr_c,#0xdf;11011111
ldrsp,stackusr
movpc,r0;返回
LTORG
stackusrdcdusrstackspace+128
stacksvcdcdsvcstackspace+128
stackirqdcdirqstackspace+128
stackfiqdcdfiqstackspace+128
stackabtdcdabtstackspace+128
stackunddcdundstackspace+128
areaInterrupt,data,READWRITE
usrstackspacespace128
svcstackspacespace128
irqstackspacespace128
fiqstackspacespace128
abtstackspacespace128
undstackspacespace128
end
#include
intmain()
{
externvoiddelayxms(intxms);
inti=100;
while
(1)
{
delayxms(1000);
i--;
if(i==0)i=100;
}
return0;
}
*****************************
EXPORTdelayxms
areadelay,code,readonly
code32
;下面是延时若干秒子程序
delayxms
stmfdsp!
{r11};
subr0,r0,#1;r0=r0-1
ldrr11,=1000
loop2
subr11,r11,#1
cmpr11,#0x0
bneloop2
cmpr0,#0x0;将r0与0比较
bnedelayxms;比较结果不为0,继续调用delayxms
ldmfdsp!
{r11};
movpc,lr;返回
end
源程序分为三部分加入工程中,如下图所示:
设置三个程序的链接顺序,如下图所示:
实验结果截图:
4.2实验五ARM硬件接口实验1---基本IO实验
按照实验课本上的步骤敲入程序,将程序烧到开发板上,实验结果拍照如下
直接运行时跑马灯顺时针轮换变亮,按下按键后,变为逆时针轮换变亮。
4.3实验六ARM硬件接口实验2---外部中断实验
本实验将按钮开关所连接的GPF5引脚设定为外部中断EINT5,中断模式位IRQ,在中断服务程序中完成LED灯的切换,即正常状态时LED5灯亮,按下按钮开关时LED6灯亮。
硬件实现如上图所示。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)