验证性实验报告

  • 格式:doc
  • 大小:329.50 KB
  • 文档页数:19

嵌入式原理与应用实验报告报告题目:嵌入式原理与应用专业:电子与通信工程学号:2015085204姓名:杨明震日期:2016 年 3 月 3 日实验2.1 ADS1.2集成开发环境练习一、实验内容(1)建立一个新的工程。

(2)建立一个C源文件,并添加到工程中。

(3)设置文本编辑器支持中文。

(4)设置编译链接控制选项。

(5)编译链接工程。

(6)调试工程。

二、实验步骤(1)启动ADS1.2 IDE集成开发环境,选择【File】->【New…】,使用ARM Executable Image工程模板建立一个工程,工程名称为ARM,如图1所示。

图1 建立ARM指令代码的工程(2)选择【File】->【New…】建立一个新的文件test.S,设置直接添加到项目中,见图2。

输入如程序清单2.1所示的代码,并保存,见图3。

图2 新建文件test.S 程序清单 2.1 test.S文件代码AREA Example1,CODE,READONLYENTRYCODE32START MOV R0,#15MOV R1,#8ADDS R0,R0,R1B STARTEND图 3 添加了test.S的工程管理窗口(3)由于ADS安装以后默认字体是Courier New,对于中文支持不完善,因此建议修改字体。

选择【Edit】->【Perferences…】,可以看见以下对话框,如图4所示。

在Font选项设置字体是Fixedsys,Script是CHINESE_GB2312 。

由于Tab在不同文本编辑器解释不同,建议在Tab Inserts Spaces前打勾,使Tab键插入的是多个空格。

图片4 字体和Tab设置(4)选择【Edit】->【DebugRel Settings…】,在DebugRel Settings对话框的左边选择ARM Linker项,然后在Output页设置链接地址(见图5),在Options页设置调试入口地址(见图6)。

图5 工程链接地址设置图6 工程调试入口地址设置(5)选择【Project】->【Make】,将编译链接整个工程。

如果编译成功,见图7,Errors & Warnings对话框会报告编译错误为0,那么就可以对工程进行仿真。

图7 编译错误和警告对话框三、实验调试及结果选择【Project】->【Debug】,或者按下快捷键F5。

IDE环境就会启动AXD调试软件,见图8。

断点调试方法:首先设置断点,只需要在第6行灰色区域双击鼠标即可,如果出现红色实心圆点,那么表示断点设置成功,然后选择【Execute】->【Go】全速运行,可以发现程序停止在第6行。

还有一种比较方便的调试方法就是Run to Cursor,单击鼠标第8行灰色区域,如果AXD将第8行高亮就表示设置成功,然后选择【Execute】->【Run to Cursor】运行到光标,可以发现程序停止在第8行。

通过断点调试可以观察ARM寄存器数值变化。

图8 AXD调试窗口四、实验分析.本实验系统是采用基于ARM7TDMI微处理器实验平台。

通过实验我知道了MOV语句和LD语句区别在于MOV只能把立即数移动到寄存器中,或者在寄存器之间移动数据,而数据从内存到CPU之间的移动只能用LDR/STR,其中ARM嵌入式实验箱和PC机的通信,在ADS1.2集成开发环境下,我们可以很方便、很容易地完成很多小项目的开发。

ARM嵌入式实验箱上可以实现步进电机,数字键盘等等一系列的控制。

五、思考题(1)工程模板有哪些作用?答:ADS工程文件的设置比较复杂,不同的实验板、开发板由于硬件电路结构和资源不同,需要进行不同的设置,而对于同一实验板,则启动文件、ADS工程文件的配置及主要的初始化代码是相对固定的,因此可以把这些相关文件按一定方式组织起来,称为工作模板。

在工程模板的基础上,可以很方便的在同一实验板上开发或编写不同的应用程序。

(2)如何强行重新编译工程的所有文件?答:选择Project→Remove Object Code,删除工程中的*.obj文件。

