文档章节

ARM 异常向量表及寄存器 (转)

For_MGP
 For_MGP
发布于 2014/10/07 09:26
字数 4943
阅读 207
收藏 0

异常(Exception)是指由处理器执行指令导致原来运行程序的中止,异常与指令运行相关,是CPU执行程序产生的,是同步的,可分为精确异常和非精确异常。异常处理遵守严格的程序顺序,不能嵌套,只有当第一个异常处理完并返回后才能处理后续的异常。

中断(Interrupt)是异步产生的,不是由CPU执行程序产生的,中断属于异常的一种,中断是唯一与CPU运行无关的异常。所以我们用异常中断来统称ExceptionInterrupt

 

异常  导致原来运行程序中止    异常的最终肯定是cpu 执行 的问题。  狭义的异常

中断 是一种 异常。  不是由cpu产生的。 与cpu无关的异常。   广义的异常

 

ARM处理器中的异常种类及其向量表和优先级说明如表7-3所示。

----------------------------------------------------

各个异常中断的中断向量地址以及中断的处理优先级
中断向量地址 异常中断类型 异常中断模式 优先级(6最低)

0x00 复位 特权模式 1

 ARM系统,在0x0地址,是RESET的中断向量(地址  指针  向量)。 类型 即 条件:系统上电复位后,自动执行该条跳转指令,跳转到相应的启动代码处执行。0x0物理地址都应该是非易失存储器,比如Flash,NVRAM,ROM之类。如果你不用硬件调试器,是无法跟踪到该条跳转指令的


0x04 未定义的指令 未定义指令终止模式 6

如果系统出现问题,执行到一条不认识的指令时,这时系统异常中断发生,系统跳转到第二个向量, 执行ldr     pc, _undefined_instruction;这时pc被设置成undefined_instruction,CPU到_undefined_instruction地址去执行这一地址下的指令, 结果还是一个未定义指令,如此循环下去; 其他异常向量,原理类似。


