矢量中断
某个中断源产生中断时,由硬件直接跳到中断服务程序的入口(有些cpu,如s3c440box内部有外部中断的中断向量表,因而支持矢量中断,而S3C2440等没有硬件向量表,不支持矢量中断。固定中断向量表中装的不是中断或异常服务程序的入口地址,而是一条转到异常或中断处理程序的转移指令
硬件中断向量表
软件中断向量表:在ram区的_ISR_STARTADDRESS处开辟一段空间,设置一张软件设定的中断向量表,用来存放中断和异常的服务程序入口地址。
非矢量中断
产生中断源时,先跳到一个总入口,再有软件查询中断挂起寄存器判断是哪个中断源,然后跳到入口服务程序。例如;arm接受到中断控制器的IRQ请求,cpu响应中断后,将在中断服务寄存器的对应位置位,cpu转到0x18处执行。在0x18处,放置一条转移指令:
B ISR_IRQ
ISR_IRQ为中断服务程序的总入口地址,也是非矢量中断模式的中断源判别及散转程序。在ISR_IRQ中通过查询中断服务寄存器的对应位判别出中断源,然后转至对应的中断服务程序。
ISR_IRQ:
STMDB R13!,{R0-R8,R12,R14}
此处的R14用于异常返回
BL IRQ
LDMIA R13!,{ R0-R8,R12,R14};恢复现场
SUBS PC,R14,#4;返回中断断点处继续执行(CPSR 也自动恢复)
IRQ:
SUB SP,SP,#4;腾出一个字以存放中断服务程序入口地址
STMFD SP!,{R8-R9};
LDR R9,=I_ISPR;中断服务寄存器地址送到R9
LDR R9,[R9];ISPR 的内容送r9
MOV R8,#0;设置r8为地址偏移量,并初始化为0
10:
BCS 11
ADD R8,R8,#4
B 10
11:
; HANDLEADC EQU _ISR_STARTADDRESS+4*8
ADD R9,R9,R8
LDR R9,[R9];将相应的中断服务程序入口地址送R9
STR R9,[SP,#8];中断服务程序入口入棧
LDMFD SP! ,{R8-R9,PC};转向执行中断服务程序
中断服务程序运行完毕,则返回到标记出,回到原来断点继续执行(中断服务程序中已经完成了返回到BL后一条指令的操作)相当于发生了两级跳转!
如果采用向量中断模式,cpu发生异常或响应或中断源后,将转到硬件固有中断向量表,自动转入相应的一次或中断向量地址处执行。以ENIT 4567为例
0x30:LDR PC,=HANDLERENT4567
............
HANDLERENT4567:
HANDLER HANDLEEINT4567; HANDLEEINT4567为软件设定的中断向量中中断入口的地址标号
HANDLER 宏的作用:将HANDLEEINT4567的内容赋给PC
MACRO HANDLER HANDLELABEL
SUB SP,SP,#4
STMFD SP!,{R0}
LDR R0,=HANDLELABEL
LDR R0,[R0]
STR R0,[SP,#4]
LDMFD SP!,{R0,PC}
ENDM
中断及异常的响应过程
程序装在ROM中断中断和异常相应情况:
对于简单的应用系统,通常将初始化和应用程序下载在0x0处,即在ROM或flash中,在硬件固定向量表中断对应位置放置转移指令,转到相应异常或中断服务程序进行处理。
由于RAM区程序执行速度快,而且可以修改,所以对于大多数系统和复杂程序,通常将具体的异常或中断处理程序下载到RAM区执行。
程序装在高端RAM中断中断或异常响应
(1)
若程序下载到高端RAM,当异常中断发生时,S3C440B0X自动转到硬件固定向量表的歌地址处,所以需要在0x0开始的区域放置一个bootloader,它主要完成系统硬件初始化和地址映射工作。地址映射包含两部分,首先完成从0x0开始的固定向量表到0x0c000000(ram起始区,不同的系统不同)的转移,然后应用程序中的Isr_Init()函数完成到代码下载区RAM处的向量转移。
Bootloader地址映射:
在硬件固定表的各向量地址处放指令:ldr pc,=0x0000??,实现0x0000??->0x0c0000??的映射。
注意:若IRQ异常采用非向量模式,在开始地址区不必进行中断源的映射;复位异常发生,硬件初始化后,直接映射到代码下载区的0x0c008000处,并执行应用系统初始化。
(2)