实验2.4 汇编指令实验3一、实验目的1) 掌握ARM指令的使用方法2)了解子程序的编写和使用二、实验设备1)个人计算机电脑一台2)电脑上必须有运行系统如:Win7、win8、win10等等的操作系统,MDK开发软件必须安装,STM32开发板一块,还有相对应的一些下载设备等等。

三、实验内容使用STMFD/LDMFD、MUL指令编写一个整数乘方的子程序,然后使用BL指令调用子程序计算的值。

四、实验预习要求1)自己阅读有关实验的指导书,多做一些有参考价值的实验2)仔细阅读第四章的实验内容五、实验步骤1)启动MDK软件,新建一个工程,保存名为MDK12)建立汇编源程序文件,然后编写程序,添加到文件夹中3)设置工程链接地址为0x40000000,设置调试入口地址为Image entry point 0x40000000.然后编译工程再进行仿真,观察实验现象。

4)编译链接工程,选择Project→Debug,启动AXD进行软件仿真调试。

5) 打开寄存器窗口,选择Current项监视寄存器R0、R1、R13、R14的值。

6)打开存储器观察窗口,设置观察地址为0x40003EA0,显示方式Size为32B监视从0x40003F起始的满递减堆栈区。

7)单步运行程序,跟踪程序执行的流程,观察寄存器值得变化和堆栈区的数据变化,判断执行结果是否正确。

8)调试程序时,更改参数X和n来测试程序,观察是否得到正确的结果。

例如,先复位程序(选择File →Reload Current Image),接着单步执行到“BL POW”指令,在寄存器窗口中将R0和R1的值进行修改,然后继续运行程序。

六、实验参考程序;文件名:TEST4.S;功能:计算X的n次方的值;说明:X和n均为无符号整数X EQU 9 ;定义X的值为9n EQU 8 ;定义n的值为8AREA Example4,CODE,READON ;申明代码段Example4 ENTRYCOED32START LDRSP,=0x40003F00 ;LDR R0,=XLDR R1,=nBL POWHALT B HALT;名称:POW;功能:整数乘方运算;入口参数:R0 底数;R1 指数;出口参数:R0 运算结果;占用资源:R0、R1;说明:本子程序不考虑溢出问题POW STMFD SP!,{R1-R12,LR};现场保存,将R1--R12和LR寄存器内容入栈MOVS R2,R1 ;将R1给R2,标志位Z=0MOVEQ R0,#1 ;当Z=1的时候将1给R0BEQ POW_END ;当Z=0的时候跳转到POW_ENDCMP R2,#1 ;R2与1做比较BEQ POW_END ;若相等,跳转到POW_ENDMOV R1,R0 ;R0给R1SUB R2,R2,#1 ;R2=R2-1POW_L1 BL DO_MUL ;带链接的跳转到DO_MULSUBS R2,R2,#1 ;R2=R2-1,标志位Z变化BNE POW_L1 ;若Z=0的时候跳转到POW_L1 POW_END LDMFD SP!,{R1-R12,PC} ;恢复R1--R12和PC寄存器的内容,同时恢复CPSR寄存器的内容;名称:DO_MUL;功能:32位乘法;入口参数:R0 乘数;R1被乘数;出口参数:R0 运算结果;占用资源:R0、R1;说明:本子程序不会破坏R1DO_MUL MUL R0,R1,R0 ;R0=R1*R0MOV PC,LR ;END七、思考(1)若需要考虑溢出问题(使用32位运算结果,判断运算是否溢出),如何修改实验参考程序?答:用64位无符号乘法指令UMULL。

DO_MUL UMULL R3,R0,R1,R0 // R1*R0 的值的低32位给R0// 高32位给R3寄存器。

CMP R3,#0 // 比较R3与立即数0的大小。

BHI POW_END // 如果R3>0,那么溢出,寄存// 器出栈,返回。

MOV PC,LR // 返回。

END(2)实验参考程序中的DO_MUL子程序,是否可以使用B,ADD和SUB指令返回?答:可以。

POW_L1 BL DO_MUL // 调用DO_MUL子程序,R0 =//R1*R0POW_SB SUBS R2,R2,#1 // R2= R2 – 1,影响CPSR寄存//器(S)。

