嵌入式系统实验指导指导书完整版.docx

上传人:b****8 文档编号:9812369 上传时间:2023-02-06 格式:DOCX 页数:62 大小:1.06MB
下载 相关 举报
嵌入式系统实验指导指导书完整版.docx_第1页
第1页 / 共62页
嵌入式系统实验指导指导书完整版.docx_第2页
第2页 / 共62页
嵌入式系统实验指导指导书完整版.docx_第3页
第3页 / 共62页
嵌入式系统实验指导指导书完整版.docx_第4页
第4页 / 共62页
嵌入式系统实验指导指导书完整版.docx_第5页
第5页 / 共62页
点击查看更多>>
下载资源
资源描述

嵌入式系统实验指导指导书完整版.docx

《嵌入式系统实验指导指导书完整版.docx》由会员分享,可在线阅读,更多相关《嵌入式系统实验指导指导书完整版.docx(62页珍藏版)》请在冰豆网上搜索。

嵌入式系统实验指导指导书完整版.docx

嵌入式系统实验指导指导书完整版

 

嵌入式系统实验指导

 

王艳春英一劲松

 

实验一嵌入式微处理器系统的开发环境

一、实验环境

PC机一台

软件:

ADS1.2集成开发环境一套

二、实验目的

1.了解嵌入式系统及其特点;

2.熟悉嵌入式系统的开发环境和基本配置并能编写简单的汇编程序

三、实验容

1.嵌入式系统的开发环境、基本配置

2.使用汇编指令完成简单的加法实验

四、实验步骤

(1)在D:

\新建一个目录,目录名为experiment。

(2)点击WINDOWS操作系统的“开始|程序|ARMDeveloperSuitev1.2|CodeWarriorfor

ARMDeveloperSuite”启动MetrowerksCodeWarrior,或双击“ADS1.2”快捷方式启动。

启动ADS1.2如图1-1所示:

图1-1启动ADS1.2

(3)在CodeWarrior中新建一个工程的方法有两种,可以在工具栏中单击“New”按钮,

也可以在“File”菜单中选择“New…”菜单。

这样就会打开一个如图1-2所示的对话框。

选择【File】->【New…】,使用ARMExecutableImage工程模板建立一个工程,名称为ADS,目录为D:

\experiment。

图1-2新建文件

在这个对话框中为用户提供了7种可选择的工程类型:

1)ARMExecutablImage:

用于由ARM指令的代码生成一个ELF格式的可执行映像文件;

2)ARMObjectLibrary:

用于由ARM指令的代码生成一个armar格式的目标文件库;

3)EmptyProject:

用于创建一个不包含任何库或源文件的工程;

4)MakefileImporterWizard:

用于将VisualC的nmake或GNUmake文件转入到CodeWarriorIDE工程文件;

5)ThumbARMExecutableImage:

用于由ARM指令和Thumb指令的混和代码生成一个可执行的ELF格式的映像文件;

6)ThumbExecutableimage:

用于由Thumb指令创建一个可执行的ELF格式的映像文件;

7)ThumbObjectLibrary:

用于由Thumb指令的代码生成一个armar格式的目标文件库。

(4)选择【File】->【New…】建立一个新的文件TEST1.S,设置直接添加到项目中。

输入如程序代码,并保存,此时在工程窗口中可以看到TEST1.S文件。

图1-3新建test1.s

(5)选择【Edit】->【Perferences…】,在Font选项设置字体是Fixedsys,Script是CHINESE。

图1-4设置字体

(6)选择【Edit】->【DebugRelSettings…】,在DebugRelSettings对话框的左边选择ARMLinker项,设置地址。

点击“DebugRelSettings…”图标按钮,即可进行工程的地址设置、输出文件设置、编

译选项等,如图1-5所示。

在“ARMLinker”对话框设置连接地址,在“LanguageSettings”中设置各编译器的编译选项。

对于简单的软件调试,可以不进行连接地址的设置,直接点击工程窗口的“Make”图标按钮,即可完成编译连接。

