嵌入式开发实验手册

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

嵌入式系统原理与应用实验
栗华编着
山东大学信息科学与工程学院
二零一四年三月
目录
第一章实验硬件平台
1.1北京博创UP-TECH三合一实验箱简介
本实验指导书所依赖的硬件平台为北京博创兴盛科技有限公司生产的一种ARM9/Xscale经典三核心教学科研平台(型号:UP-TECHS2410/S2440/P270),本平台兼容PXA270核心CPU及S3C2410、S2440核心CPU的全部功能,是北京博创多年来嵌入式教学产品开发经验的结晶。

这里选配的是S3C2440核心板。

图1-1UP-CUP三合一实验箱外观
应用案例:
※支持Linux、WinCE、Vxworks、μC/OS-Ⅱ4套操作系统;
※核心板可更换,同时拥有ARM9(S3C2410和S3C2440)和XScale(PXA270);
※中国电子学会嵌入式工程师认证考试和师资培训指定平台;
硬件资源:
软件资源
结构说明
图1-2UP-TECH三合一实验箱实物结构
图1-2UP-TECH三合一实验箱框图结构
图1-3UP-TECH三合一实验箱框图结构版图1.2跳线设置参考
说明:
◆PCB上所有“EXPORT”丝印字符表示168Pin扩展槽
◆JP1401RESET-SEL:设置复位电路,位置JTAG20插座下方。

1-2:ICE的ICE-TRST复位信号可以控制系统复位信号RESET。

2-3:ICE的ICE-TRST复位信号不可以控制系统复位信号RESET。

◆JP1402JTAGSEL:选择JTAG电路,位置JTAG20插座下方。

1-2:使能板载的UP-LINKJTAG电路。

2-3:使用外部的JTAG电缆或者ARMICE仿真器。

◆JP1103TXD1-SEL
◆JP1104RXD1-SEL:UART1选择扩展槽或者RS232的DB9插座。

1-2:UART1连接RS232-1,从DB9串口插座输出。

2-3:UART1连接到扩展槽。

◆JP1101TXD2-SEL
◆JP1102RXD2-SEL:UART2选择跳线,分别为RS485、IrDA、扩展槽
1-2:UART2连接到RS485总线上。

2-3:UART2连接到扩展槽上。

3-4:UART2连接到扩展槽上。

4-5:UART2连接到IrDA红外线电路上。

1.3资源占用情况
表1-1UP-TECHS2410/S2440实验箱资源占用
第二章嵌入式系统开发环境简介
(ADS1.2安装及使用)
2.1ADS介绍
ADS全称为ARMDeveloperSuite,是ARM公司的,其功能非常强大。

它的前身是SDT,SDT是ARM公司几年前的开发环境,目前SDT早已经不再升级。

国内大部分开发者使用的ADS的版本是1.2。

ARMADS由六个部分组成,分别是:代码生成工具、集成开发环境、调试器、指令集模拟器、ARM开发包和ARM应用包。

1)代码生成工具
代码生成工具由源程序编辑、汇编及链接工具集组成、ARM公司针对ARM系列的每一种结构都进行了专门的优化处理,其代码生成工具最终生成的可执行文件最小,可以比用其他公司工具套件生成的文件小20%。

2)集成开发环境
CodeWarriorforARM是一套完整的集成开发工具,充分发挥了ARMRISC的优势,使产品开发人员能够很好的应用尖端的片上系统技术.该工具是专为基于ARMRISC的处理器而设计的,它可加速并简化嵌入式开发过程中的每一个环节,使得开发人员只需通过一个集成软件开发环境就能研制出ARM产品,在整个开发周期中,开发人员无需离开CodeWarrior开发环境,因此节省了在操做工具上花的时间,使得开发人员有更多的精力投入到代码编写上来。

3)调试器
ADS中包括3个调试器,分别是ARM扩展调试器AXD、向下兼容的ADW/ADU和ARM 符号调试器armsd。