.BNE POW_L1 // 不相等,若计数器R2不0,//跳转到POW_L1。

POW_END LDMFD SP!,{R1 - R12,PC} // 寄存器出栈,返回DO_MUL MUL R0,R1,R0 // RO = R1 *R0;B POW_SB // 跳转到POW_SBEND实验2.7 ARM微控制器工作模式实验一、实验目的1.掌握如何使用MRS/MSR指令实现ARM微控制器工作模式的切换2.了解在各个工作模式下的寄存器二、实验设备硬件:PC机软件:Windows 98/XP/2000系统,ADS 1.2集成开发环境三、实验内容1.使用MRS/MSR指令切换工作模式,并初始化各种模式下的堆栈指针2.观察ARM微控制器在各种模式下寄存器的区别四、实验程序;定义堆栈的大小USR_STACK_LEGTH EQU 64SVC_STACK_LEGTH EQU 0FIQ_STACK_LEGTH EQU 16IRQ_STACK_LEGTH EQU 64ABT_STACK_LEGTH EQU 0UND_STACK_LEGTH EQU 0AREA Example7,CODE,READONL Y ;声明代码段Example7ENTARY ;标志程序入口CODE32 ;声明32位ARM指令START MOV R0 ,#0MOV R1 ,#1MOV R2 ,#2MOV R3 ,#3MOV R4 ,#4MOV R5 ,#5MOV R6 ,#6MOV R7 ,#7MOV R8 ,#8MOV R9 ,#9MOV R10 ,#10MOV R11 ,#11MOV R12 ,#12BL InitStack ;初始化各模块下的堆栈指针;打开IRQ中断(将CPSR寄存器的I位清0)MRS R0 ,CPSR ;R0<=CPSRBIC R0 ,R0 ,#0xB0MSR CPSR_cxsf ,R0 ;CPSR<=R0MSR CPSR_c ,#0xd0 ;切换到用户模式MRS R0 ,CPSRMSR CPSR_c ,#0xdf ;切换到管理模式MRS R0 ,CPSRHALT B HALT;名称:InitStack;堆栈初始化,即初始化各模式下的堆栈指针;入口参数:无;出口参数:无;说明:在特权模式调用此子函数,例如复位后的管理模式InitStackMOV R0 ,LR ;R0<=LR,因为各个模式下是R0相同的MSR CPSR_c ,#0xd3 ;设置管理模式堆栈LDR SP ,StackSvcMSR CPSR_c ,#0xd2 ;设置中断模式堆栈LDR SP ,StackIrqMSR CPSR_c ,#0xd1 ;设置快速中断模式堆栈LDR SP ,StackFiqMSR CPSR_c ,#0xd7 ;设置中止模式堆栈LDR SP ,StackAbtMSR CPSR_c ,#0xdb ;设置未定义模式堆栈LDR SP ,StackUndMSR CPSR_c ,#0xdf ;设置系统模式堆栈LDR SP ,StackUsrMOV PC ,R0StackUsr DCD UsrStackSpace +(USR_STACK_LEGTH - 1)*4StackSvc DCD SvcStackSpace +(SVC_STACK_LEGTH - 1)*4StackIrq DCD IrqStackSpace +(IRQ_STACK_LEGTH - 1)*4StackFiq DCD FiqStackSpace +(FIQ_STACK_LEGTH - 1)*4StackAbt DCD AbtStackSpace +(ABT_STACK_LEGTH - 1)*4StackUnd D CD UndStackSpace +(UND_STACK_LEGTH - 1)*4AREA MyStacks ,DA TA ,NOINIT ,ALIGN =2;分配堆栈空间UsrStackSpace SPACE USR_STACK_LEGTH * 4 ;用户模式堆栈空间SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;管理模式堆栈空间IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;中断模式堆栈空间FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;快速中断模式堆栈空间AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;中止模式堆栈空间UndStackSpace SPACE UND_STACK_LEGTH * 4 ;未定义模式堆栈空间END五、实验步骤《1》启动ADS1.2,使用ARM Executable Image 工程模版建立一个工程MODE。