0x08 软件中断 特权模式 6
0x0C 指令预取终止 终止模式 5
0x10 数据访问终止 终止模式 2
0x14 保留 未使用 未使用
0x18 外部中断请求 IRQ模式 4
0x1C 快速中断请求 FIQ模式 3

 

 来源:[http://www.jdzj.com]机电之家·机电行业电子商务平台!

7-3  ARM处理器的异常向量表及优先级

向量地址

高端向量

例外名称

系统工作模式

I state on entry

F state on entry

0x0000000

0xffff0000

复位

超级用户Svc

Set

Set

0x0000004

0xffff0004

未定义指令终止

未定义指令终止Und

Set

Unchanged

0x0000008

0xffff0008

软中断(SWI

超级用户Svc

Set

Unchanged

0x000000c

0xffff000c

Prefetch abort

指令预取终止Abt

Set

Unchanged

0x0000010

0xffff0010

Data abort

数据访问终止Abt

Set

Unchanged

0x0000014

0xffff0014

Reserved

Reserved

-

-

0x0000018

0xffff0018

IRQ

外部中断模式IRQ

Set

Unchanged

0x000001C

0xffff001c

FIQ

快速中断模式FIQ

Set

Set

说明:

² 高端向量是ARM架构可选配置,可以通过硬件外部输入管脚来配置是低端向量还是高端向量,不能通过指令来改变向量的位置,但如果ARM芯片内部有标准ARM协处理器,那么协处理器CP15的寄存器C1bit13可以用来切换低端和高端向量地址,等于0时为低端向量,等于1时为高端向量。

²  ARM的例外优先级从高到低依次为ResetData abortFIQIRQPrefetch abortUndefined instruction/SWI

跟 51的中断同样作用?

http://blog.csdn.net/billpig/article/details/5256103

了解ARM处理器的工作模式和各个寄存器的功能,对移植操作系统是很有帮助的。

   ARM处理器共有7种不同的处理器模式:

1、用户模式(User):正常程序的执行模式。

2、快速中断模式(FIQ):用于高速数据传输和通道处理。

3、外部中断模式(IRQ):用于通常的外部中断处理。

4、特权模式(SVE):又叫管理模式,供操作系统使用的一种保护模式。

5、数据访问中止模式(ABT):用于虚拟存储和存储保护。

6、未定义指令中止模式(UND):用于支持通过软件方针硬件的协处理器。

7、系统模式(SYS):用于运行特权级的操作系统任务。

   除了用户模式以外的其他6种处理器模式称为特权模式。在这些模式下,程序可以访问所

的系统资源,也可以任意地进行处理器的模式切换。其中,除了系统模式以外,其他5种特权

式又称为异常模式。

   大多数的用户程序运行在用户模式下。这时,应用程序不能够访问一些受操作系统保护的

系统资源。应用程序也不能直接进行模式的切换。当需要进行处理器模式切换时,应用程序可

以产生异常处理,在异常处理过程中进行处理器模式切换。

ARM处理器共有37个寄存器。其中包括:31个通用寄存器,包括程序计数器(PC)在内。这些寄存器都是32位寄存器。以及6个32位状态寄存器。但目前只使用了其中12位。ARM处理器共有7种不同的处理器模式,在每一种处理器模式中有一组相应的寄存器组。任意时刻(也就是任意的处理器模式下),可见的寄存器包括15个通用寄存器(R0~R14)、一个或两个状态寄存器及程序计数器(PC)。在所有的寄存器中,有些是各模式共用的同一个物理寄存器;有一些寄存器是各模式自己拥有的独立的物理寄存器。表1列出了各处理器模式下可见的寄存器情况。

表1 各种处理器模式下的寄存器

 

用户模式

 

 

系统模式

 

 

特权模式

 

 

中止模式

 

 

未定义指令模式

 

 

外部中断模式

 

 

快速中断模式

 

 

R0

 

 

R0

 

 

R0

 

 

R0

 

 

R0

 

 

R0

 

 

R0

 

 

R1

 

 

R1

 

 

R1         

 

 

R1

 

 

R1

 

 

R1

 

 

R1

 

 

R2

 

 

R2

 

 

R2

 

 

R2

 

 

R2

 

 

R2

 

 

R2

 

 

R3

 

 

R3

 

 

R3

 

 

R3

 

 

R3

 

 

R3

 

 

R3

 

 

R4

 

 

R4

 

 

R4

 

 

R4

 

 

R4

 

 

R4

 

 

R4

 

 

R5

 

 

R5

 

 

R5

 

 

R5

 

 

R5

 

 

R5

 

 

R5

 

 

R6

 

 

R6

 

 

R6

 

R6

 

 

R6

 

 

R6

 

 

R6

 

 

R8

 

 

R8

 

 

R8

 

 

R8

 

 

R8

 

 

R8

 

 

R8_fiq

 

 

R9

 

 

R9

 

 

R9

 

 

R9

 

 

R9

 

 

R9

 

 

R9_fiq

 

 

R10

 

 

R10

 

 

R10

 

 

R10

 

 

R10

 

 

R10

 

 

R10_fiq

 

 

R11

 

 

R11

 

 

R11

 

 

R11

 

 

R11

 

 

R11

 

 

R11_fiq

 

 

R12

 

 

R12

 

 

R12

 

 

R12

 

 

R12

 

 

R12

 

 

R12_fiq

 

 

R13

 

 

R13

 

 

R13_svc

 

 

R13_abt

 

 

R13_und

 

 

R13_inq

 

 

R13_fiq

 

 

R14

 

 

R14

 

R14_svc

 

 

R14_abt

 

 

R14_und

 

 

R14_inq

 

 

R14_fiq

 

 

PC

 

 

PC

 

 

PC

 

 

PC

 

 

PC

 

 

PC

 

 

PC

 

 

CPSR

 

 

CPSR

 

 

CPSR

SPSR_svc

 

 

CPSR

SPSR_abt

 

 

CPSR

SPSR_und

 

 

CPSR

SPSR_inq

 

 

CPSR

SPSR_fiq

 

通用寄存器

通用寄存器可以分为下面3类:未备份寄存器(The unbanked registers),包括R0~R7。备份寄存器(The banked registers),包括R8~R14。程序计数器PC,即R15。

未备份寄存器

未备份寄存器包括R0~R7。对于每一个未备份寄存器来说,在所有的处理器模式下指的都是同一个物理寄存器。在异常中断造成处理器模式切换时,由于不同的处理器模式使用相同的物理寄存器,可能造成寄存器中数据被破坏。未备份寄存器没有被系统用于特别的用途,任何可采用通用寄存器的应用场合都可以使用未备份寄存器。

备份寄存器

对于备份寄存器R8~R12来说,每个寄存器对应两个不同的物理寄存器。例如,当使用快速中断模式下的寄存器时,寄存器R8和寄存器R9分别记作R8_fiq、R9_fiq;当使用用户模式下的寄存器时,寄存器R8和寄存器R9分别记作R8_usr、R9_usr等。在这两种情况下使用的是不同的物理寄存器。系统没有将这几个寄存器用于任何的特殊用途,但是当中断处理非常简单,仅仅使用R8~R14寄存器时,FIQ处理程序可以不必执行保存和恢复中断现场的指令,从而可以使中断处理过程非常迅速。对于备份寄存器R13和R14来说,每个寄存器对应6个不同的物理寄存器,其中的一个是用户模式和系统模式共用的;另外的5个对应于其他5种处理器模式。采用记号R13_<mode>来区分各个物理寄存器:

其中,<mode>可以是下面几种模式之一:usr、svc、abt、und、irq及fiq。

寄存器R13在ARM中常用作栈指针。在ARM指令集中,这只是一种习惯的用法,并没有任何指令强制性的使用R13作为栈指针,用户也可以使用其他的寄存器作为栈指

针;而在Thumb指令集中,有一些指令强制性地使用R13作为栈指针。

每一种异常模式拥有自己的物理的R13。应用程序初始化该R13,使其指向该异常模式专用的栈地址。当进入异常模式时,可以将需要使用的寄存器保存在R13所指的栈中;当退出异常处理程序时,将保存在R13所指的栈中的寄存器值弹出。这样就使异常处理程序不会破坏被其中断程序的运行现场。

寄存器R14又被称为连接寄存器(Link Register,LR),在ARM体系中具有下面两种特殊的作用:每一种处理器模式自己的物理R14中存放在当前子程序的返回地址。当通过BL或BLX指令调用子程序时,R14被设置成该子程序的返回地址。在子程序中,当把R14的值复制到程序计数器PC中时,子程序即返回。

当异常中断发生时,该异常模式特定的物理R14被设置成该异常模式将要返回的地址,对于有些异常模式,R14的值可能与将返回的地址有一个常数的偏移量。具体的返回方式与上面的子程序返回方式基本相同。

R14寄存器也可以作为通用寄存器使用。  

程序计数器R15

程序计数器R15又被记作PC。它虽然可以作为一般的通用寄存器使用,但是有一些指令在使用R15时有一些特殊限制。当违反了这些限制时,该指令执行的结果将是不可预料的。

由于ARM采用了流水线机制,当正确读取了PC的值时,该值为当前指令地址值加8个字节。也就是说,对于ARM指令集来说,PC指向当前指令的下两条指令的地址。

由于ARM指令是字对齐的,PC值的第0位和第1位总为0。需要注意的是,当使用指令STR/STM保存R15时,保存的可能是当前指令地址值加8字节,也可能保存的是当前指令地址加12字节。到底是哪种方式,取决于芯片具体设计方式。无论如何,在同一芯片中,要么采用当前指令地址加8,要么采用当前指令地址加12,不能有些指令采用当前指令地址加8,另一些指令采用当前指令地址加12。因此对于用户来说,尽量避免使用STR/STM指令来保存R15的值。当不可避免这种使用方式时,可以先通过一些代码来确定所用的芯片使用的是哪种实现方式。

对于ARM版本4以及更高的版本,程序必须保证写入R15寄存器的地址值的bits[1:0]为0b00;否则将会产生不可预知的结果。

对于Thumb指令集来说,指令是半字对齐的。处理器将忽略bit[0],即写入R15的地址值首先与0XFFFFFFFC做与操作,再写入R15中。

还有—些指令对于R15的用法有一些特殊的要求。比如,指令BX利用bit[0]来确定是ARM指令,还是Thumb指令。这种读取PC值和写入PC值的不对称的操作需要特别注意。

程序状态寄存器

CPSR(当前程序状态寄存器)可以在任何处理器模式下被访问。它包含了条件标志位、中断禁止位、当前处理器模式标志以及其他的一些控制和状态位。每一种处理器模式下都有一个专用的物理状态寄存器,称为SPSR(备份程序状态寄存器)。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。在异常中断程序退出时,可以用SPSR中保存的值来恢复CPSR。

由于用户模式和系统模式不是异常中断模式,所以它们没有SPSR。当在用户模式或系统模式中访问SPSR,将会产生不可预知的结果。

CPSR的格式如下所示。SPSR格式与CPSR格式相同。

 

31

 

 

30

 

 

29

 

 

28

 

 

27

 

 

26

 

 

7

 

 

6

 

 

5

 

 

4

 

 

3

 

 

2

 

 

1

 

 

0

 

 

N

 

 

Z

 

 

C

 

 

V

 

 

Q

 

 

DNM(RAZ)

 

 

I

 

 

F

 

 

T

 

 

M4

 

 

M3

 

 

M2

 

 

M1

 

 

M0

 

 

条件标志位

N(Negative)、Z(Zero)、C(Carry)及V(oVerflow)统称为条件标志位。大部分的ARM指令可以根据CPSR中的这些条件标志位来选择性地执行。各条件标志位的具体含义如表2所示。

 

表2 CPSR中的条件标志位

 

标志位 

 

 

含  义

 

 

N

 

 

本位设置成当前指令运算结果的bit[31)的值

当两个补码表示的有符号整数运算时,N=I表示运算的结果为负数;N=0表示结果为正数或零

 

 

Z

 

 

Z=1表示运算的结果为零;Z=0表示运算的结果不为零。

对于CMP指令,Z=1表示进行比较的两个数大小相等。

下面分4种情况讨论C的设置方法:

在加法指令中(包括比较指令CMN),当结果产生了进位,则C=1,表示无符号数运算发生上溢出;其他情况下C=0。

在减法指令中(包括比较指令CMP),当运算中发生借位则C=0表示无符号数运算发生下溢出;其他情况下C=1。

对于包含移位操作的非加/减法运算指令,C中包含最后一次溢出的位数数值。

对于其他非加/减法运算指令,C位的值通常不受影响。

 

 

 

 

对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时V=1表示符号位溢出。

通常其他的指令不影响V位,具体可参考各指令的说明。

 

 

Q标志位

在ARMv5的E系列处理器中,CPSR的bit[27]称为Q标志位,主要用于指示增强的

DSP指令是否发生了溢出。同样的SPSR中的bit[27]也称为Q标志位,用于在异常中断发生时保存和恢复CPSR中的Q标志位。

在ARM v5以前的版本及ARM v5的非E系列的处理器中,Q标志位没有被定义。CPSR的bit[27]属于DNM(RAZ)。

CPSR中的控制位

CPSR的低8位I、F、T及M[4:0]统称为控制位。当异常中断发生时这些位发生变化。在特权级的处理器模式下,软件可以修改这些控制位。

1)      中断禁止位

当I=1时禁止IRQ中断。

当F=1时禁止FIQ中断。

2)      T控制位   