AXD是目前最常用的调试器,armsd作为命令行调试工具用于辅助调试,可以用于其他操作系统平台上。

4)指令集模拟器
ARM中的指令集模拟器可以实现在PC机上对基于内核处理器的ARM和Thumb提供精确的模拟,从而可以在没有硬件支持的情况下实现部分调试工作。

5)ARM开发包
ARM开发包由一些底层的例程和库组成,可以帮助用户快速开发基于ARM的应用程序和操作系统。

6)ARM应用库
ADS的ARM应用库完善并且增强了SDT(ADS的前身)中的函数库,同时还包括一些非常有用的源码例程。

用户使用ARMADS开发应用程序与使用ARMSDT完全相同,可以选择使用Angel驻留模块或者JTAG仿真器。

目前大部分JTAG仿真器都支持ARMADS。

2.2安装ADS1.2软件:
1.打开桌面上ADS1.2的文件夹,双击SETUP.EXE。

安装界面如下图2-1,选择“Next”继续。

图2-1ADS1.2安装界面1
2.选择“YES”,同意安装许可,如下图2-2。

图2-2ADS1.2安装界面2
3.选择安装路径,安装到适当的地方,保证空间足够(200M左右),此处默认为C:\ProgramFiles\ARM,选择“Next”继续,如下图2-3。

图2-3ADS1.2安装界面3
4.选择完全安装Full的方式,点击“Next”继续,如下图2-4。

图2-4ADS1.2安装界面4
5.连续点击“Next”继续,如下图2-5,图2-6,图2-7。

图2-5ADS1.2安装界面5
图2-6ADS1.2安装界面6
图2-7ADS1.2安装界面7
6.开始安装,界面如下图2-8。

图2-8ADS1.2安装界面8
7.选择“下一步”,如下图2-9。

图2-9ADS1.2安装界面9
8.选择“InstallLicense”项,如下图2-10,点击“下一步”,如图2-11。

图2-10ADS1.2安装界面10
图2-11ADS1.2安装界面11
9.此步骤是安装License,需要用到安装包里的CRACK文件夹,将此文件夹复制到软件安装目录的ADSv1_2下,此处为C:\ProgramFiles\ARM\ADSv1_2。

拷贝完后点击图2-11中的“Browse”按钮,出现如图2-12所示界面,在查找范围处浏览到安装目录下C:\ProgramFiles\ARM\ADSv1_2\CRACK文件夹并双击“LICENSE.DAT”即可,此时出现如图2-13所示界面。

图2-12ADS1.2安装界面12
图2-13ADS1.2安装界面13
10.依次点击“下一步”,“完成”,“Finish”,完成整个安装过程。

2.3使用ADS1.2软件:
1.打开CodeWarriorforARMDeveloperSuite
现在可以通过“开始”—“程序”—“ARMDeveloperSuitev1.2”—“CodeWarriorforARMDeveloperSuite”来打开开发软件了,如图2-14所示。

图2-14ADS1.2使用界面1
启动MetrowerksCodeWarriorforARMDeveloperSuitev1.2后界面如图2-15所示。

图2-15ADS1.2使用界面2
2.新建工程
在CodeWarrior中新建一个工程的方法有两种,可以在工具栏中单击(New…)按钮,如图2-16所示。

也可以在“File”菜单中选择“New…”菜单,如图2-17所
示。

图2-16ADS1.2使用界面3
图2-17ADS1.2使用界面4
这样打开一个如图2-18所示的窗口。

该窗口有Project、File和Object三个选项卡,现在我们新建工程,故选Project选项卡。

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

此7种工程类型已经在图中标出,大家熟悉一下。

这里我们选择第一种ARMExecutableImage工程类型,在“Projectname:”下输入工程名,如test,点击“Location:”文本框的“Set..”按钮,浏览选择想要将该工程保存的路径。

如存放在C:\armtest文件夹中,按照图2-18,图2-19的步骤完成。

