ARM的中断处理过程

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 。这种格式是调用一种宏定义,目的是保护现场,跳到中断服务程序。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值