嵌入式实验报告.docx

上传人:b****5 文档编号:5974500 上传时间:2023-01-02 格式:DOCX 页数:23 大小:616.64KB
下载 相关 举报
嵌入式实验报告.docx_第1页
第1页 / 共23页
嵌入式实验报告.docx_第2页
第2页 / 共23页
嵌入式实验报告.docx_第3页
第3页 / 共23页
嵌入式实验报告.docx_第4页
第4页 / 共23页
嵌入式实验报告.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

嵌入式实验报告.docx

《嵌入式实验报告.docx》由会员分享,可在线阅读,更多相关《嵌入式实验报告.docx(23页珍藏版)》请在冰豆网上搜索。

嵌入式实验报告.docx

嵌入式实验报告

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灯亮。

硬件实现如上图所示。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1