图2-18ADS1.2使用界面5
图2-19ADS1.2使用界面6
此时点击“确定”按钮即可建立一个新的名为test的工程,这个时候会出现test.mcp的窗口,如图2-20所示。

图2-20ADS1.2使用界面7
此时点击“最大化”按钮可以将test.mcp窗口扩大,如图2-21所示。

这个时候会出现一个text.cmp的窗口,如图所示,有三个标签,默认第一个标签Files。

图2-21ADS1.2使用界面8
实验中由于所有的源文件都还没有建立,所以首先需要新建源文件。

在“File”
菜单张选择“New”,选择标签页File,在Filename中输入要创建的文件名,输入“Init.s”,并将新建文件Init.s加入工程(勾选“AddtoProject”),Targets 多选框中的“Debug”选项。

如图2-22所示:
图2-22ADS1.2使用界面9
新建工程的默认目标是DebugRel,另外还有两个可选择的目标,分别是Debug 和Release,他们的含义如下:
⏹DebugRel:生成目标时,为每一个源文件生成调试信息;
⏹Release:生成目标时,不生成调试信息;
⏹Debug:生成目标时,为每一个源文件生成最完全的调试信息。

点击确定关闭窗口,在打开的文件编辑框中输入如图2-23所示的汇编代码。

IMPORTMain
AREAInit,CODE,READONLY
ENTRY
LDR
BLMain
B.
END
图2-23ADS1.2使用界面10
在这段代码中,伪操作IMPORT告诉编译器符号Main不是在该文件中定义的,而是在其他源文件中定义的符号,但是本源文件中可能要用到该符号。

接下来用伪指令AREA定义名为Init属性为只读的代码段,伪指令ENTRY指出了程序的入口点。

然后程序完成R0的赋值,再跳转到Main函数执行。

保存Init.s汇编程序。

用同样的方法,再建立一个名为Main.c的C源代码文件,
图2-24ADS1.2使用界面11
具体代码内容如下所示:
#defineDATA(*(volatileunsigned*)0x03ff5008)
voidDelay(unsignedint);
intMain()
{
unsignedlongx;
DATA=0X01;
for(;;)
{
x=DATA;
x=(x<<1);
DATA=x;
Delay(10);
if(!(x&0X0F))
DATA=0X01;
}
return(0);
}
voidDelay(unsignedintx)
{
unsignedinti;
for(i=0;i<=x;i++);
}
如果建立新文件时没有选择将所建立文件加入工程,我们也可以通过“Project-AddFiles”菜单将源文件加入到工程中。

如下图2-25所示。

图2-25ADS1.2使用界面12
加入文件之后的工程如下图2-26所示:
图2-26ADS1.2使用界面13
3.配置、编译和链接工程
在进行编译和链接前,首先进行生成目标的配置。

选择“Edit--DebugRelSettings”菜单命令或直接单击工具栏上的DebugRelSettings图标,弹出DebugRelSettings窗口,可以对生成的目标文件进行配置。

这个对话框中的设置很多,在这里只介绍一些我们工程中会用到的选项,若要了解其他没有涉及到的选项,请查阅看相应的帮助文件。

在DebugSetting对话框中需要设置的内容比较多。

设置方法是首先在左侧的树形目录中选中需要设置的对象,然后在右侧面板中进行相应的设置。

下面对经常使用的设置选项进行介绍。

(1)目标设置(TargetSetting)
在树形目录中选中Target—TargetSetting项,在右侧面版的Post-linker下拉表框中选择ARMfromELF,使得工程连接后通过fromELF产生二进制代码,使其可以烧写到ROM中。

方法如图2-27所示。

图2-27ADS1.2使用界面14
(2)语言设置(LanguageSettings)
开发语言有汇编、C、C++及其混合语言等。

