举个小比方,下面是一段ARM汇编代码:
地址 |
指令 |
0x3000 |
BL add |
0x3004 |
MOV r0,#0 |
0x3008 |
MOV r1,#1 |
0x300C |
MOV r2,#2 |
AREA test,CODE,READONLY
ENTRY
Start
MOV r0,#1
MOV r1,#1
BL add
MOV r0,#0
MOV r1,#1
Add
ADD r0,r0,r1
MOV r0,r0,r1
END
当0x3000处的BL指令履行时,会把PC(=0x3008)保存到LR寄存器里边,也便是LR=0x3008。接下来处理器会立即对LR进行一个主动的更新动作:LR=LR-0x4,这样,LR里边的地址为0x3008 – 0x4 = 03004,它是指令”MOV r0,#0”的地址,所以当从子程序add回来时,LR里边正好是正确的回来地址。既是下一条要履行的指令的地址。
一、间断反常处理函数调用
反常便是正在履行的指令,由于各种软件或硬件毛病被打断,比方,在读数据或指令时,拜访存储器失利、产生了一个外部硬件间断等。当这些状况产生时,在ARM体系里,由反常和间断处理程序做出相应的处理,当处理完结后,要回来到被间断的指令,使被间断的指令能够持续正常履行下去。因而,确认反常和间断处理程序的回来地址是一个非常重要的问题。
1、间断处理
当外部间断IRQ和FIQ(Fast Interrpt Request,快速间断恳求)产生时,ARM核完结一部分作业。当然,这些作业是任何反常产生时都必须要做的,所以ARM处理器就会主动带咱们完结。 其它重要的作业,必须由程序员来完结。ARM处理器处理的事包含从用户形式切换到IRQ形式、状况寄存器值的改动及跳转。比方说,处理器主动跳转到从0x0地址开端的反常间断向量表的0x18处,在向量表的0x18处,最简略的指令为”B HandlerIRQ”。
那程序员所要关怀的便是完成详细的反常处理程序(HandlerIRQ)。当用ARM汇编语言完成HandlerIRQ函数的时分,怎么确认HandlerIRQ函数正确地回来地址,使被间断的指令能够持续正常履行下去。
比较常用的间断处理程序结构如下:
HandlerIRQ ;间断呼应,从向量表直接跳来
SUB r14,r14,#4;核算回来地址
STMFD r13,{r0-r3,r14} ;维护现场,一般只需要维护{r0-r3,lr}
BL irqHandler ;跳到详细的反常处理函数
LDMFD r13,{r0-r3,pc}^ ;康复现场
有程序能够看出,经过”SUB R14,R14,#4”核算间断函数的回来地址。那有人一定会问,为什么核算回来地址的时分要减去4呢?
地址 |
指令 |
0x3000 |
BL add |
0x3004 |
MOV r0,#0 |
0x3008 |
MOV r1,#1 |
0x300C |
MOV r2,#2 |
咱们看上个表,比方在履行地址为0x3004的move指令时,忽然来了一个IRQ间断,这个间断打断了move指令的履行,这个时分就要去跳转到反常处理函数,之后还要回来0x3004地址从头履行move指令。当间断产生时,LR里边保存了用户形式下PC的值,那么当履行地址为0x3004的move指令时,PC的值应该是0x300C,前面介绍过,当产生跳转时,处理器会对LR进行一个主动的更新动作:LR=LR-0x4,这样LR里边的地址是0x300C-0x04=0x3008。可是0x3008并不是咱们要的地址,由于间断产生在地址为0x3004的move指令履行的时分,所以间断处理完后应该回来这个地址。 这便是在核算回来地址的时分LR减去4的原因。关于FIQ间断和预取指间断反常,核算回来地址办法和IRQ相同。
我的了解:自身PC总是指向当时指令的下两条指令的地址,PC的值为当时指令的地址值加8个字节。产生跳转时,LR=LR-04,所以子程序回来时处理器主动核算LR=LR+08-04(LR+04),刚好是履行下一条指令。而间断后是要回来产生间断的当时指令持续履行,所以应该在LR回来后再减去一条指令地址04,即LR=LR-04。
以下我的收拾:
2 、ARM处理器对反常的呼应过程:
a. 维护LR;
b. 将CPSR到相应的SPSR中;
c. 依据反常类型强制设置CPSR的运转形式位;
d. 跳转反常处理程序。
3、 ARM处理器对反常的回来过程:
a. LR,LR减去相应的偏移量后送到PC;
b. 将SPSR回CPSR中;
c.清楚间断制止位。
二、各间断类型及优先级和回来值:
1、FIQ(Fast Interrupt Request)
FIQ反常是为了数据传输或通道处理而规划的。CPSR中的F位:=1 制止FIQ间断,=0答应间断。只能在特权形式下才干改动F的状况。可由外部将nFIQ引脚输入低电平也能产生FIQ。回来指令: SUBS PC,R14_fiq,#4.
2、IRQ(Interrupt Request)
IRQ反常归于正常的终端恳求,能够在nIRQ引脚输入低电平产生。CPSR中的I位: =1 制止IRQ间断,=0答应IRQ间断,只能在特权形式下才干改动I的状况。回来指令:SUBS PC,R14_irq,#4.
3、Abort:间断
产生间断反常意味着对存储器的拜访失利。
a:指令预取间断:产生在指令预取时。间断后PC=PC+8,回来指令:SUBS PC,R14_abt,#4.
b:数据间断:产生在数据拜访时。间断后PC=PC+12,回来指令: SUBS PC,R14_abt,#8.
4、Software Interrupt
SWI用于进入办理形式,用于恳求履行特定的办理功用。回来地址:MOV PC,R14_svc.