- 目录
1,ARM基本概念
首先要说明的是ARM不是单片机,它是一个只能做单片机内核的中央处理器;它的功能实现都离不开外围设备。ARM采用哈佛结构:数据和地址分开存储,有并发性。
它的主要特点是低功耗,高效能。
广泛应用于移动设备,嵌入式系统的精简指令集RISC架构,能进行独立编址,两倍带宽,执行效率更高。
- 流水线
ARM一般采用三级流水线,3级流水线是ARM7TDM1的主要特征之一;在一些高级的指令系统中采用五级流水线(例如ARM9)ARM10采用6级,更高级的有13级流水线;流水线越多说明单位时间内执行指令的条数就越多,计算机在执行程序时,要分为3个步骤:
- RISC/CISC
RISC:精简指令集,是在复杂指令集中选取一些相对比较简单,使用频率较高的指令作为精简指令集。精简指令集的指令周期和指令宽度是固定的。
指令周期:执行一条指令所需要的时间,RISC大多属于单周期的指令。
指令宽度:指令被编译生成机器码所占用的内存空间是固定的。
CISC:复杂指令集,复杂指令集更加注重指令的功能性,指令周期和指令宽度不固定。
复杂指令集主要应用在电脑CPU上。
2, ARM处理器基础
2.1 ARM处理器的存储器结构
关于指令:ARM的指令系统分为32位的ARM指令集和16位的Thumb指令集(ARM指令集的子集)。所以在存储时也要分为2种不同长度的存储。
关于数据:ARM可以对32bit的数据字进行操作,16bit的数据半字进行操作,8bit的字节进行操作,所以存储器可以分别存储32bit,16bie,8bit,这3种不同长度的数据。
那么怎么对不同长度的数据进行存储呢?
对于不同长度的数据ARM规定有两种存储格式:分别是大端格式和小端格式。
小端格式:在小端存储结构中,对于地址为A的字单元,其中字节单元由低位到高位。
大端格式:在大端存储结构中,对于地址为A的字单元,其中字节单元由高位到低位。
注意:大端格式和小端格式都要地址对准!
2.2 ARM处理器的指令存储或数据存储、
- 程序存储器/数据存储器
存储器有数据存储器和程序存储器两种。
- 程序存储器:用来存储指令代码
- 数据存储器:用来存放数据
- 地址对准
在ARM中通常把正确的地址入口称为地址对准,把不正确的地址入口称为非地址对准。
32位的地址对准称为字对准;16位的地址对准称为半字对准。
对数据存储区操作时,要注意地址对准,不然会出现无法预测的结果
在对32位数据操作时,地址数据末两位(1:0)要符合为0的基本原则
在对16位的半字进行操作时,地址数据末尾(0)应该为0
2.3 处理器模式
ARM处理器结构支持7种处理器模式:
- 1 用户模式(usr):ARM处理器正常的程序执行状态;
- 速中断模式(fiq):用于高速数据传输或通道管理;
- 外部中断模式(irq):用于通用/正常的中断处理;
- 管理模式(svc):操作系统使用的保护模式;
- 数据访问终止模式(abt):当数据或指令预取终止时进入该模式,用于虚拟存储及存储保护;
- 系统模式(sys):运行具有特权的操作系统任务;
- 未定义指令中止模式(und):当未定义指令执行时进入该模式,可用于支持硬件协处理器的软件仿真
用户模式是最基本的处理器模式,大多数用户程序都是在用户模式下进行;除用户模式外其余的模式均称为特权模式。
需要注意的是:子啊用户模式下,应用程序不能实现模式的转换,不能访问被保护的某些资源,不能访问某些程序存储区,不能修改某些存储区等。
特权模式可以获得比用户模式更高的权限,在特权模式下可以访问更多的系统资源。
在特权模式中,除了系统模式外(系统模式不属于异常模式,不能通过异常中断进入),其他的5种又称为异常模式,它们可以通过异常中断切换到相应的处理模式中。
2.4 ARM内部寄存器
ARM处理器有两种工作状态:
- 工作在32位ARM指令时称为ARM工作状态
- 工作在16位Thumb指令集时称为Thumb工作状态
2.4.1 ARM状态时的寄存器
ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个位状态寄存器。但是这些寄存器不能被同时访问,具体哪些寄存器是可以访问的,取决ARM处理器的工作状态及具体的运行模式。
通用寄存器包括R0~R15,可以分为3类:
- 未分组寄存器R0~R7
- 分组寄存器R8~R14
- 程序计数器PC(R15)
1.未分组寄存器R0~R7
所有模式都可以使用R0~R7,这一组寄存器才是真正意义上的通用寄存器,在任何模式下都可以使用。 在有用户模式进入异常中断时要小心,在终端服务程序中,使用这些寄存器时最好先加以保护,在退出中断服务程序时再重新恢复以避免数据的不慎丢失。
2.分组寄存器R8~R12
对于R8~R12来说:当使用FIQ(快速中断模式)时,专门提供一组R8_fiq~R12_fiq寄存器供FIQ中断使用; 当使用除FIQ模式以外的其他模式时,访问寄存器R8_usr~R12_usr.
- 关于寄存器R13,R14
每个寄存器对应6个不同的物理寄存器,其中一个是用户模式与系统模式共用,另外5个物理寄存器对应其他5种不同的运行模式,并采用以下记号来区分不同的物理寄存器:
R13_mode
R14_mode
其中mode可为:usr,fiq,irq,svc,abt,und.
寄存器R13在ARM指令中常用作堆栈指针SP,但这只是一种习惯用法,用户也可使用其他的寄存器作为堆栈指针,而在Thumb指令集中,某些指令强制性的要求使用R13作为堆栈指针。
R14称为子程序链接寄存器LR(Link Register),当执行子程序调用指令(BL)时,R14可得到R15(程序计数器PC)的备份.在每一种运行模式下,都可用R14保存子程序的返回地址,当用BL或BLX指令调用子程序时,将PC的当前值(即子程序的返回地址)复制给R14,执行完子程序后,又将R14的值复制回PC,即可完成子程序的调用返回。
3,程序计数器PC(R15)
由于ARM体系结构采用了多级流水线技术,对于ARM指令集而言,PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8个字节程序状态寄存器。
寄存器R15用作程序计数器(PC)。
在ARM状态下,位[1:0]为0,位[31:2]用于保存PC。
在Thumb状态下,位[0]为0,位[31:1]用于保存PC。
- R15是随时变化的:
PC总是指向当前指令的下两条指令的地址,程序每执行一个指令,R15的值都会相应的发生变化。在顺序执行程序时
- 如果执行的是ARM指令,则R15会顺序递增,递增值为4
- 如果执行的是Thumb指令,则R15会递增2
- 当发生异常中断时,R15中的值是中断向量
- 当发生程序跳转时,R15中的值是目标地址
- R15中的地址值不是指向正在执行的指令
ARM处理器是多级流水线结构,ARM处理器在执行第1条指令的时候;第2条指令正在译码;第3条指令正在寻址,所以ARM总是指向第3条指令。
假设执行的是ARM指令:
R15的值=当前执行的指令地址+8
假设执行的是Thumb指令:
R15的值=当前执行的指令+4
4,寄存器R16/程序状态寄存器
寄存器R16用作CPSR(CurrentProgram Status Register,当前程序状态寄存器),
CPSR可在任何运行模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位,以及其他一些相关的控制和状态位。
每一种运行模式下又都有一个专用的物理状态寄存器,称为SPSR(Saved Program Status Register,备份的程序状态寄存器)
当异常发生时,SPSR用于保存CPSR的当前值,从异常退出时则可由SPSR来恢复CPSR。
由于用户模式和系统模式不属于异常模式,它们没有SPSR,当在这两种模式下访问SPSR,结果是未知的。
3,Thumb状态下的寄存器
Thumb状态下的寄存器的定义机器使用和ARM状态都是相同的:
- 通用寄存器R0~R7只有一组,在物理上是唯一的,在各种模式下都能使用;
- SP对栈指针寄存器共有6个,系统模式和用户模式共用一个,其他异常模式各有1个;
- LR链接寄存器也共有6个,系统模式和用户模式共用1个,其他异常模式各有一个;
- PC程序计数器只有1个,在所有模式下共用;
- CPSR程序状态寄存器只有1个,各模式共用;
- SPSR寄存器是一个用于保护状态寄存器的备用寄存器,在5种异常模式下各有1个,在异常中断时保护状态寄存器;