我们在开发前要对其设置,这里主要是对其硬件(架构或处理器)的支持设置,如我们实验是在采用S3C2440处理器的试验箱中开发的,所以在右侧面板ArchitectureorProcesser(架构或处理器)下拉列表框中选择ARM920T。

具体设置方法是先选中树形目录中LanguageSettings下的开发语言,然后在本语
言对应的右侧面板的ArchitectureorProcesser下拉列表框中选择ARM920T,其他选项保持默认。

注意,在开发中用到的语言都要进行这样设置。

汇编语言的设置过程如图2-28所示,其他语言设置方法与此一样。

图2-28ADS1.2使用界面15
(3)链接器设置(Linker)
在TargetSettingPanels列表框中选择Linker选项,再选择其下的ARMLinker,即可得到连接器的设置选项对话框。

如下图2-29所示,该对话框中的选项较多,而且对最终生成的目标文件有直接影响,因此对将用到的选项做详细介绍。

图2-29ADS1.2使用界面16
Output选项卡:Linktype中提供了三种链接方式:Partial、Simple、Scattered,在这三种方式中,
⏹Partial:表示链接器只进行部分链接,链接后的目标文件可以作为
以后进一步链接的输入文件;
⏹Simple:表示链接器将生成简单的ELF格式的映像文件,地址映射关
系在Simpleimage选项区域中设置;
⏹Scattered:表示链接器将生成复杂的ELF格式的映像文件,地址映射
关系在Scatter格式的文件中指定。

Simple是默认也是使用最频繁的链接方式,它链接生成简单的ELF格式的目标文件,使用的是链接器选项中指定的地址映射方式。

这里我们选择常用的Simple类型,选择Simple后,在其右侧Simpleimage选项区域中包含ROBase和RWBase两个文本框。

⏹ROBase:用来设置程序代码存放的起始地址。

⏹RWBase:用来设置程序数据存放的起始地址。

这两项的地址均由硬件决定,并应该在SDRAM的地址范围内,RWBase文本框用户自定义,只要保证在SDRAM地址空间内,并且是字对齐即可。

此处的设置就是在地址为0x8000开始用来存放程序数据。

4)ARMformELF选项
在TargetSettingPanels列表框中选择Linker选项,再选择其下的ARMfromELF,即可得到连接器的设置选项对话框。

如下图2-30所示
在该对话框中,我们可以指定通过ARMformELF工具将.AXF文件转化为那种格式的文件,以及转化后得到的文件名称及保存路径。

在outputformat下拉列表框中,我们使用默认值Plainbinary,表示生成二进制格式可执行文件;在Outputfilename文本框中,我们可以重新指定生成二进制文件的名称及保存的路径,如果不填写,表示默认生成在工程路径下的..\*_Data\DebugRel中。

图2-30ADS1.2使用界面17
到这里,点击OK完成整个工程设置。

接下来点击Project菜单下的make选项(也可按F7快捷键)即可完成对工程的编译和链接。

编译结果如下图2-31所示:
图2-31ADS1.2使用界面18
在工程test所在的目录下,会生成一个名为test_Data目录,在这个目录下不同类别的目标对应不同的目录。

在本例中由于我们使用的是DebugRel目标,所以生成的最终文件都应该在该目录下。

进入到DebugRel目录中去,读者会看到make 后生成的映像文件和二进制文件,映像文件用于调试。

4.用AXD进行代码调试
1)simulator软件仿真环境设置
运行ADS1.2目录中的AXDDebugger程序来调试ARM可执行程序,如下图所示:
图2-32AXD使用界面2
将出现如下界面:
图2-32AXD使用界面3
如果在simulator模式下运行程序,应该对运行环境进行简单设置。

首先运行Options-ConfigureTarget菜单,如下图2-33所示:
图2-33AXD使用界面4
此时将会出现如图2-34所示的窗口:
图2-34AXD使用界面5
选择其中的ARMUL选项,并点击OK按钮。

这时,就选定了Simulator模式。