若编译出错,会有相应的出错提示,双击出错提示行信息,编辑窗即会使用光标指出当前出错的源代码行,编译连接输出窗口如图1-6所示。

同样,您可以在【Project】菜单中找到相应的命令。

图1-5连接器选项设置

图1-6output选项卡

OUTPUT选项卡:

该选项卡用来控制连接器进行连接操作的类型。

其中Linktype选项组中的单选按钮确定使用的连接方式。

这里选择Simple,连接器将根据连接器选项中指定的地址映射方式,生成简单的ELF格式的映像文件,所生成的映像文件中的地址映射关系比较简单.当选择Simple连接类型时,需要设置下列的连接器选项,如图1-5所示。

ROBase文本框中填入0x40000000。

地址0x40000000是开发板上SDRAM的真实地址,是由系统的硬件决定的;RWBase文本框中填入0x40003000指的是系统可读写存的地址。

也就是说,在0x40000000-0x40003000之间是只读区域,存放程序的代码段,从0x40003000开始是程序的数据段。

Layout选项卡:

该选项卡在连接方式位Simple时有效,它用来安排一些输入段在映像文件中的位置。

Placeatbeginningofimage选项组用于指定将某个输入段放置在它所在的运行时域的开头。

包含复位异常中断处理程序的输入段通常放置在运行时域的开头。

这里,在Object/Symbol文本框中指定目标文件的名称init.o,在Section文本框中指定输入段的名称init,从而确定了init.s源文件中的init输入段位指定的输入段。

如图1-7所示。

图1-7Layout选项卡中连接器选项

(6)选择【Project】->【Make】,或者按下快捷键F7,将编译整个工程。

如图1-8所示为工程窗口中的图标按钮,通过这些图标按钮,可以快速的进行工程设置,编译连接,启动调试等等.它们从左到右分别为

图1-8工程窗口中的图标按钮

A)DebugRelSettings…工程设置;

B)SynchronizeModificationDates同步修改日期;

C)Make编译连接;

D)Debug启动ADX进行调试;

E)Run启动ADX调试,并直接运行;

F)ProjectInspector工程检查,查看和配置工程中源文件的信息;

对于简单的软件调试,直接点击工程窗口的”Make”图标按钮,即可完成编译.编译连接输出窗口如图1-9所示。

图1-9编译连接输出窗口

(7)选择【Project】->【Debug】,或者按下快捷键F5。

IDE环境就会启动AXD调试软件,接着可以执行单步、全速运行调试。

图1-10AXD调试窗口

注意:

本实验使用软件仿真,所以要在AXD中选择【Options】->【ConfigureTarget…】菜单,然后在ChooseTarget窗口中选用ARMUL软件仿真。

图1-11目标环境选择

五思考题

1.工程模板有何作用?

2.如何强行重新编译工程的所有文件?

(提示:

选择【Project】->【RemoveObjectCode…】删除工程中的*.obj文件)

六参考程序

AREAExample1,CODE,READONLY;声明代码段Example1

ENTRY;标识程序入口

CODE32;声明32位ARM指令

STARTMOVR0,#15;设置参数

MOVR1,#8

ADDSR0,R0,R1;R0=R0+R1

BSTART

END

实验预作关键过程及结果图:

 

 

实验二汇编指令实验

一、实验环境

PC机一台

ADS1.2集成开发环境一套

二、实验目的

1.了解ADS1.2集成开发环境及ARMulator软件仿真方法;

2.掌握ARM7TDMI汇编指令的用法,并能编写简单的汇编程序;

3.掌握指令的条件执行和使用LDR/STR指令完成存储器的访问。

三、实验容

1.使用LDR/STR指令完成存储器的访问。

2.使用数据处理指令实现数据传送和算术和逻辑运算。

3.使用ADS1.2软件仿真,单步、全速运行程序,设置断点,打开寄存器窗口(ProcessorRegisters)监视寄存器的值,打开存储器观察窗口(Memory)监视存储器的值。

