嵌入式实验报告Word文件下载.docx

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

嵌入式实验报告Word文件下载.docx

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

嵌入式实验报告Word文件下载.docx

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

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

实验截图:

由程序可知,初始状态是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。

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!

SUBSR1,R1,#1;

循环变量R1自减1

BNEloop;

不为0返回循环

LDMIAR0!

将以R0起始地址的值存入R4~R11

HALTBHALT;

停留,循环

srcDCD0,0,0,0,0,0,0,0

进行步的运行,观察结果可以发现,每遍历一遍,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

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;

--#0xd0通用寄存器到状态寄存器

--cpsr状态寄存器到通用寄存器

stmfdsp!

{r1-r11};

?

切换到管理模式

msrcpsr_c,#0xdf

mrsr0,cpsr

{r1-r12}

haltbhalt

initstack

movr0,lr;

--1r,因为各种模式下r0是相同的,而各个模式?

设置管理模式堆栈

msrcpsr_c,#0xd3;

11010011cpsr[4:

0]

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;

返回

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

;

*********异常矢量入口表*************

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;

--lr,因为各模式下r0是相同的而各个模式?

msrcpsr_c,#0xd3;

11010011

ldrsp,stacksvc

msrcpsr_c,#0xd2;

11010010

ldrsp,stackirq

msrcpsr_c,#0xd1;

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

#include<

stdio.h>

intmain()

{

externvoiddelayxms(intxms);

inti=100;

while

(1)

{

delayxms(1000);

i--;

if(i==0)i=100;

}

return0;

}

*****************************

EXPORTdelayxms

areadelay,code,readonly

下面是延时若干秒子程序

delayxms

{r11};

subr0,r0,#1;

r0=r0-1

ldrr11,=1000

loop2

subr11,r11,#1

cmpr11,#0x0

bneloop2

cmpr0,#0x0;

将r0与0比较

bnedelayxms;

比较结果不为0,继续调用delayxms

ldmfdsp!

movpc,lr;

源程序分为三部分加入工程中,如下图所示:

设置三个程序的链接顺序,如下图所示:

4.2实验五ARM硬件接口实验1---基本IO实验

按照实验课本上的步骤敲入程序,将程序烧到开发板上,实验结果拍照如下

直接运行时跑马灯顺时针轮换变亮,按下按键后,变为逆时针轮换变亮。

4.3实验六ARM硬件接口实验2---外部中断实验

本实验将按钮开关所连接的GPF5引脚设定为外部中断EINT5,中断模式位IRQ,在中断服务程序中完成LED灯的切换,即正常状态时LED5灯亮,按下按钮开关时LED6灯亮。

硬件实现如上图所示。

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

当前位置:首页 > 职业教育 > 中职中专

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

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