2)在axd中打开调试文件
在菜单File中选择”Loadimage…”选项,打开Loadimage对话框,如图2-32所示,找到装载的test.axf映像文件,点击”打开”按钮,就把映像文件装载到目标内存中了。

图2-35AXD使用界面6
在如下图2-36所示界面中,选定在ADSCodeWarrior环境生成的可执行程序test.axf,并点击打开按钮
图2-36AXD使用界面7
打开image文件之后,将会出现如下图2-37所示界面:
图2-37AXD使用界面8
下面对CPU内核进行选定,点击图2-34中的“Configure”按钮,将会出现如下图2-38所示界面:
图2-39AXD使用界面9
将其中的Processor栏,Variant下拉选框选定为ARM920T,并点击下面的“OK”按钮。

点击图2-34中的“OK”按钮。

此时,如果出现图2-40所示界面,点击“是”即可:
图2-40AXD使用界面10
至此,我们可以运行程序并进行调试了,在运行调试之前,我们先介绍一下AXD界面的一些常用的工具和窗口。

点击“ProcessorViews”菜单下的各选项,并
对出现的小窗口进行排列,如下图2-41和2-42所示:
图2-41AXD 使用界面11
图2-42AXD 使用界面12 上方的工具条也有相应分工,分别为:
(1).文件操作工具条
,其中 加载调试文件
重新加载文件
(2).调试观察窗口工具条
,其中
打开寄存器窗口
打开观察窗口
打开变量观察窗口
打开存储器观察窗口
Contr 源文反汇寄存器变量存储器
输出窗
打开反汇编窗口
(3).运行调试工具条其中
全速运行(GO),直到结束或断点停止
停止运行(Stop)
单步运行,遇到函数调用则转入函数内部
单步运行,遇到函数调用不进入函数内部
单步运行,从被调用函数中返回
运行到光标停止
设置或取消断点
各窗口的功能为:
(1).源文件编辑窗口
该窗口用于输入和编辑源文件,并在调试过程中指示当前执行的程序命令。

通过ProcessorViews-Source菜单命令可以源文件窗口指定显示某个源文件。

(2).反汇编窗口
用于显示源文件和汇编后的二进制代码之间的对应关系,可在调试过程中精确分析程序的执行过程,也可用于程序代码深度分析与优化。

通过ProcessorViews-Disassembly菜单命令打开该窗口。

(3).系统信息输出窗口
显示程序运行过程中输出的提示信息或错误信息。

可以通过SystemViews-Output 菜单命令设置为显示或隐藏。

(4).寄存器窗口
用于查看和修改CPU中各寄存器的值。

在不同模式下,不同窗口对应不同的寄存器。

通过双击寄存器的值可以对其进行修改。

可以通过SystemViews-Registers菜单命令设置为显示或隐藏。

(5).变量观察窗口
用于查看程序运行过程中各全局或局部变量值的变化。

可以通过SystemViews-Watch菜单命令设置为显示或隐藏。

(6).存储器窗口
用于查询存储器相应地址单元中的数据。

用户可以输入地址,查看该地址单元的数据,如果输入地址是无效的,则显示错误的数据。

可以通过ProcessorViews-Memory 菜单命令设置为显示或隐藏。

在所打开的映像文件中会有一个蓝色的箭头指示当前执行的位置,对于本例,打开映像文件后,如图2-34所示:
图2-34AXD使用界面3
在菜单Execute中选择”Go”,将全速运行代码。

要想进行单步的代码调试,则在Execute菜单中选择”Step”选项,或者用F10即可以单步执行代码,窗口中蓝色箭头会发生相应的移动。

有时候,用户可能希望程序在执行到某处时,查看一些所关心的变量值,此时可以通过断点设置达到此要求。

将光标移动到要进行断点设置的代码处,在菜单Execute中,选择”ToggleBreakpoint”或者按F9,就会在光标所在位置出现一个实心圆点,表明该处为断点。

