嵌入式实验报告(答案)_第1页
嵌入式实验报告(答案)_第2页
嵌入式实验报告(答案)_第3页
嵌入式实验报告(答案)_第4页
嵌入式实验报告(答案)_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验报告ARM嵌入式系统原理及应用开发目录实验一ARM汇编指令实验1 1实验二ARM汇编指令实验2 4实验三汇编与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。存储器格式ARM体系结构将存储器看作是从零地址开始的字节的线性组合。字节0~3存放第一个字,字节4~7存放第2个字,以此类推。 ARM体系结构可以用两种方法存储字数据,分别称为大端格式和小端格式。GNU根底知识EmbestIDE集成了GNU汇编器as、编译器gcc和链接器ld。因此,编写程序要符合CNU的语法和规那么。关于as.gcc和ld的具体使用,请参照EmbestIDE所带的电子文档ProgRef.chm。五.实验操作步骤1.实验A〔1〕新建工程:先建一个文件夹如:H:\test1。然后运行ADS1.2集成开发环境,选择File→New菜单项,弹出一个对话框,然后出来图1.1新建工程类型选择对话框,选择project,在“Projectname〞中输入工程文件名〞test1〞,点击确定,同时创立一个与工程名相同的工作区。〔2〕建立源程序并添加到工程.在File的菜单项中选择“New〞,弹出一个对话框,点击“file〞,在“filename〞中输入文件名test1.s编辑完后,点确定。〔3〕添加源文件:选择Project→AddToProject→File项,或单击工程管理窗口中的相应右键快捷菜单命令,翻开文件选择对话框,在工程目录下选择刚刚建立的源并添加到文件test1.s。在“AddFiles〞对话框中选择“DebugRel〞〔4〕根本设置:设置中只需设置“entrypoint〞〔5〕生成目标代码:按下列图标生成目标代码。〔6〕调试设置:按下列图标。首先编译和链接之后,在工程test1所在的目录下生成一个名为“test_data的目录,同时翻开对话框使用Debugrel目标,选择生成的test.axf用于调试。〔7〕翻开存储器窗口,观察地址0x1000~0x101F的内容.〔8〕单步执行程序并观察和记录存放器与存储器值的变化。〔9〕结合实验内容和相关资料,观察程序运行,通过实验加深理解ARM指令。2.实验B(1)在工作区窗口工作区名称上右击鼠标,在弹出的快捷菜单中选择“AddNewProjecttoWorkspace…〞。〔2〕参照实验A及相应的实验参考程序,建立工程〔3〕参照实验A的步骤完成目标代码的生成与调试。六.实验参考程序1.实验A参考程序X EQU 45 /*定义变量x,并赋值为45*/Y EQU 64 /*定义变量y,并赋值为64*/STACK_TOP EQU 0x1000 /*定义栈顶0x1000*/ AREAInit,CODE,READONLY CODE32 ENTRYSTART /*程序代码开始标志*/ MOV SP,#STACK_TOP MOV R0,#X /*x的值放入R0*/ STR R0,[SP] /*R0的值保存到堆栈*/ MOV R0,#Y /*y的值放入R0*/ LDR R1,[SP] /*取堆栈中的数到R1*/ ADD R0,R0,R1 STR R0,[SP]STOP B STOP /*程序结束,进入死循环*/END实验B参考程序X EQU 45 /*定义变量x,并赋值为45/Y EQU 64 /*定义变量y,并赋值为64*/Z EQU 87 /*定义变量z,并赋值为87*/STACK_TOP EQU 0x1000 /*定义栈顶0x1000*/ AREAInit,CODE,READONLY CODE32 ENTRYSTART MOV R0,#X /*x的值放入R0*/ MOV R0,R0,LSL#8 /*R0的值乘以2的8次方*/ MOV R1,#Y /*y的值放入R1*/ ADD R2,R0,R1,LSR#1 /*R1的值除以2加上r0的值放入R2*/ MOV SP,#0x1000 STR R2,[SP] /*R2的值0x2D20放在0x1000的地址中*/ MOV R0,#Z /*z的值放入R0*/ AND R0,R0,#0xff /*取R0的低八位*/ MOV R1,#Y /*y的值放入R1*/ ADD R2,R0,R1,LSR#1 /*R1的值除以2加上r0的值放入R2*/ LDR R0,[SP] /*SP的值〔0X2D20〕放入R1*/ MOV R1,#0x01 /*R1赋值0x01*/ ORR R0,R0,R1 /*该指令设置R0的0位,其余位保持不变*/ MOV R1,R2 /*R2的值放入R1*/ ADD R2,R0,R1,LSR#1 /*R1的值除以2加上r0的值放入R2*/STOP B STOP /*程序结束,进入死循环*/ END七.实验报告〔1〕画出程序A、程序B的实现框图,并说明实验A、B程序实现的功能是什么?实验A:最后的值0x6D放在0x1000的地址中,实现的是两数的想加45+64=109(0x6D)实验B:0x1000的地址:64/2+45*2^8=11552(0x2D20)R1:〔64/2+87〕=0x77R0:0x2D20+0x01=0x2D21R2:0x77/2+0x2D21=0x2D5C〔2〕记录程序A和程序B单步运行时有关存放器与存储器的值,并分析有关结果是否正确。实验1A实验B地址:0x2D20放在0x1000的地址中,0x77放在R1中,0x2D21放在R0中,0x2D5C放在R2中实验二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的格式如下:313029282726876543210NZCVQDNM(RAZ)IFTMMMMM2.本实验涉及到得as语法及规那么1〕标号的使用标号由一个符号后跟一个冒号组成,它表示程序中当前的指令或者数据地址。如果在程序中出现两个相同的标号,汇编器会产生一个警告,同时,只有第一个标号有效。2)几个伪指令〔1〕LDRLDR伪指令讲一个32位常数或者一个地址值读取到存放器中。当需要读取到存放器中的数据超过了MOV或者MNV指令可以操作的范围时,可以使用LDR伪指令将该数据读取到存放器中。在汇编编译器处理源程序时,如果该常数没有超过MOV或者MNV可以操作的范围,那么LDR指令被这两条指令中的一条所替代;否那么,该常数将被放在最近的一个文字池〔LiteralPool〕内,同时,本指令被一条基于PC的LDR指令代替。语法格式LDR<register>,=<expression>其中,expression为需要读取的32位常数。Register为目标存放器。例如LDRr1,=0xffLDRr0,=0xfff0000(2)ADRADR指令将基于PC的地址值或者给予存放器的地址值读取到存放器中。在汇编编译器处理源程序时,ADR伪指令被编译器替换成一条适宜的指令。通常,编译器用一条ADD指令或者SUB指令来实现该伪指令的功能。如果标号超出范围或者标号在他那个一文件〔和同一段〕内没有定义,那么会产生一个错误,该指令不使用文字池。语法格式ADR<register><label>其中,register为目标存放器。Label为基于PC或者存放器的地址表达式。例如Label1:MOVr0,#25ADRr2,label1(3).ltorg.ltorg伪操作用于在当前段〔一般是.Text段〕的当前地址〔字对准地址〕产生一个文字池。语法格式.ltorg五、实验操作步骤1.实验A前面的步骤重复实验一。〔1〕翻开存储器窗口,观察地址0x104C~0x105F的内容,以及地址0x1060~0X1073的内容。〔2〕单步执行程序并观察和记录存放器与存储器值的变化,注意观察的地址中的内容变化。当执行STMFD、LDMFD、LDMIA和STMIA指令时,注意观察其后面的参数所指的地址段或存放器段的内容变化。〔3〕结合实验内容和相关资料,观察程序运行,通过实验加深理解ARM指令的使用。2.实验B〔1〕创立新的工程,工程名为test2.mcp。〔2〕按照参考程序,重新编写源代码文件,并保持为test2.s,并把它们参加工程中。〔3〕按照编译→汇编器设置→链接器设置→调试器设置来设置新工程,并编译、链接工程。〔4〕下载调试文件,翻开Memrory/Register/Watch/Variable/CallStack窗口,单步执行程序。通过以上窗口,跟踪程序运行,观察分析并记录运行结果,通过实验学会使用ADS1.2进行应用程序的开发与调试。六、实验参考程序1实验A参考程序NUM EQU 20 AREAInit,CODE,READONLY CODE32 ENTRYSTART LDRR0,=SRC LDRR1,=DST MOV R2,#NUM MOVSP,#0x400BLKCOPY MOVS R3,R2,LSR#3 BEQ COPYWORDS STMFD SP!,{R4-R11}OCTCOPY LDMIA R0!,{R4-R11} STMIA R1!,{R4-R11} SUBS R3,R3,#1 BNE OCTCOPY LDMFD SP!,{R4-R11}COPYWORDS ANDS R2,R2,#7 BEQ STOPWORDCOPY LDRR3,[R0],#4 STRR3,[R1],#4 SUBSR2,R2,#1 BNEWORDCOPYSTOP B STOPSRC DCB1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,10,11,12,13DST DCB0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0END七、实验报告〔1〕画出程序A的实现框图,并说明实验A程序实现的功能是什么?功能:将0x104c~0x109b的20个子数据复制到目标地址区0x109c~0x10eb同时先将源数据区的起始地址R0和目标数据区的R1以及总的子数据个数R2,第一次次批量8个批量复制到中间的存放器R4~R11,再将中间存放器的数据批量存储到目的数据存储区,然后进行数据复制是否完毕的判断,假设未复制完毕,修改有关数据的地址,并重复前面的数据复制工作,再批量一次复制8个数到中间的存放器R4~R11,再将中间存放器的数据批量存储到目的数据存储区。剩下4个进行一个字的复制,通过R3复制4次最终到目标地址区。〔2〕记录程序A和程序B单步运行时有关存放器与存储器的值,并分析有关结果是否正确。1.第一次运行R3=22,再一次运行R3=03.最后复制完毕123456781234567810111213实验三汇编与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~R3a1~a4参数/结果/scratch存放器1~4R10v7、slARM状态局部变量存放器7,数据栈限制指针存放器R4v1局部变量存放器1R11v8ARM状态局部变量存放器8R5v2局部变量存放器2R12ip子程序内部调用的临时(scratch)存放器R6v3局部变量存放器3R13sp数据栈指针存放器R7v4、wr局部变量存放器4

