ARM的中断处理过程
2009-08-10 17:59
330 查看
1.
首先就是知道
ARM
状态下的通用寄存器和程序计数器,绿颜色的就是相应模式下的私有寄存器。
就是说程序一般运行在系统和用户模式下,使用的是系统和用户模式下的通用寄存器,当有异常发生时,比如
FIQ
,那么系统将切换到
FIQ
模式下,相应的就会采用
FIQ
模式下的寄存器,其中绿颜色的就是只在
FIQ
模式下才会用到的寄存器。
2.
在模式切换的过程中,要保护系统和用户模式下的通用寄存器状态,以便在异常处理完成之后程序能正常返回。因为
FIQ
模式下
R8-R14
为其私有寄存器,所以切换的过程中,系统和用户模式下的通用寄存器的
R8-R14
就不用保护了,所以减少了对寄存器存取的需要,从而可以快速的进行
FIQ
处理,故称为
FIQ
。
3.
异常处理的动作
。当然这都是内核自己干的。以
FIQ
为例。
当系统进入
FIQ
模式时
,
第一,将原来执行程序的下一条指令地址保存到
LR
中,就是将
R14
保存到
R14_fiq
里面。
第二,拷贝
CPSR
到
SPSR_fiq
。
第三,改变
CPSR
模式位的值,改到
FIQ
模式。
第四,改变
PC
值,将其指向异常处理向量所指的下一条指令。
离开异常处理的时候
,
第一,将
LR
(
R14_fiq
)赋给
PC
。
第二,将
SPSR
(
SPSR_fiq
)拷贝到
CPSR
。
第三,清除中断禁止标志(如果开始时置位了)。
4
.异常中断向量
异常中断的向量地址
地址
异常中断类型
入口时处理器的操作模式
0x00000000
复位
超级用户
0x00000004
未定义指令
未定义
0x00000008
软件中断
超级用户
0x0000000c
中止(预取指)
中止
0x00000010
中止(数据)
中止
0x00000014
保留
保留
0x00000018 I
RQ IRQ
0x0000001c FIQ
FIQ
异常中断优先级
中断
优先级
复位
最高
数据异常
FIQ
IRQ
预取指异常中断
未定义指令和软件中断
最低
5
.当发生
IRQ
中断时
第一
,模式进入到
IRQ
里面。
第二
,
PC
跳到
0x00000018
处运行。因为这是
IRQ
的中断入口。
第三
,
通过
0x00000018
:
LDR
PC, IRQ_ADDR
。跳转到相应的中断服务程序。这个里面就有个确定哪个中断源的问题了。那就有优先级的问题了。每个中断源会有自己的中断服务程序。
第四
,得到中断源有硬件实现和软件处理两种方式。比如
LPC21XX
的就是利用硬件方式,为了利用向量中断控制器的优点,
IRQ
中断向量入口处代码做了修改,变成
0x00000018
:
LDR
PC, [PC, #-0xff0]
。
这条指令从内存映射地址
0xfffff030
处获得数据装载到
PC
,这样就能够直接从硬件中获得中断源。这样就减少了中断延迟
。记得,三星的
S3C44B0
好象采用的是用软件确定中断源,因此要建立中断向量表。好久不用了,记不清了。
第五
,得到中断源,就知道要跳到哪个中断服务程序去了。
一般都是这么定义的。
Timer0_Handler
HANDLER
Timer0
。这种格式是调用一种宏定义,目的是保护现场,跳到中断服务程序。
首先就是知道
ARM
状态下的通用寄存器和程序计数器,绿颜色的就是相应模式下的私有寄存器。
就是说程序一般运行在系统和用户模式下,使用的是系统和用户模式下的通用寄存器,当有异常发生时,比如
FIQ
,那么系统将切换到
FIQ
模式下,相应的就会采用
FIQ
模式下的寄存器,其中绿颜色的就是只在
FIQ
模式下才会用到的寄存器。
2.
在模式切换的过程中,要保护系统和用户模式下的通用寄存器状态,以便在异常处理完成之后程序能正常返回。因为
FIQ
模式下
R8-R14
为其私有寄存器,所以切换的过程中,系统和用户模式下的通用寄存器的
R8-R14
就不用保护了,所以减少了对寄存器存取的需要,从而可以快速的进行
FIQ
处理,故称为
FIQ
。
3.
异常处理的动作
。当然这都是内核自己干的。以
FIQ
为例。
当系统进入
FIQ
模式时
,
第一,将原来执行程序的下一条指令地址保存到
LR
中,就是将
R14
保存到
R14_fiq
里面。
第二,拷贝
CPSR
到
SPSR_fiq
。
第三,改变
CPSR
模式位的值,改到
FIQ
模式。
第四,改变
PC
值,将其指向异常处理向量所指的下一条指令。
离开异常处理的时候
,
第一,将
LR
(
R14_fiq
)赋给
PC
。
第二,将
SPSR
(
SPSR_fiq
)拷贝到
CPSR
。
第三,清除中断禁止标志(如果开始时置位了)。
4
.异常中断向量
异常中断的向量地址
地址
异常中断类型
入口时处理器的操作模式
0x00000000
复位
超级用户
0x00000004
未定义指令
未定义
0x00000008
软件中断
超级用户
0x0000000c
中止(预取指)
中止
0x00000010
中止(数据)
中止
0x00000014
保留
保留
0x00000018 I
RQ IRQ
0x0000001c FIQ
FIQ
异常中断优先级
中断
优先级
复位
最高
数据异常
FIQ
IRQ
预取指异常中断
未定义指令和软件中断
最低
5
.当发生
IRQ
中断时
第一
,模式进入到
IRQ
里面。
第二
,
PC
跳到
0x00000018
处运行。因为这是
IRQ
的中断入口。
第三
,
通过
0x00000018
:
LDR
PC, IRQ_ADDR
。跳转到相应的中断服务程序。这个里面就有个确定哪个中断源的问题了。那就有优先级的问题了。每个中断源会有自己的中断服务程序。
第四
,得到中断源有硬件实现和软件处理两种方式。比如
LPC21XX
的就是利用硬件方式,为了利用向量中断控制器的优点,
IRQ
中断向量入口处代码做了修改,变成
0x00000018
:
LDR
PC, [PC, #-0xff0]
。
这条指令从内存映射地址
0xfffff030
处获得数据装载到
PC
,这样就能够直接从硬件中获得中断源。这样就减少了中断延迟
。记得,三星的
S3C44B0
好象采用的是用软件确定中断源,因此要建立中断向量表。好久不用了,记不清了。
第五
,得到中断源,就知道要跳到哪个中断服务程序去了。
一般都是这么定义的。
Timer0_Handler
HANDLER
Timer0
。这种格式是调用一种宏定义,目的是保护现场,跳到中断服务程序。
相关文章推荐
- ARM中断处理过程
- Linux内核中断处理过程分析-基于arm平台
- ARM 中断处理过程
- Linux内核中断处理过程分析-基于arm平台
- Linux中断 - ARM中断处理过程
- ARM异常---一个Uart中断的触发处理过程:
- Linux kernel的中断子系统之(六):ARM中断处理过程
- ARM中断处理过程
- ARM linux的中断处理过程
- Linux kernel的中断子系统之(六):ARM中断处理过程
- ARM中断处理过程
- ARM中断处理过程
- ucOS-II基于ARM920T的中断处理过程
- Linux kernel的中断子系统之(六):ARM中断处理过程
- ARM中断异常处理的返回
- 分析system_call中断处理过程
- 《Linux内核分析》第五周:分析system_call中断处理过程
- linux 中断机制的处理过程
- 网易公开课《Linux内核分析》学习心得-分析system_call中断处理过程
- 分析system_call中断处理过程