T控制位用于控制指令执行的状态,即说明本指令是ARM指令,还是Thumb指令。对与不同版本的ARM处理器,T控制位的含义不同。对于ARMv4以及更高版本的T系列的ARM处理器,

T=0表示执行ARM指令。

T=1表示执行Thumb指令。

对于ARMv5以及更高的版本的非T系列的ARM处理器,T控制位含义如下:

T=0表示执行ARM指令。

T=1表示强制下一条执行的指令产生未定义指令中断。

3)      M控制位

控制位M[4:0]控制处理器模式,具体含义如表3所示。

表3控制位M[4:0] 的含义

 

M[4:0]

 

 

处理器模式

 

 

可访问的寄存器

 

 

0b10000

 

 

User  

 

 

PC,R14一R0,CPSR

 

 

0b10001

 

 

FIQ   

 

 

PC,R14_fiq-R8_flq,R7~R0,CPSR,SPSR_nq

 

 

0b10010

 

 

1RQ

 

 

PC,R14 _irq-R13 _irq,R12一R0,CPSR,SPSR_ irq

 

 

0b10011

 

 

Supervisor

 

 

PC,R14_ svc-R13 _svc,R12~R0,CPSR,SPSR_svc

 

 

0b10111

 

 

Abort

 

 

PC,R14_abt-R13_abt,R12~R0,CPSR,SPSR_abt

 

 