还可以在AXD中查看寄存器值,变量值,某个内存单元的数值等等。

2)查看寄存器内容
在菜单ProcessorsViews中选择”Registers”,如下图2-35和图2-36所示,就会打开寄存器查看窗口
图2-35AXD使用界面4
寄存
图2-36AXD使用界面5
点击寄存器窗口中Current前面的“+”,将看到当前寄存器的状态,如下图2-37
所示:
图2-37AXD使用界面6
可以看到r0的内容为正是指令“LDR”执行的正确结果。

2)查看存储器内容
在菜单ProcessorsViews中选择”Memory”,如下图2-38所示,就会打开存储器查看窗口。

寄存
图2-38AXD使用界面7
在MemorySartaddress选择框中,用户可以根据要查看的存储器的地址输入起始地址,在下面的表格中会列该地址之后的1K字节存储器内容,如下图2-39所示。

图2-39AXD使用界面8
3)查看变量值
在菜单ProcessorsViews中选择”Watch”或“Variables”,如下图2-40所示,就会打开观察窗口和变量查看窗口。

观察窗
变量查看窗
图2-40AXD使用界面9
查看某一变量的方法是,在程序中双击该改变量(如下图中的变量x),然后右键点击,弹出如下图2-41所示窗口:
图2-41AXD使用界面10
点击弹出菜单中的“Addtowatch”项,将会看到所选变量被加入观察窗口,如下图2-42所示:
观察窗
变量查看窗
图2-42AXD使用界面11
如若删除Watch窗口中的变量,只需选中该变量,然后按“Delete”按键即可。

对于变量,还可以直接从变量窗口观察的到,如点击变量窗口中的“Local”页,将会看到当前程序中的所有局部变量,如下图2-43所示,
观察窗
变量查看窗
图2-43AXD使用界面12
第三章软件仿真实验
3.1实验一ARM汇编指令实验1—简单数据搬移实验
实验目的
熟悉实验开发环境,掌握简单ARM汇编指令的使用方法
实验环境
硬件:PC机。

软件:ADS1.2集成开发环境
实验内容
熟悉开发环境并使用LDR/STR,MOV等指令访问寄存器或存储单元;
使用ADD/SUB/LSL/LSR/AND/ORR等指令,完成基本数学/逻辑运算。

实验要求
(1)按照2.3节介绍的方法,在ADS下创建一个工程asmlab1,定义两个变量x,y 和堆栈地址0x1000,将变量x的内容存到堆栈顶,然后计算x+y,并将和存到堆栈的下一个单元。

通过AXD查看寄存器和memory和寄存器中数据变化。

(2)在指令后面加上适当注释,说明指令功能。

(3)指出程序执行完成后各相关寄存器及存储器单元的具体内容。

参考程序:
AREAInit,CODE,READONLY
ENTRY
CODE32
xEQU45
yEQU64
stack_topEQU0x1000;definethetopaddressforstacks startMOVSP,#stack_top
MOVR0,#x
STRR0,[SP]
MOVR0,#y
LDRR1,[SP]
ADDR0,R0,R1
STRR0,[SP,#4]
B.
END
相关知识
(1)相关指令及伪指令
AREA用于声明一个只读或读写的代码或数据段,ENTRY声明程序入口,CODE32用于申明以下代码为32位ARM指令,END程序结束。

LDR加载指令,STR存储指令.
STRR0,[SP,#4];先执行SP+4,再将寄存器R0内容复制到SP指向的存储器
(2)存储器的大小端存储格式:
1)大端格式
在这种格式中,字数据的高位字节存储在低地址中,而字数据的低位字节则存放在高地址中,如下图所示。

2)小端格式
在这种格式中,字数据的高位字节存储在高地址中,而字数据的低位字节则存放在低地址中,如下图所示。

练习题
编写程序实现对一段数据的最大值最小值搜索,最大值存于max变量之中,最小值存于min变量之中。

