微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM微处理器的编程模型之:异常中断处理

ARM微处理器的编程模型之:异常中断处理

时间:09-13 来源:互联网 点击:

此外,也可以通过编程改变CPSR,进入任何一种ARM处理器模式。

注意

用户和系统模式是仅有的不可通过异常进入的两种模式,也就是说,要进入这两种模式,必须通过编程改变CPSR。

表3.6 ARM处理器异常及其对应模式

异 常

模 式

用 途

快速中断请求

FIQ

进行快速中断请求处理

外部中断请求

IRQ

进行外部中断请求处理

SWI

SVC

进行操作系统的高级处理

复位

SVC

进行操作系统的高级处理

预取指令中止异常

ABORT

虚存和存储器保护

数据中止异常

ABORT

虚存和存储器保护

未定义指令

Undefined

软件模拟硬件协处理器

3.4.4 异常响应流程

1.判断处理器状态

当异常发生时,处理器自动切换到ARM状态,所以在异常处理函数中要判断在异常发生前处理器是ARM状态还是Thumb状态。这可以通过检测SPSR的T位来判断。

通常情况下,只有在SWI处理函数中才需要知道异常发生前处理器的状态。所以在Thumb状态下,调用SWI软中断异常必须注意以下两点。

① 发生异常的指令地址为(lr-2)而不是(lr-4)。

② Thumb状态下的指令是16位的,在判断中断向量号时使用半字加载指令LDRH。

下面的例子显示了一个标准的SWI处理函数,在函数中通过SPSR的T位判断异常发生前的处理器状态。

T_bit EQU 0x20 ; bit 5. SPSR中的ARM/Thumb状态位,

:

:

SWIHandler

STMFD sp!, {r0-r3,r12,lr} ; 寄存器压栈,保护程序现场

MRS r0, spsr ; 读SPSR寄存器,判断异常发生前的处理器状态

TST r0, #T_bit ; 检测SPSR的T位,判断异常发生前是否为Thumb状态

LDRNEH r0,[lr,#-2] ; 如果是Thumb状态,使用半字加载指令读取发生异常的指令地址

BICNE r0,r0,#0xFF00 ; .提取中断向量号.

LDREQ r0,[lr,#-4] ; 如果是ARM状态,使用字加载指令,读取发生异常的指令地址

BICEQ r0,r0,#0xFF000000 ; 提取中断向量号并将中断向量号存入r0

; r0 存储中断向量号

CMP r0, #MaxSWI ; 判断中断是否超出范围

LDRLS pc, [pc, r0, LSL#2] ; 如果未超出范围,跳转到软中断向量表Switable

B SWIOutOfRange ; 如果超出范围,跳转到软中断越界处理程序

switable

DCD do_swi_1

DCD do_swi_2

:

:

do_swi_1

; 1号软中断处理函数

LDMFD sp!, {r0-r3,r12,pc}^ ; Restore the registers and return.

; 恢复寄存器并返回

do_swi_2 ; 2号软中断处理函数

:

2.向量表

如前面介绍向量表时提到的,每一个异常发生时总是从异常向量表开始跳转。最简单的一种情况是向量表里面的每一条指令直接跳向对应的异常处理函数。其中快速中断处理函数FIQ_handler()可以直接从地址0x1C处开始,省下一条跳转指令,如图3.6所示。

图3.6 异常处理向量表

但跳转指令B的跳转范围为±32MB,但很多情况下不能保证所有的异常处理函数都定位在向量的32MB范围内,需要更大范围的跳转,而且由于向量表空间的限制,只能由一条指令完成。具体实现方法有下面两种。

(1)MOV PC,#imme_value

这种办法将目标地址直接赋值给PC。但这种方法受格式限制不能处理任意立即数。这个立即数由一个8位数值循环右移偶数位得到。

(2)LDR PC,[PC+offset]

把目标地址先存储在某一个合适的地址空间,然后把这个存储器单元的32位数据传送给PC来实现跳转。

这种方法对目标地址值没有要求。但是存储目标地址的存储器单元必须在当前指令的±4KB空间范围内。

注意

在计算指令中引用offset数值的时候,要考虑处理器流水线中指令预取对PC值的影响。

3.4.5 从异常处理程序中返回

当一个异常处理返回时,一共有3件事情需要处理:通用寄存器的恢复、状态寄存器的恢复以及PC指针的恢复。通用寄存器的恢复采用一般的堆栈操作指令即可,下面重点介绍状态寄存器的恢复以及PC指针的恢复。

1.恢复被中断程序的处理器状态

PC和CPSR的恢复可以通过一条指令来实现,下面是3个例子。

· MOVS PC,LR

· SUBS PC,LR,#4

· LDMFD SP!,{PC}^

这几条指令是普通的数据处理指令,特殊之处在于它们把程序计数器寄存器PC作为目标寄存器,并且带了特殊的后缀“S”或“^”。其中“S”或“^”的作用就是使指令在执行时,同时完成从SPSR到CPSR的拷贝,达到恢复状态寄存器的目的。

2.异常的返回地址

异常返回时,另一个非常重要的问题就是返回地址的确定。前面提到过,处理器进入异常时会有一个保存LR的动作,但是该保持值并不一定是正确中断的返回地址。以一个简单的指令执行流水状态图来对此加以说明,如图3.7所示。

图3.7 3级流水线示例

在ARM架构里,PC值指向当前执行指令地址加8。也就是说,当执行指令A(地址0x8000)时,PC等于

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top