0b11011

 

 

Undefined

 

 

PC,R14_und-R13_und,R12~R0,CPSR,SPSR_ und

 

 

CPSR中的其他位

CPSR中的其他位用于将来ARM版本的扩展。应用软件不要操作这些位,以免与ARM将来版本的扩展冲突。

ARM体系中的存储空间

ARM体系使用单—的平板地址空间。该地址空间的大小为232个8位字节。这些字节单元的地址是一个无符号的32位数值,其取值范围为0到232—1。ARM的地址空间也可以看作是232个32位的字单元。这些字单元的地址可以被4整除,也就是说该地址的低两位为0b00。地址为A的字数据包括地址为A、A+I、A+2、A+34个字节单元的内容。

在ARM版本4及以上的版本中,ARM的地址空间也可以看作是231个16位的半字单元。这些半字单元的地址可以被2整除,也就是说该地址的最低位为0b0。地址为A的半字数据包括地址为A、A+1两个字节单元的内容。

各存储单元的地址作为32位的无符号数,可以进行常规的整数运算。这些运算的结果进行232取模。也就是说,运算结果发生上溢出和下溢出时,地址将会发生卷绕。

ARM存储器格式

在ARM体系中,每个字单元中包含4个字节单元或者两个半字单元:1个半字单元中包含两个字节单元。但是在字单元中,4个字节哪一个是高位字节,哪一个是低位字节则有两种不同的格式:big-endian格式和little-endian格式。在big-endian格式中,对于地址为A的字单元包括字节单元A、A+1、A+2及A+3,其中字节单元由高位到低位字节顺序为A、A+1、A+2、A+3;地址为A的字单元包括半字单元A、A+2,其中半字单元由高位到低位字节顺序为A、A+2:地址为A的半字单元包括字节单元A、A+1,其中字节单元由高位到低位字节顺序为A、A+1。  

