本章简介ARM微处理器编程模型的一些根本概念,包含作业状况切换、数据的存储格局、处理器反常等,经过对本章的阅览,期望读者能了解ARM微处理器的根本作业原理和一些与程序规划相关的根本技能细节,为今后的程序规划打下根底。
本章的主要内容:
- ARM微处理器的作业状况
- ARM体系结构的存储器格局
- ARM微处理器的作业形式
- ARM体系结构的寄存器安排
- ARM微处理器的反常状况
在开端本章之前,首要对字(Word)、半字(Half-Word)、字节(Byte)的概念作一个阐明:
字(Word):在ARM体系结构中,字的长度为32位,而在8位/16位处理器体系结构中,字的长度一般为16位,请读者在阅览时留意委任。
半字(Half-Word):在ARM体系结构中,半字的长度为16位,与8位/16位处理器体系结构中字的长度共同。
字节(Byte):在ARM体系结构和8位/16位处理器体系结构中,字节的长度均为8位。
2.1 ARM微处理器的作业状况
从编程的视点看,ARM微处理器的作业状况一般有两种,并可在两种状况之间切换:
- 第一种为ARM状况,此刻处理器碑文32位的字对齐的ARM指令;
- 第二种为Thumb状况,此刻处理器碑文16位的、半字对齐的Thumb指令。
当ARM微处理器碑文32位的ARM指令集时,作业在ARM状况;当ARM微处理器碑文16位的Thumb指令集时,作业在Thumb状况。在程序的碑文进程中,微处理器能够随时在两种作业状况之间切换,而且,处理器作业状况的改动并不影响处理器的作业形式和相应寄存器中的内容。
状况切换办法:
ARM指令集和Thumb指令集均有切换处理器状况的指令,并可在两种作业状况之间切换,但ARM微处理器在开端碑文代码时,应该处于ARM状况。
进入Thumb状况:当操作数寄存器的状况位(位0)为1时,能够选用碑文BX指令的办法,使微处理器从ARM状况切换到Thumb状况。此外,当处理器处于Thumb状况时产生反常(如IRQ、FIQ、Undef、Abort、SWI等),则反常处理回来时,主动切换到Thumb状况。
进入ARM状况:当操作数寄存器的状况位为0时,碑文BX指令时能够使微处理器从Thumb状况切换到ARM状况。此外,在处理器进行反常处理时,把PC指针放入反常形式链接寄存器中,并从反常向量地址开端碑文程序,也能够使处理器切换到ARM状况。[反常处理的时分]
2.2 ARM体系结构的存储器格局
ARM体系结构将存储器看作是从零地址开端的字节的线性组合。从零字节到三字节放置第一个存储的字数据,从第四个字节到第七个字节放置第二个存储的字数据,顺次摆放。作为32位的微处理器,ARM体系结构所支撑的最大寻址空间为4GB(232字节)。
ARM体系结构能够用两种办法存储字数据,称之为大端格局和小端格局,详细阐明如下:
大端格局:
在这种格局中,字数据的高字节存储在低地址中,而字数据的低字节则寄存在高地址中,如图2.1所示:
小端格局:
与大端存储格局相反,在小端存储格局中,低地址中寄存的是字数据的低字节,高地址寄存的是字数据的高字节。如图2.2所示:
2.3指令长度及数据类型
ARM微处理器的指令长度能够是32位(在ARM状况下),也能够为16位(在Thumb状况下)。
ARM微处理器中支撑字节(8位)、半字(16位)、字(32位)三种数据类型,其间,字需求4字节对齐(地址的低两位为0)、半字需求2字节对齐(地址的最低位为0)。
2.4处理器形式
ARM微处理器支撑7种运转形式,分别为:
─用户形式(usr): ARM处理器正常的程序碑文状况
─快速间断形式(fiq):用于高速数据传输或通道处理
─外部间断形式(irq):用于通用的间断处理
─办理形式(svc):操作体系运用的维护形式
─数据拜访间断形式(abt): 当数据或指令预取间断时进入该形式,可用于虚拟存储及存储维护。
─体系形式(sys):运转具有特权的操作体系使命。
─未界说指令间断形式(und):当未界说的指令碑文时进入该形式,可用于支撑硬件协处理器的软件仿真。
ARM微处理器的运转形式能够经过软件改动,也能够经过外部间断或反常处理改动。
大多数的应用程序运转在用户形式下,当处理器运转在用户形式下时,某些被维护的体系资源是不能被拜访的。
除用户形式以外,其他的一切6种形式称之为非用户形式,或特权形式(Privileged Modes);其间万古流芳用户形式和体系形式以外的5种又称为反常形式(Exception Modes),常用于处理间断或反常,以及需求拜访受维护的体系资源等状况。
2.5寄存器安排
ARM微处理器共有37个32位寄存器,其间31个为通用寄存器,6个为状况寄存器。可是这些寄存器不能被一起拜访,详细哪些寄存器是可编程拜访的,取决微处理器的作业状况及详细的运转形式。但在任何时分,通用寄存器R14~R0、程序计数器PC、一个或两个状况寄存器都是可拜访的。
通用寄存器:
通用寄存器包含R0~R15,能够分为三类:
─未分组寄存器R0~R7;
─ 分组寄存器R8~R14
─程序计数器PC(R15)
未分组寄存器R0~R7:
在一切的运转形式下,未分组寄存器都指向同一个物理寄存器,他们未被体系用作特别的用处,因而,在间断或反常处理进行运转形式转化时,我们不同的处理器运转形式均运用相同的物理寄存器,或许会形成寄存器中数据的损坏,这一点在进行程序规划时应引起留意。
分组寄存器R8~R14
关于分组寄存器,他们每一次所拜访的物理寄存器与处理器当时的运转形式有关。
关于R8~R12来说,每个寄存器对应两个不同的物理寄存器,当运用fiq形式时,拜访寄存器R8_fiq~R12_fiq;当运用除fiq形式以外的其他形式时,拜访寄存器R8_usr~R12_usr。
关于R13、R14来说,每个寄存器对应6个不同的物理寄存器,其间的一个是用户形式与体系形式共用,别的5个物理寄存器对应于其他5种不同的运转形式。
选用以下的记号来委任不同的物理寄存器:
R13_
R14_
其间,mode为以下几种形式之一:usr、fiq、irq、svc、abt、und。
寄存器R13在ARM指令中常用作仓库指针,但这仅仅一种习惯用法,用户也可运用其他的寄存器作为仓库指针。而在Thumb指令拘押,某些指令强制性的要求运用R13作为仓库指针。
我们处理器的每种运转形式均有自己独立的物理寄存器R13,在用户应用程序的初始化部分,一般都要初始化每种形式下的R13,使其指向该运转形式的栈空间,这样,当程序的运转进入反常形式时,能够将需求维护的寄存器放入R13所指向的仓库,而当程序从反常形式回来时,则从对应的仓库中康复,选用这种方法能够确保反常产生后程序的正常碑文。
R14也称作子程序衔接寄存器(Subroutine Link Register)或衔接寄存器LR。当碑文BL子程序调用指令时,R14中得到R15(程序计数器PC)的备份。其他状况下,R14用作通用寄存器。与之相似,当产生间断或反常时,对应的分组寄存器R14_svc、R14_irq、R14_fiq、R14_abt和R14_und用来保存R15的回来值。
寄存器R14常用在如下的状况:
在每一种运转形式下,都可用R14保存子程序的回来地址,当用BL或BLX指令调用子程序时,将PC的当时值劳动给R14,碑文完子程序后,又将R14的值劳动回PC,即可完结子程序的调用回来。以上的描绘可用指令完结:
1、碑文以下恣意一条指令:
MOV PC,LR
BX LR
2、在子程序入口处运用以下指令将R14存入仓库:
STMFD SP!,{
对应的,运用以下指令能够完结子程序回来:
LDMFD SP!,{
R14也可作为通用寄存器。
程序计数器PC(R15)
寄存器R15用作程序计数器(PC)。在ARM状况下,位[1:0]为0,位[31:2]用于保存PC;在Thumb状况下,位[0]为0,位[31:1]用于保存PC;尽管能够用作通用寄存器,可是有一些指令在运用R15时有一些特别约束,若不留意,碑文的成果将是不行意料的。在ARM状况下,PC的0和1位是0,在Thumb状况下,PC的0位是0。
R15尽管也可用作通用寄存器,但一般不这么运用,我们对R15的运用有一些特别的约束,当违反了这些约束时,程序的碑文成果是不知道的。
我们ARM体系结构选用了多级流水线技能,关于ARM指令集而言,PC总是指向当时指令的下两条指令的地址,即PC的值为当时指令的地址值加8个字节。
在ARM状况下,任一时间能够拜访以上所评论的16个通用寄存器和一到两个状况寄存器。在非用户形式(特权形式)下,则可拜访到特定形式分组寄存器,图2.3阐明在每一种运转形式下,哪一些寄存器是能够拜访的。
寄存器R16:
寄存器R16用作CPSR(Current Program Status Register,当时程序状况寄存器),CPSR可在任何运转形式下被拜访,它包含条件标志位、间断制止位、当时处理器形式标志位,以及其他一些相关的操控和状况位。
每一种运转形式下又都有一个专用的物理状况寄存器,称为SPSR(Saved Program Status Register,备份的程序状况寄存器),当反常产生时,SPSR用于保存CPSR的当时值,从反常退出时则可由SPSR来康复CPSR。
我们用户形式和体系形式不归于反常形式,他们没有SPSR,当在这两种形式下拜访SPSR,成果是不知道的。
Thumb状况下的寄存器集是ARM状况下寄存器集的一个子集,程序能够直接拜访8个通用寄存器(R7~R0)、程序计数器(PC)、仓库指针(SP)、衔接寄存器(LR)和CPSR。一起,在每一种特权形式下都有一组SP、LR和SPSR。图2.4标明Thumb状况下的寄存器安排。
Thumb状况下的寄存器安排与ARM状况下的寄存器安排的联系:
─ Thumb状况下和ARM状况下的R0~R7是相同的。
─ Thumb状况下和ARM状况下的CPSR和一切的SPSR是相同的。
─ Thumb状况下的SP对应于ARM状况下的R13。
─ Thumb状况下的LR对应于ARM状况下的R14。
─ Thumb状况下的程序计数器对应于ARM状况下R15
以上的对应联系如图2.5所示:
拜访THUMB状况下的高位寄存器(Hi-registers):
在Thumb状况下,高位寄存器R8~R15并不是规范寄存器集的一部分,但可运用汇编语言程序受约束的拜访这些寄存器,将其用作快速的暂存器。运用带特别变量的MOV指令,数据能够在低位寄存器和高位寄存器之间进行传送;高位寄存器的值能够运用CMP和ADD指令进行比较或加上低位寄存器中的值。
ARM体系结构包含一个当时程序状况寄存器(CPSR)和五个备份的程序状况寄存器(SPSRs)。备份的程序状况寄存器用来进行反常处理,其功用包含:
─保存ALU中的当时操作信息
─操控答应和制止间断
─设置处理器的运转形式
程序状况寄存器的每一位的安排如图2.6所示:
条件码标志(Condition Code Flags)
N、Z、C、V均为条件码标志位。它们的内容可被算术或逻辑运算的成果所改动,而且能够决议某条指令是否被碑文。
在ARM状况下,绝大多数的指令都是有条件碑文的。
在Thumb状况下,仅有分支指令是有条件碑文的。
条件码标志各位的详细意义如表2-1所示:
表2-1条件码标志的详细意义
标志位 |
意义 |
N |
当用两个补码一共的带符号数进行运算时,N=1一共运算的成果为负数;N=0一共运算的成果为正数或零; |
Z |
Z=1一共运算的成果为零;Z=0一共运算的成果为非零; |
C |
能够有4种办法设置C的值: ─ 加法运算(包含比较指令CMN):当运算成果产生了进位时(无符号数溢出),C=1,不然C=0。 ─ 减法运算(包含比较指令CMP):当运算时产生了借位(无符号数溢出),C=0,不然C=1。 ─ 关于包含移位操作的非加/减运算指令,C为移出值的最终一位。 ─ 关于其他的非加/减运算指令,C的值一般不改动。 |
V |
能够有2种办法设置V的值: ─ 关于加/减法运算指令,当操作数和运算成果为二进制的补码一共的带符号数时,V=1一共符号位溢出。 ─ 关于其他的非加/减运算指令,V的值一般不改动。 |
Q |
在ARM v5及以上版别的E系列处理器中,用Q标志位指示增强的DSP运算指令是否产生了溢出。在其他版别的处理器中,Q标志位无界说。 |
操控位
PSR的低8位(包含I、F、T和M[4:0])称为操控位,当产生反常时这些位能够被改动。假如处理器运转特权形式,这些位也能够由程序修改。
─间断制止位I、F:
I=1制止IRQ间断;
F=1制止FIQ间断。
─ T标志位:该位反映处理器的运转状况。
关于ARM体系结构v5及以上的版别的T系列处理器,当该位为1时,程序运转于Thumb状况,不然运转于ARM状况。
关于ARM体系结构v5及以上的版别的非T系列处理器,当该位为1时,碑文下一条指令以引起为界说的指令反常;当该位为0时,一共运转于ARM状况。
─运转形式位M[4:0]:M0、M1、M2、M3、M4是形式位。这些位决议了处理器的运转形式。详细意义如表2-2所示:
表2-2运转形式位M[4:0]的详细意义
M[4:0] |
处理器形式 |
可拜访的寄存器 |
0b10000 |
用户形式 |
PC,CPSR,R0-R14 |
0b10001 |
FIQ形式 |
PC,CPSR, SPSR_fiq,R14_fiq-R8_fiq, R7~R0 |
0b10010 |
IRQ形式 |
PC,CPSR, SPSR_irq,R14_irq,R13_irq,R12~R0 |
0b10011 |
办理形式 |
PC,CPSR, SPSR_svc,R14_svc,R13_svc,,R12~R0, |
0b10111 |
间断形式 |
PC,CPSR, SPSR_abt,R14_abt,R13_abt, R12~R0, |
0b11011 |
未界说形式 |
PC,CPSR, SPSR_und,R14_und,R13_und, R12~R0, |
0b11111 |
体系形式 |
PC,CPSR(ARM v4及以上版别), R14~R0 |
由表2-2可知,并不是一切的运转形式位的组合都是有用地,其他的组合成果会导致处理器进入一个不行康复的状况。
保存位
PSR中的其他位为保存位,当改动PSR中的条件码标志位或许操控位时,保存位不要被改动,在程序中也不要运用保存位来存储数据。保存位将用于ARM版别的扩展。
2.6 反常(Exceptions)
当正常的程序碑文流程产生暂时的间断时,称之为反常,例如处理一个外部的间断恳求。在处理反常之前,当时处理器的状况有必要保存,这样当反常处理完结之后,当时程序能够持续碑文。处理器答应多个反常一起产生,它们将会按固定的优先级进行处理。
ARM体系结构中的反常,与8位/16位体系结构的间断有很大的相似之处,但反常与间断的概念并不彻底同等。
ARM体系结构所支撑的反常及详细意义如表2-3所示。
表2-3 ARM体系结构所支撑的反常
反常类型 |
详细意义 |
复位 |
当处理器的复位电平有用时,产生复位反常,程序跳转到复位反常处理程序处碑文。 |
未界说指令 |
当ARM处理器或协处理器遇到不能处理的指令时,产生未界说指令反常。可运用该反常机制进行软件仿真。 |
软件间断 |
该反常由碑文SWI指令产生,可用于用户形式下的程序调用特权操作指令。可运用该反常机制完结体系功用调用。 |
指令预取间断 |
若处理器预取指令的地址不存在,或该地址不答应当时指令拜访,存储器会向处理器宣布间断信号,但当预取的指令被碑文时,才会产生指令预取间断反常。 |
数据间断 |
若处理器数据拜访指令的地址不存在,或该地址不答应当时指令拜访时,产生数据间断反常。 |
IRQ(外部间断恳求) |
当处理器的外部间断恳求引脚有用,且CPSR中的I位为0时,产生IRQ反常。体系的外设可经过该反常恳求间断服务。 |
FIQ(快速间断恳求) |
当处理器的快速间断恳求引脚有用,且CPSR中的F位为0时,产生FIQ反常。 |
当一个反常呈现今后,ARM微处理器会碑文以下几步操作:
1、将下一条指令的地址存入相应衔接寄存器LR,以便程序在处理反常回来时能从正确的方位从头开端碑文。若反常是从ARM状况进入,LR寄存器中保存的是下一条指令的地址(当时PC+4或PC+8,与反常的类型有关);若反常是从Thumb状况进入,则在LR寄存器中保存当时PC的偏移量,这样,反常处理程序就不需求确认反常是从何种状况进入的。例如:在软件间断反常SWI,指令MOV PC,R14_svc总是回来到下一条指令,不论SWI是在ARM状况碑文,仍是在Thumb状况碑文。
2、将CPSR到相应的SPSR中。
3、依据反常类型,强制设置CPSR的运转形式位。
4、强制PC从相关的反常向量地址取下一条指令碑文,然后跳转到相应的反常处理程序处。
还能够设置间断制止位,以制止间断产生。
假如反常产生时,处理器处于Thumb状况,则当反常向量地址加载入PC时,处理器主动切换到ARM状况。
ARM微处理器对反常的呼应进程用伪码能够描绘为:
R14_
SPSR_
CPSR[4:0] = Exception Mode Number
CPSR[5] = 0;当运转于ARM作业状况时
If
;当呼应FIQ反常时,制止新的FIQ反常
CPSR[6] = 1
CPSR[7] = 1
PC = Exception Vector Address
反常处理完毕之后,ARM微处理器会碑文以下几步操作从反常回来:
1、将衔接寄存器LR的值减去相应的偏移量后送到PC中。
2、将SPSR回CPSR中。
3、若在进入反常处理时设置了间断制止位,要在此铲除。
能够以为应用程序总是从复位反常处理程序开端碑文的,因而复位反常处理程序不需求回来。
FIQ(Fast Interrupt Request)
FIQ反常是为了支撑数据传输或许通道处理而规划的。在ARM状况下,体系有满足的私有寄存器,然后能够防止对寄存器保存的需求,并减小了体系上下文切换的开支。
若将CPSR的F方位为1,则会制止FIQ间断,若将CPSR的F位清零,处理器会在指令碑文时查看FIQ的输入。留意只要在特权形式下才干改动F位的状况。
可由外部经过对处理器上的nFIQ引脚输入低电平产生FIQ。不论是在ARM状况仍是在Thumb状况下进入FIQ形式,FIQ处理程序均会碑文以下指令从FIQ形式回来:
SUBS PC,R14_fiq ,#4
该指令将寄存器R14_fiq的值减去4后,到程序计数器PC中,然后完结从反常处理程序中的回来,一起将SPSR_mode寄存器的内容到当时程序状况寄存器CPSR中。
IRQ(Interrupt Request)
IRQ反常归于正常的间断恳求,可经过对处理器的nIRQ引脚输入低电平产生,IRQ的优先级低于FIQ,当程序碑文进入FIQ反常时,IRQ或许被屏蔽。
若将CPSR的I方位为1,则会制止IRQ间断,若将CPSR的I位清零,处理器会在指令碑文完之前查看IRQ的输入。留意只要在特权形式下才干改动I位的状况。
不论是在ARM状况仍是在Thumb状况下进入IRQ形式,IRQ处理程序均会碑文以下指令从IRQ形式回来:
SUBS PC , R14_irq , #4
该指令将寄存器R14_irq的值减去4后,到程序计数器PC中,然后完结从反常处理程序中的回来,一起将SPSR_mode寄存器的内容到当时程序状况寄存器CPSR中。
ABORT(间断)
产生间断反常意味着对存储器的拜访失利。ARM微处理器在存储器拜访周期内查看是否产生间断反常。
间断反常包含两种类型:
─指令预取间断:产生在指令预取时。
─数据间断:产生在数据拜访时。
当指令预取拜访存储器失利时,存储器体系向ARM处理器宣布存储器间断(Abort)信号,预取的指令被记为无效,但只要当处理器小事碑文无效指令时,指令预取间断反常才会产生,假如指令未被碑文,例如在指令流水线中产生了跳转,则预取指令间断不会产生。
若数据间断产生,体系的呼应与指令的类型有关。
当确认了间断的原因后,Abort处理程序均会碑文以下指令从间断形式回来,无论是在ARM状况仍是Thumb状况:
SUBS PC, R14_abt, #4;指令预取间断
SUBS PC, R14_abt, #8;数据间断
以上指令康复PC(从R14_abt)和CPSR(从SPSR_abt)的值,并从头碑文间断的指令。
Software Interruupt(软件间断)
软件间断指令(SWI)用于进入办理形式,常用于恳求碑文特定的办理功用。软件间断处理程序碑文以下指令从SWI形式回来,无论是在ARM状况仍是Thumb状况:
MOV PC , R14_svc
以上指令康复PC(从R14_svc)和CPSR(从SPSR_svc)的值,并回来到SWI的下一条指令。
Undefined Instruction(未界说指令)
当ARM处理器遇到不能处理的指令时,会产生未界说指令反常。选用这种机制,能够经过软件仿真扩展ARM或Thumb指令集。
在仿真未界说指令后,处理器碑文以下程序回来,无论是在ARM状况仍是Thumb状况:
MOVS PC, R14_und
以上指令康复PC(从R14_und)和CPSR(从SPSR_und)的值,并回来到未界说指令后的下一条指令。
表2-4总结了进入反常处理时保存在相应R14中的PC值,及在退出反常处理时引荐运用的指令。
表2-4反常进入/退出
|
回来指令 |
曾经的状况 |
留意 |
|
ARM R14_x |
Thumb R14_x |
|||
BL |
MOV PC,R14 |
PC+4 |
PC+2 |
1 |
SWI |
MOVS PC,R14_svc |
PC+4 |
PC+2 |
1 |
UDEF |
MOVS PC,R14_und |
PC+4 |
PC+2 |
1 |
FIQ |
SUBS PC,R14_fiq,#4 |
PC+4 |
PC+4 |
2 |
IRQ |
SUBS PC,R14_irq,#4 |
PC+4 |
PC+4 |
2 |
PABT |
SUBS PC,R14_abt,#4 |
PC+4 |
PC+4 |
1 |
DABT |
SUBS PC,R14_abt,#8 |
PC+8 |
PC+8 |
3 |
RESET |
NA |
- |
- |
4 |
留意:
1、在此PC应是具有预取间断的BL/SWI/未界说指令所取的地址。
2、在此PC是从FIQ或IRQ获得不能碑文的指令的地址。
3、在此PC是产生数据间断的加载或存储指令的地址。
4、体系复位时,保存在R14_svc中的值是不行预知的。
表2-5显现反常向量地址。
表2-5反常向量表
地址 |
反常 |
进入形式 |
0x0000,0000 |
复位 |
办理形式 |
0x0000,0004 |
未界说指令 |
未界说形式 |
0x0000,0008 |
软件间断 |
办理形式 |
0x |
间断(预取指令) |
间断形式 |
0x0000,0010 |
间断(数据) |
间断形式 |
0x0000,0014 |
保存 |
保存 |
0x0000,0018 |
IRQ |
IRQ |
0x |
FIQ |
FIQ |
当多个反常一起产生时,体系依据固定的优先级决议反常的处理次第。反常优先级由高到低的摆放次第如表2-6所示。
表2-6反常优先级
优先级 |
反常 |
1(最高) |
复位 |
2 |
数据间断 |
3 |
FIQ |
4 |
IRQ |
5 |
预取指令间断 |
6(最低) |
未界说指令、SWI |
当体系运转时,反常或许会随时产生,为确保在ARM处理器产生反常时不至于处于不知道状况,在应用程序的规划中,首要要进行反常处理,选用的方法是在反常向量表中的特定方位放置一条跳转指令,跳转到反常处理程序,当ARM处理器产生反常时,程序计数器PC会被强制设置为对应的反常向量,然后跳转到反常处理程序,当反常处理完结今后,回来到主程序持续碑文。
2.7本章末节
本章对ARM微处理器的体系结构、寄存器的安排、处理器的作业状况、运转形式以及处理器反常等内容进行了描绘,这些内容也是ARM体系结构的根本内容,是体系软、硬件规划的根底。