Thumb状态工作存放器R14lr链接存放器R8v5ARM状态局部变量存放器5R15PC程序计数器R9v6、sbARM状态局部变量存放6

RWPI的静态基址存放器五、实验操作步骤1.首先先创立一个新的工程randomnumber.mcp。2.再把实验中提供的程序将源文件randtest.c、init.s、random.s和ldscript.scf参加到新的工程里面。3.按照编译→汇编器设置→链接器设置→调试器设置来设置新工程,并编译、链接工程。4.下载调试文件,翻开Memrory/Register/Watch/Variable/CallStack窗口,单步执行程序。通过以上窗口,跟踪程序运行,观察分析并记录运行结果,通过实验学会使用ADS1.2进行应用程序的开发与调试。六、实验参考程序1.randtest.c参考源代码#include<stdio.h>externunsignedintrandomnumber(void);intmain(){ inti; intnTemp; unsignedintrandom[14]; for(i=0;i<14;i++) { nTemp=randomnumber(); random[i]=nTemp; } return(0);}2.init.s参考源代码 AREAInit,CODE,READONLY CODE32 ENTRYSTART BReset_HandlerUndefined_Handler BUndefined_HandlerSWI_Handler BSWI_HandlerPrefetch_Handler BPrefetch_HandlerAbort_Handler BAbort_Handler NOP IRQ_Handler BIRQ_HandlerFIQ_Handler BFIQ_HandlerReset_Handler LDR SP,=0x00002000 IMPORTmain _main EXPORT_main ldrr0,=main mov

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论