在little-endian格式中,地址为A的字单元包括字节单元A、A+1、A+2及A+3,其中字节单元由高位到低位字节顺序为A+3、A+2、A+1、A;地址为A的字单元包括半字节单元A、A+2,其中半字单元由高位到低位字节顺序为A+2、A;地址为A的半字单元包括字节单元A、A+1,其中字节单元由高位到低位字节顺序为A+1、A

本文转载自:http://blog.chinaunix.net/uid-25304914-id-3070654.html

For_MGP
粉丝 2
博文 66
码字总数 20576
作品 0
深圳
程序员
私信 提问
三星SP5V210开发之ARM体系架构和通用寄存器

arm的编程模式和工作模式ARM 在32位架构下的约定: Byte 8bits Halfword : 16bits(2Byte) word 32bits(4Byte) 大部分ARM core提供: ARM指令集(32-bit) Thumb指令集(16-bit) Thumb2指令集(16...

c13311192930
2018/03/01
0
0
ARM流水线、异常中断向量表、命名及版本

流水线 ARM7是三阶流水线 Fetch是指从内存中读取指令 Decode是指对指令译码 Execute是指执行指令,并将结果回写至内存 举例为:MSR指令使能中断,但只有当第三个时钟节拍完成时,中断才得到使...

长平狐
2012/09/03
223
0
为什么ARM的frq中断的处理速度比较快

FRQ向量位于异常向量表的最末端,不需要跳转就可以直接执行后面跟随的异常处理程序;FRQ模式中私有寄存器数量最多,在进行异常处理时不需要对这些寄存器进行压栈保存。

尤鱼
2013/10/12
114
0
字符设备驱动程序之中断方式的按键驱动_Linux异常处理结构(六)

字符设备驱动程序之中断方式的按键驱动_Linux异常处理结构 中断方式获取按键值(单片机) 1、有按键按下 2、CPU发生中断 强制调到异常向量入口执行(中断是异常的一种) 3、入口函数 跳转指令...

xiaodingqq
2018/05/12
0
0
ARM体系的异常中断

在ARM体系中,通常有以下3种方式控制程序的执行流程: 在正常程序执行过程中,每执行一条ARM指令,程序计数寄存器PC的值加4个字节;每执行一条Thumb指令,程序计数寄存器PC的值加2个字节。整...

幸福阶梯
2018/02/14
27
0

没有更多内容

加载失败,请刷新页面

加载更多

Andorid SQLite数据库开发基础教程(2)

Andorid SQLite数据库开发基础教程(2) 数据库生成方式 数据库的生成有两种方式,一种是使用数据库管理工具生成的数据库,我们将此类数据库称为预设数据库,另一种是使用代码生成的数据库。...

大学霸
26分钟前
3
0
YecPad 开源啦!: 基于C#的功能强大的可编辑记事本文本编辑软件

JY Lin 开源:YecPad : 基于C#的功能强大的可编辑记事本文本编辑软件 YecPad 是一款基于C#编程语言开发的功能强大的可编辑记事本文本编辑软件。 可以进行文本文件的打开、保存、删除及编辑功...

YDOOK
33分钟前
3
0
StringBuilder 与 StringBuffer 的区别

StringBuffer是线性安全的,支持并发操作,适合多线程。 StringBuilder线性不安全,不支持并发操作,适合单线程。 也就是说他们俩区别就在于支不支持并发操作,使用上基本上类似...

无名氏的程序员
36分钟前
3
0
js 找数组中的最值

本文转载于:专业的前端网站➸js 找数组中的最值 背景: 2个数组以下 , 比如 [[4, 9, 1, 3], [13, 35, 18, 26], [32, 35, 97, 39], [1000000, 1001, 857, 1]] 找最值的时候,我一开始想用两个...

前端老手
45分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部