根据以上要求完成该操作:

使用LDR指令读取0x40003100上的数据,将数据加1,若结果小于10则使用STR指令把结果写回原地址,若结果大于等于10,则把0写回原地址……周而复此循环;使用ADS1.2软件仿真,单步、全速运行程序,设置断点,打开寄存器窗口(ProcessorRegisters)监视R0、R1的值,打开存储器观察窗口(Memory)监视0x40003100上的值。

四、实验步骤

(1)启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程Instruction1。

(2)建立汇编源文件TEST2.S,编写实验程序,然后添加到工程中。

(3)设置工程地址ROBase为0x40000000,RWBase为0x40003000。

设置调试入口地址Imageentrypoint为0x40000000。

(4)编译工程,选择【Project】->【Debug】,启动AXD进行软件仿真调试。

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

打开存储器观察窗口(Memory),设置观察地址为0x40003100,显示方式Size为32Bit,监视0x40003100地址上的值。

图2-1Memory窗口显示格式

设置寄存器显示格式与之类似。

使用鼠标左键选择某一个寄存器,然后点击鼠标右键,Format项中选择显示格式Hex,Decimal等等。

如图2-2所示。

图2-2设置寄存器显示格式

(6)单步运行程序,可以设置/取消断点,或者全速运行程序,停止程序运行,调试时观察寄存器和0x40003100地址上的值。

图2-3调试程序窗口

六、思考题

1.LDR伪指令与LDR加载指令的功能和应用有何区别,举例说明?

2.LDR/STR指令的前索引偏移指令如何编写?

指令是怎样操作的?

3.在AXD调试时如何复位程序?

(提示:

选择【File】->【ReloadCurrentImage】重新加载映象文件)

七、参考程序

COUNTEQU0x40003100;定义一个变量,地址为0x40003100

AREAExample2,CODE,READONLY;声明代码段Example2

ENTRY;标识程序入口

CODE32;声明32位ARM指令

STARTLDRR1,=COUNT;R1<=COUNT

MOVR0,#0;R0<=0

STRR0,[R1];[R1]<=R0,即设置COUNT为0

LOOPLDRR1,=COUNT

LDRR0,[R1];R0<=[R1]

ADDR0,R0,#1;R0<=R0+1

CMPR0,#10;R0与10比较,影响条件码标志

MOVHSR0,#0;若R0大于等于10,则此指令执行,R0<=0

STRR0,[R1];[R1]<=R0,即保存COUNT

BLOOP

END

实验预作关键过程及结果图:

单步运行观看寄存器和存储器的变化:

具体指令讲解见指令手册。

 

实验三:

基于ADS的C语言程序实验

一、实验环境

PC机一台

ADS1.2集成开发环境一套

二、实验目的

通过实验了解使用ADS1.2编写C语言程序,并进行调试。

三、实验容

编写一个汇编程序文件Startup.S和一个C程序文件Test.c。

汇编程序的功能是初始化堆栈指针和初始化C程序的运行环境,然后调跳转到C程序运行,这就是一个简单的启动程序。

C程序使用加法运算来计算1+2+3+...+(N-1)+N的值(N>0)。

四、实验预习要求

(1)仔细阅读《ARM嵌入式系统基础教程》中第4章ARM指令系统的容。

(2)仔细阅读产品配套光盘附带文档《ADS集成开发环境及仿真器应用》或其他相关资料,了解ADS工程编辑和AXD调试的容。

(本实验使用软件仿真)

五、实验步骤

(1)启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程ProgramC。

(2)建立源文件Startup.S和Test.c,编写实验程序,然后添加到工程中。

(3)设置工程地址ROBase为0x40000000,RWBase为0x40003000。

设置调试入口地址Imageentrypoint为Ox40000000。

(4)设置位于开始位置的起始代码段,如图3-1,3-2所示。

图3-1设置位于开始位置的起始代码段

(1)