提示:数据的定义采用伪指令:DCD来实现,如:
DataBufDCD11,-2,35,47,96,63,128,-23
搜索最大值和最小值可以利用两个寄存器R1,R2来存放。

用到的比较指令为CMP,用到的条件标识符小于为LT,大于为GT。

基本思路为:利用R0做基地址,将R1,R2分别存入第一个单元的内容,利用R3做循环计数器,利用R4遍历读取第2至最后一个数据,如果R1的数据小于新读入的R4数据则将R4的内容存入R1,如果R2的内容大于R4的内容则将R4的内容存入R2。

遍历完成之后,R1将存放最大数据,R2将存放最小数据。

3.2实验二ARM汇编指令实验2—字符串拷贝实验
实验目的
通过实验掌握使用LDB/STB,b等指令完成较为复杂的存储区访问和程序分支,学习使用条件码。

实验环境
硬件:PC机。

软件:ADS1.2集成开发环境
实验内容
熟悉开发环境的使用并完成一块存储区的拷贝。

完成分支程序设计,要求判断参数,根据不同参数,调用不同的子程序。

实验要求
(1)按照2.3节介绍的方法,在ADS下创建一个工程asmlab2,定义两个数据存储区Src和Dst,Src用于存放原字符串,Dst用于存放目的字符串。

堆栈地址0x400,将变量原字符串的内容拷贝到目的字符串中,要能判断原字符串的结束符(0),并统计字符串中字符的个数。

通过AXD查看寄存器和memory和寄存器中数据变化。

(2)在指令后面加上适当注释,说明指令功能。

(3)指出程序执行完成后各相关寄存器及存储器单元的具体内容。

参考程序:
AREAInit,CODE,READONLY
ENTRY
CODE32
START
MOVSP,#0x400
LDRR0,=Src
LDRR1,=Dst
MOVR3,#0
strcopy
LDRBR2,[R0],#1
CMPR2,#0
BEQendcopy
STRBR2,[R1],#1
ADDR3,R3,#1
Bstrcopy
endcopy
LDRR0,=ByteNum
STRR3,[R0]
B.
AREADatapool,DATA,READWRITE
SrcDCB "string"
DstDCB0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
ByteNumDCD0
END
相关知识
(1)相关指令及伪指令
LDR:LDR伪指令将一个32位的常数或者一个地址值读取到寄存器中。

当需要读取到寄存器中的数据超过了MOV指令可以操作的范围时,可以使用LDR伪指令将该数据读取到寄存器中。

在汇编编译器处理源程序时,如果该常数没有超过MOV可以操作的范围,则LDR指令被一条MOV替代,否则,该常数将被放在最近的一个文字池内(literalpool),同时,本指令被一条基于PC的加载指令LDR替代。

语法格式:LDR<register>,=<expression>
其中,expression为需要读取的32位常数。

register为目标寄存器。

加载或者存储一个字节的数据时,使用的指令为:LDRB和STRB
练习题
编写程序循环对R4~R11进行累加8次赋值,R4~R11起始值为1~8,每次加操作后把R4~R11的内容放入SP栈中,SP初始设置为0x800。

最后把R4~R11清空赋值为0。

提示:多字的加载与存储使用多寄存器寻址,使用的指令为LDM和STM。

如:LDMIAR0!,{R4-R11}
STMIAR1!,{R4-R11}
3.3实验三ARM汇编指令实验3--ARM处理器工作模式实验
实验目的
(1)通过实验掌握学会使用msr/mrs指令实现ARM处理器工作模式的切换,观察不同模式下的寄存器,加深对CPU结构的理解;
(2)通过实验掌握ld中如何使用命令行指定代码段起始地址。

实验设备
硬件:PC机。

软件:ADS1.2集成开发环境
实验内容
通过ARM汇编指令,在各种处理器模式下切换并观察各种模式下寄存器的区别;掌握ARM不同模式的进入与退出。

