第六章-异常与中断的处理
2016-12-18 22:44
375 查看
第六章 异常与中断的处理
一.概述
微处理器控制I/O端口或部件的数据传送方式有2种:程序查询方式和中断方式。
程序查询方式是由微处理器周期性地执行一段查询程序来读取I/O端口或部件中状态寄存器的内容,并判断其状态,从而使微处理器与I/O端口或部件在进行数据、命令传送时保持同步。程序查询方式下效率非常低,因为微处理器要花费大量时间测试I/O端口或部件的状态。并且I/O端口或部件的数据也不能得到实时地处理。
中断方式是I/O端口或部件在完成了一个I/O操作后,产生一个信号给微处理器,这个信号叫做“中断请求”,微处理器响应这个请求信号,停止其当前的程序操作,而转向对该I/O端口或部件进行新的读/写操作,特点是实时性能好。
二.S5PV210的异常与中断
异常是处理外部异步事件的一种方法,当某个异常发生时,处理器将暂停正常运行的程序;在处理这个异常之前,处理器保留当前处理器状态以便在异常处理程序结束之后恢复原来程序运行。若有两个或更多异常同时发生,处理器将根据优先级来处理这些异常。
异常向量表与8种工作模式
并非一一对应。8种工作模式中的Supervisor和Abort各占用了两个表项,而User、System和Monitor没有任何关联表项,这是因为:
1) User模式是程序正常运行模式,不需要进行特殊的异常处理,不是异常模式,所以它没有占任何表项;
2) System是特权模式,但不是异常模式,所以也不需要占用任何表项,System与User完全共用寄存器,同时有能力进行模式切换(修改PSR寄存器的模式位),所以它是其它特权模式与User模式的交互桥梁;
3) 对于SecureMonitor模式来说,是安全模式,需要协处理器来启动该模块,方能工作。
在上表所示的处理器异常中,和中断有关的包括软中断异常、外部中断异常与快速中断异常。
三.SWI软中断异常
软中断是软件实现的中断,也就是程序运行时其他程序对它的中断。软中断与硬中断的区别有:
1) 软中断发生时间由程序控制,而硬中断发生时间随机;
2) 软中断是由程序调用发生的,而硬中断是由外设引发的。
SWI指令
SWI指令用于产生软中断,从用户模式变换到管理模式,CPSR保存到管理模式的SPSR中。
指令格式如下:SWI{cond} immed_24 ;immed_24为软中断号(服务类型)
使用SWI指令时,通常使用两种方法进行传递参数:
1) 指令中24位立即数指定用户请求的服务类型,参数通过通用寄存器传递。
2) 指令中的24位立即数被忽略,用户请求的服务类型有寄存器R0值决定,参数通过其他的通用寄存器传递。
SWI异常中断处理程序中,取出SWI立即数的步骤为:
1) 首先确定引起软中断的SWI指令是ARM指令还是Thumb指令,这可通过对SPSR访问得到;
2) 然后取得该SWI指令的地址,这可通过访问LR寄存器得到;
3) 接着读出指令,分解出立即数。
T_bit EQU 0X20
SWI_Handler
STMFD SP!,{R0-R3,R12,LR} ;现场保护
MOV R1, SP ;得到参数指针
MRS R0,SPSR ;读取SPSR
STMFD SP!,{R0} ;保存SPSR
TST R0,#T_bit
LDRNEH R0,[LR,#-2] ;若是Thumb指令,读取指令码(16位)
BICNE R0,#0XFF00 :取得Thumb指令的8位立即数
LDREQ R0,[LR,#-4] ;若是ARM指令,读取指令码(32位)
BICEQ R0,#0XFF000000 ;取得ARM指令的24位立即数
; R0保存SWI号,而R1保存堆栈内寄存器指针
BL C_SWI_Handler ; 调用中断处理函数
MSR spsr_cf, r0 ;恢复spsr
LDMFD SP!,{R0-R3,R12,PC}^ ;SWI异常中断返回
虽然第一级SWI处理函数(完成中断向量号的提取)必须用汇编语言完成,但具体的中断处理函数可以使用C语言来完成。例如上面所调用的C_SWI_Handler句柄。
四.IRQ中断与FIQ中断
ARM微处理器有IRQ中断和FIQ中断两种硬件中断,其响应的优先级不同。但处理步骤类似,包括:
1) 初始化微处理器中断有关的寄存器,开放中断。
2) I/O端口或部件完成数据操作后产生中断请求信号。
3) 当中断请求信号有效时,微处理器可能处在不可中断状态。等微处理器允许中断时保存当前状态,停止它现行的操作并开始进行中断源的识别。
4) 在识别出优先级最高的中断源后,微处理器转到对应的中断服务例程入口,并应答中断,I/O端口或部件收到应答信号后,撤消其中断请求。
5) 微处理器读入或写出数据,当中断服务例程结束后,返回到原来的被中断程序处继续执行。
1.中断源识别
ARM Cortex核提供给外部的中断请求信号线仅有IRQ和FIQ两根。因此,当有中断产生时,微处理器就必须通过一定的方式识别出是哪个中断源发来的请求信号,以便转向其对应的中断服务程序例程,这就是中断源的识别。
S5PV210芯片支持多达93个中断源以菊花链的方式连接在一起。
2. 中断优先级仲裁
若嵌入式系统中由多个中断源,则这些中断源必须要进行中断优先级的排列。所谓优先级,指的以下两层含义:
1) 若有2个及2个以上的中断源同时提出中断请求,微处理器先响应哪个中断源,后响应哪个中断源。
2) 若1个中断源提出中断请求,并得到响应后,又有1个中断源提出中断请求,后来的中断源能否中断前一个中断源的中断服务程序。
3. 中断控制器
S5PV210的中断控制器由四个向量中断控制器(VIC)组成,可以支持多达93个中断源以菊花链方式连接一起。
1) 支持93个向量IRQ中断;
2) 固定的硬件中断优先级;
3) 可编程中断优先级;
4) 支持硬件中断优先级屏蔽;
5) 可编程中断优先级屏蔽;
6) 产生IRQ与FIQ;
7) 产生软件中断;
8) 测试寄存器;
9) 原中断状态;
10) 中断请求状态;
11) 支持对限制访问特权模式。
五.中断相关寄存器
1. 中断状态寄存器VICnIRQSTATUS
2. 中断状态寄存器VICnIRQSTATUS
3. 中断源未决寄存器VICnRAWINTR
4. 中断选择寄存器VICnINTSELECT
5. 中断使能寄存器VICnINTENABLE
6. 向量地址寄存器VICnADDRESS
7. 向量地址寄存器组VICnVECTADDR[0~31]
8. 向量优先级寄存器VICnVECTPRIORITY
六.S5PV210的中断编程
1. 中断跳转流程
2. 中断编程步骤
1) 建立系统中断向量表,设置微处理器内核的程序状态寄存器CPSR中的F位和I位。一般情况下中断均需使用数据栈,因此还需建立用户数据栈。这一部分内容对应的程序指令,通常编写在系统引导程序中。
2) 设置各中断源的中断向量。通常需要利用向量地址寄存器来计算,若中断号还对应有子中断,需求出子中断地址偏移。
3) 中断控制初始化。主要是初始化微处理器内部的中断控制的寄存器。针对某个具体的中断源,设置其中断控制模式、中断是否屏蔽、中断优先级等。
4) 完成I/O端口或部件具体操作功能的中断服务程序。中断服务程序中,在返回之前必须清除现场,返回中断前的状态
程序实例见书本P139,实验指导书P82
一.概述
微处理器控制I/O端口或部件的数据传送方式有2种:程序查询方式和中断方式。
程序查询方式是由微处理器周期性地执行一段查询程序来读取I/O端口或部件中状态寄存器的内容,并判断其状态,从而使微处理器与I/O端口或部件在进行数据、命令传送时保持同步。程序查询方式下效率非常低,因为微处理器要花费大量时间测试I/O端口或部件的状态。并且I/O端口或部件的数据也不能得到实时地处理。
中断方式是I/O端口或部件在完成了一个I/O操作后,产生一个信号给微处理器,这个信号叫做“中断请求”,微处理器响应这个请求信号,停止其当前的程序操作,而转向对该I/O端口或部件进行新的读/写操作,特点是实时性能好。
二.S5PV210的异常与中断
异常是处理外部异步事件的一种方法,当某个异常发生时,处理器将暂停正常运行的程序;在处理这个异常之前,处理器保留当前处理器状态以便在异常处理程序结束之后恢复原来程序运行。若有两个或更多异常同时发生,处理器将根据优先级来处理这些异常。
异常向量表与8种工作模式
并非一一对应。8种工作模式中的Supervisor和Abort各占用了两个表项,而User、System和Monitor没有任何关联表项,这是因为:
1) User模式是程序正常运行模式,不需要进行特殊的异常处理,不是异常模式,所以它没有占任何表项;
2) System是特权模式,但不是异常模式,所以也不需要占用任何表项,System与User完全共用寄存器,同时有能力进行模式切换(修改PSR寄存器的模式位),所以它是其它特权模式与User模式的交互桥梁;
3) 对于SecureMonitor模式来说,是安全模式,需要协处理器来启动该模块,方能工作。
在上表所示的处理器异常中,和中断有关的包括软中断异常、外部中断异常与快速中断异常。
三.SWI软中断异常
软中断是软件实现的中断,也就是程序运行时其他程序对它的中断。软中断与硬中断的区别有:
1) 软中断发生时间由程序控制,而硬中断发生时间随机;
2) 软中断是由程序调用发生的,而硬中断是由外设引发的。
SWI指令
SWI指令用于产生软中断,从用户模式变换到管理模式,CPSR保存到管理模式的SPSR中。
指令格式如下:SWI{cond} immed_24 ;immed_24为软中断号(服务类型)
使用SWI指令时,通常使用两种方法进行传递参数:
1) 指令中24位立即数指定用户请求的服务类型,参数通过通用寄存器传递。
2) 指令中的24位立即数被忽略,用户请求的服务类型有寄存器R0值决定,参数通过其他的通用寄存器传递。
SWI异常中断处理程序中,取出SWI立即数的步骤为:
1) 首先确定引起软中断的SWI指令是ARM指令还是Thumb指令,这可通过对SPSR访问得到;
2) 然后取得该SWI指令的地址,这可通过访问LR寄存器得到;
3) 接着读出指令,分解出立即数。
T_bit EQU 0X20
SWI_Handler
STMFD SP!,{R0-R3,R12,LR} ;现场保护
MOV R1, SP ;得到参数指针
MRS R0,SPSR ;读取SPSR
STMFD SP!,{R0} ;保存SPSR
TST R0,#T_bit
LDRNEH R0,[LR,#-2] ;若是Thumb指令,读取指令码(16位)
BICNE R0,#0XFF00 :取得Thumb指令的8位立即数
LDREQ R0,[LR,#-4] ;若是ARM指令,读取指令码(32位)
BICEQ R0,#0XFF000000 ;取得ARM指令的24位立即数
; R0保存SWI号,而R1保存堆栈内寄存器指针
BL C_SWI_Handler ; 调用中断处理函数
MSR spsr_cf, r0 ;恢复spsr
LDMFD SP!,{R0-R3,R12,PC}^ ;SWI异常中断返回
虽然第一级SWI处理函数(完成中断向量号的提取)必须用汇编语言完成,但具体的中断处理函数可以使用C语言来完成。例如上面所调用的C_SWI_Handler句柄。
四.IRQ中断与FIQ中断
ARM微处理器有IRQ中断和FIQ中断两种硬件中断,其响应的优先级不同。但处理步骤类似,包括:
1) 初始化微处理器中断有关的寄存器,开放中断。
2) I/O端口或部件完成数据操作后产生中断请求信号。
3) 当中断请求信号有效时,微处理器可能处在不可中断状态。等微处理器允许中断时保存当前状态,停止它现行的操作并开始进行中断源的识别。
4) 在识别出优先级最高的中断源后,微处理器转到对应的中断服务例程入口,并应答中断,I/O端口或部件收到应答信号后,撤消其中断请求。
5) 微处理器读入或写出数据,当中断服务例程结束后,返回到原来的被中断程序处继续执行。
1.中断源识别
ARM Cortex核提供给外部的中断请求信号线仅有IRQ和FIQ两根。因此,当有中断产生时,微处理器就必须通过一定的方式识别出是哪个中断源发来的请求信号,以便转向其对应的中断服务程序例程,这就是中断源的识别。
S5PV210芯片支持多达93个中断源以菊花链的方式连接在一起。
2. 中断优先级仲裁
若嵌入式系统中由多个中断源,则这些中断源必须要进行中断优先级的排列。所谓优先级,指的以下两层含义:
1) 若有2个及2个以上的中断源同时提出中断请求,微处理器先响应哪个中断源,后响应哪个中断源。
2) 若1个中断源提出中断请求,并得到响应后,又有1个中断源提出中断请求,后来的中断源能否中断前一个中断源的中断服务程序。
3. 中断控制器
S5PV210的中断控制器由四个向量中断控制器(VIC)组成,可以支持多达93个中断源以菊花链方式连接一起。
1) 支持93个向量IRQ中断;
2) 固定的硬件中断优先级;
3) 可编程中断优先级;
4) 支持硬件中断优先级屏蔽;
5) 可编程中断优先级屏蔽;
6) 产生IRQ与FIQ;
7) 产生软件中断;
8) 测试寄存器;
9) 原中断状态;
10) 中断请求状态;
11) 支持对限制访问特权模式。
五.中断相关寄存器
1. 中断状态寄存器VICnIRQSTATUS
2. 中断状态寄存器VICnIRQSTATUS
3. 中断源未决寄存器VICnRAWINTR
4. 中断选择寄存器VICnINTSELECT
5. 中断使能寄存器VICnINTENABLE
6. 向量地址寄存器VICnADDRESS
7. 向量地址寄存器组VICnVECTADDR[0~31]
8. 向量优先级寄存器VICnVECTPRIORITY
六.S5PV210的中断编程
1. 中断跳转流程
2. 中断编程步骤
1) 建立系统中断向量表,设置微处理器内核的程序状态寄存器CPSR中的F位和I位。一般情况下中断均需使用数据栈,因此还需建立用户数据栈。这一部分内容对应的程序指令,通常编写在系统引导程序中。
2) 设置各中断源的中断向量。通常需要利用向量地址寄存器来计算,若中断号还对应有子中断,需求出子中断地址偏移。
3) 中断控制初始化。主要是初始化微处理器内部的中断控制的寄存器。针对某个具体的中断源,设置其中断控制模式、中断是否屏蔽、中断优先级等。
4) 完成I/O端口或部件具体操作功能的中断服务程序。中断服务程序中,在返回之前必须清除现场,返回中断前的状态
程序实例见书本P139,实验指导书P82
相关文章推荐
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】深入剖析Linux中断机制之三--Linux对异常和中断的处理
- ARM中断异常处理的返回
- ARM中断异常处理的返回
- ARM的SWI异常中断处理程序设计
- ARM中断异常处理的返回
- C/C++学习----第六章 异常处理
- S3C6410之uboot回炉再造(6)异常中断处理
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】深入剖析Linux中断机制之三--Linux对异常和中断的处理
- 关于s3c2410 中断异常处理
- 中断异常的处理
- s3c2410 中断异常处理
- ARM中断异常处理的返回
- s3c2410/s3c2440 中断异常处理--中断控制寄存器的角度
- s3c2410 中断异常处理
- ARM 异常中断处理
- 第六章:异常处理
- Arm异常中断返回时的处理
- 线程中断异常的处理 abort()
- 全面剖析《自己动手写操作系统》第六章--中断处理程序
- arm异常中断处理中pc指向何处