图3-2设置位于开始位置的起始代码段

(2)

(5)编译工程,选择Project—Debug,启动AXD进行软件仿真调试。

(6)在Startup.s的“BMain”处设置断点,然后全速动行程序。

(7)程序在断点处停止。

单步运行程序,判断程序是否跳转到C程序中运行。

(8)诜择Processorvlews—variables打开变量观察窗口,观察全局变量的值,然后单步/全速运行程序,判断程序的运算结果是否正确。

如图3-3所示。

图3-3ARM实验3的运行观察结果

六、思考题

(1)在实验参考程序中,Startup.s文件的作用是什么?

如果没有Startup.s文件,C程序运行会出错吗?

(2)实验程序中的Main()函数名是否可以更改为其他名字?

(提示:

Main只是一个标号。

七、参考程序

;startupfile

IMPORT|Image$$RO$$Limit|

IMPORT|Image$$RW$$Base|

IMPORT|Image$$ZI$$Base|

IMPORT|Image$$ZI$$Limit|

IMPORTMAIN;declarethemain()intheCProg

AREAstart,CODE,READONLY

ENTRY

CODE32

Reset

LDRSP,=0x40003f00

;initialtheCcase

LDRR0,=|Image$$RO$$Limit|

LDRR1,=|Image$$RW$$Base|

LDRR3,=|Image$$ZI$$Base|

CMPR0,R1

BEQLOOP1

LOOP0

CMPR1,R3

LDRCCR2,[R0],#4

STRCCR2,[R1],#4

BCCLOOP0

LOOP1

LDRR1,=|Image$$ZI$$Limit|

MOVR2,#0

LOOP2

CMPR3,R1

STRCCR2,[R3],#4

BCCLOOP2

BMAIN

END

//mainfile

#defineuint8unsignedchar

#defineuint32unsignedint

 

#defineN100

uint32sum;

voidMAIN(void)

{

uint32i;

sum=0;

for(i=0;i<=100;i++)

sum+=i;

while

(1);

}

 

实验四:

C语言调用汇编程序实验

一、实验环境

PC机一台

ADS1.2集成开发环境一套

二、实验目的

掌握在C语言程序中调用汇编程序,了解ATPCS的基本规则。

三、实验容

在C程序调用汇编子程序,实现两个整数的加法运算。

汇编子程序的原型为:

uint32Add(uint32x,uint32y)

其中uint32已定义为unsignedint。

四、实验预习要求

(1)仔细阅读ARM公司的ATPCS的相关文档。

例如ATPCS.PDF。

(2)仔细阅读产品配套光盘附带文档《ADS集成开发环境及仿真器应用》或其他相关资料,了解ADS工程编辑和AXD调试的容。

(本实验使用软件仿真。

五、实验步骤

(1)启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程ProgramCl。

(2)建立源文件Startup.s、Add.s和Test.c,编写实验程序,然后添加到工程中。

(3)设置工程地址ROBase为0x40000000,RWBase为0x40003000。

设置调试入口地址Imageentrypoint为Ox40000000。

(4)设置工程选项,位于开始位置的起始代码段设置为Startup.o的Start段。

图4-1设置开始位置的起始代码段

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

(6)在Test.c文件中调用Add()的代码处设置断点,然后全速运行程序。

(7)程序在断点处停止。

使用SetpIn单步运行程序,观察程序是否转到汇编程序Add.s。

(8)选择ProcessorViews→Variables打开变量观察窗口.观察全局变量的值,然后单步/全速运行程序,判断程序的运算结果是否正确。

如图4-2所示。

图4-2ARM实验4的运行观察结果

六、思考题

在实验参考程序中,如何以指针形式传递参数?

(即设汁“uint32Add(uint32*x,uint32*y)”函数。

七、参考程序

startup.s文件程序见实验3

//Test.c

#defineuint8unsignedchar

#defineuint32unsignedint

externuint32Add(uint32x,uint32y);

uint32sum;

voidMain(void)

{

sum=Add(5,4);

while

(1);

}

;Add.s

EXPORTAdd

AREAAddc,CODE,READONLY

ENTRY

CODE32

Add

ADDR0,R0,R1

MOVPC,LR

END

源代码组织见图

源代码组织图

 

实验五ARM处理器工作模式实验

一、实验目的

1.掌握如何使用MRS/MSR指令实现ARM处理器工作模式的切换;

2.了解在各个工作模式下的寄存器。

二、实验环境

PC机一台

软件:

ADS1.2集成开发环境

三、实验容

1.使用MRS/MSR指令切换工作模式,并初始化各种模式下堆栈指针;

2.观察ARM处理器在各种模式下寄存器的区别。

四、实验步骤

(1)启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程MODE。

(2)建立汇编源文件TEST5.S,编写实验程序,然后添加到工程中。

(3)设置工程地址ROBase为0x40000000,RWBase为0x40003000。

设置调试入口地址Imageentrypoint为0x40000000。

(4)编译工程,选择【Project】->【Debug】,启动AXD进行软件仿真调试。

(5)打开寄存器窗口(ProcessorRegisters),选择Current项监视各寄存器的值。

(6)单步运行程序,注意观察CPSR、SPSR、R13(SP)、R14(LR)、R15(PC)寄存器。

五、思考题

1.在用户模式或系统模式下读取SPSR寄存器会有何结果?

2.在非特权模式下能否对CPSR寄存器设置?

能否读取CPSR寄存器的值?

3.在非特权模式下如何使能/禁止IRQ或FIO中断?

(提示:

可以先使用SWI指令切换到管理模式)

4.程序中能不能通过MSR指令直接修改CPSR中的T位来实现ARM状态/Thumb状态的切换?

六、参考程序

;定义堆栈的大小

USR_STACK_LEGTHEQU64

SVC_STACK_LEGTHEQU0

FIQ_STACK_LEGTHEQU16

IRQ_STACK_LEGTHEQU64

ABT_STACK_LEGTHEQU0

UND_STACK_LEGTHEQU0

AREAExample5,CODE,READONLY;声明代码段Example5

ENTRY;标识程序入口

CODE32;声明32位ARM指令

STARTMOVR0,#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;初始化各模式下的堆栈指针

;打开IRQ中断(将CPSR寄存器的I位清零)

MRSR0,CPSR;R0<=CPSR

BICR0,R0,#0x80

MSRCPSR_cxsf,R0;CPSR<=R0

;切换到用户模式

MSRCPSR_c,#0xd0

MRSR0,CPSR

;切换到管理模式

MSRCPSR_c,#0xdf

MRSR0,CPSR

HALTBHALT

;名称:

InitStack

;功能:

堆栈初始化,即初始化各模式下的堆栈指针。

;入口参数:

;出口参数:

;说明:

在特权模式下调用此子程序,比如复位后的管理模式

InitStack

MOVR0,LR;R0<=LR,因为各种模式下R0是相同的

;设置管理模式堆栈

MSRCPSR_c,#0xd3

LDRSP,StackSvc

;设置中断模式堆栈

MSRCPSR_c,#0xd2

LDRSP,StackIrq

;设置快速中断模式堆栈

MSRCPSR_c,#0xd1

LDRSP,StackFiq

;设置中止模式堆栈

MSRCPSR_c,#0xd7

LDRSP,StackAbt

;设置未定义模式堆栈

MSRCPSR_c,#0xdb

LDRSP,StackUnd

;设置系统模式堆栈

MSRCPSR_c,#0xdf

LDRSP,StackUsr

MOVPC,R0

StackUsrDCDUsrStackSpace+(USR_STACK_LEGTH-1)*4

StackSvcDCDSvcStackSpace+(SVC_STACK_LEGTH-1)*4

StackIrqDCDIrqStackSpace+(IRQ_STACK_LE

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

当前位置:首页 > 自然科学 > 化学

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

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