实验原理
1.ARM处理器模式
ARM体系结构支持下表所列的7种处理器模式。

在软件控制下可以改变模式,外部中断或异常处理也可以引起模式发生改变。

大多数应用程序在用户模式下执行。

当处理器工作在用户模式时,正在执行的程序不能访问某些被保护的系统资源,也不能改变模式,除非异常(exception)发生。

这允许适当编写操作系统来控制系统资源的使用。

除用户模式外的其他模式称为特权模式。

它们可以自由的访问系统资源和改变模式。

其中的5种称为异常模式,即:
➢FIQ(FastInterruptrequest);
➢IRQ(InterruptReQuest);
➢管理(Supervisor);
➢中止(Abort);
➢未定义(Undefined)。

当特定的异常出现时,进入相应的模式。

每种模式都有某些附加的寄存器,以避免
异常出现时用户模式的状态不可靠。

剩下的模式是系统模式。

仅ARM体系结构V4以及以上的版本有该模式。

不能由于任何异常而进入该模式。

它与用户模式有完全相同的寄存器,然而它是特权模式,不受用户模式的限制。

它供需要访问系统资源的操作系统任务使用,但希望避免使用与异常模式有关的附加寄存器。

避免使用附加寄存器保证了当任何异常出现时,都不会使任务的状态不可靠。

2.程序状态寄存器
程序状态寄存器CPSR和SPSR包含了条件码标志,中断禁止位,当前处理器模式以及其他状态和控制信息。

每种异常模式都有一个程序状态保存寄存器SPSR。

当异常出现时,SPSR用于保留CPSR的状态。

CPSR和SPSR的格式如下:
1)条件码标志:
N,Z,C,V大多数指令可以检测这些条件码标志以决定程序指令如何执行
2)控制位:
最低8位I,F,T和M位用作控制位。

当异常出现时改变控制位。

当处理器在特权模式下也可以由软件改变。

➢中断禁止位:I置1则禁止IRQ中断;F置1则禁止FIQ中断。

➢T位:T=0指示ARM执行;T=1指示Thumb执行。

在这些体系结构的系统中,可自由的使用能在ARM和Thumb状态之间切换的指令。

➢模式位:M0,M1,M2,M3和M4(M[4:0])是模式位.这些位决定处理器的工作模式.
如下表所示。

ARM工作模式M[4:0]
3.状态寄存器与通用寄存器之间的传送指令
ARM指令中有两条指令MSR和MRS,用于在状态寄存器和通用寄存器之间传送数据。

修改状态寄存器一般是通过“读取-修改-写回”三个步骤的操作来实现的。

需要注意的是不能通过该指令直接修改CPSR中的T控制位直接将程序状态切换到Thumb 状态,必须通过BX等指令来完成程序状态的切换。

(1)状态寄存器到通用寄存器的传送指令(MRS)
MRS指令用于将状态寄存器的内容传到通用寄存器中,它主要用于以下三种场合:➢通过“读取-修改-写回”操作序列修改状态寄存器的内容。

MRS指令用于将状态寄存器的内容读到通用寄存器中;
➢当异常中断允许嵌套时,需要在进入异常中断之后,嵌套中断发生之前保存当前处理器模式对应的SPSR。

这时需要先通过MRS指令读出SPSR的值,再用其他指令将SPSR值保存起来;
➢当进程切换时也需要保存当前寄存器值。

(2)通用寄存器到状态寄存器的传送指令(MSR)
当需要保存或修改当前模式下CPSR或SPSR的内容时,这些内容首先必须传送到通用寄存器中,再对选择的位进行修改,然后将数据回写到状态寄存器。

这里讲述的MSR指令完成这一过程的最后一步,即将立即数常量或通用寄存器的内容加载CPSR 或SPSR的指定区域。

指令格式:
MSR{<cond>}CPSR_f|SPSR_f,#<32-bitimmediate>。

相关文档
最新文档