ARM+Linux中断系统详细分析

原文地址:ARM+Linux中断系统详细分析 作者:leon_yu

ULK第四章里明确讲到“Linux实现了一种没有优先级的中断模型”,并且“Linux中断和异常都支持嵌套”。这个我不太理解了,这两种说法都与我以前的理解刚好相反,核对了原书,翻译没有错。

Linux中断系统到底是否支持优先级,可否嵌套,中断号又是怎么来确定的,中断产生时又是如何一步步执行到中断处理函数的。为了彻底搞懂Linux中断系统,我决定从最原始材料出发,一探究竟。(s3c2440+linux2.6.21

先来看看ARM的硬件执行流程

异常是ARM处理器模式分类ARM有七种运行模式USR,SYS,SVC,IRQ,FIQ,UND,ABT

五种异常模式:SVC,IRQ,FIQ,UND,ABTARM+Linux中断系统详细分析

中断模式是ARM异常模式之一(IRQ模式,FIQ模式),是一种异步事件,如外部按键产生中断,内部定时器产生中断,通信数据口数据收发产生中断等。

1.当一个异常产生时,以FIQ为例,CPU切入FIQ模式时,

①将原来执行程序的下一条指令地址保存到LR中,就是将R14保存到R14_fiq里面。

②拷贝CPSRSPSR_fiq

③改变CPSR模式位的值,改到FIQ模式。

④改变PC值,将其指向相应的异常处理向量表。

离开异常处理的时候,

①将LRR14_fiq)赋给PC

②将SPSRSPSR_fiq)拷贝到CPSR

③清除中断禁止标志(如果开始时置位了)。

ARM一般在某个固定地址中有一个异常向量表,比如0x0

ARM+Linux中断系统详细分析

当一个外部IRQ中断产生时

①处理器切换到IRQ模式

PC跳到0x18处运行,因为这是IRQ的中断入口。

③通过0x18LDR PC, IRQ_ADDR,跳转到相应的中断服务程序。这个中断服务程序就要确定中断源,每个中断源会有自己独立的中断服务程序。

④得到中断源,然后执行相应中断服务程序

⑤清除中断标志,返回

ARM+Linux中断系统详细分析

这就是一个外部中断完整的执行流程了,下面以具体寄存器来更具体的了解ARM的中断机制。

假设ARM核有两个中断引脚,一根是irq pin,一根是fiq pin,正常情况下,ARM核只是机械地随着PC指示去执行,当CPSR中的I位和F位都为1时,IRQFIQ都处于禁止状态,这时候无论发什么信号,ARM都不会理睬。

I位或F位为0时,irq pin有中断信号过来时,ARM当前工作就会被打断,切换到IRQ模式,并且跳转到异常向量表的中断入口0x18SRCPND中相应位置1,经过检查中断优先级寄存器以及屏蔽寄存器,确定中断源,INTPND相应位置1(经过仲裁,只有一位置1),这过程由ARM自动完成。0x18存放的是总的中断处理函数,在这个函数里,可以建立一个二级中断向量表,先清除SRCPND相应位,然后根据中断源执行相应中断服务程序,清除INTPND,返回。

及时清除中断 Pending 寄存器的标志位是为了避免两个问题:①发生中断返回后,立即又被中断,不断的重复响应②丢失中断处理过程中发生的中断,返回后不响应。

在某个IRQ中断程序执行过程中,有另外一个外部IRQ中断产生,会将SRCPND相应位置1,等该中断服务执行完,经过仲裁决定下一个要响应的中断。但是假如当产生的是FIQ,则保存当前IRQ的现场,嵌套响应FIQFIQ服务程序执行完,再继续执行IRQ服务。那么当一个FIQ正在服务,产生另外一个FIQ,会怎样呢,答案是不会被打断,跟IRQ一样等当前中断服务完成,再仲裁剩余需要相应的中断。

所以得出这样的结论:

关于中断嵌套:IRQ模式只能被FIQ模式打断,FIQ模式下谁也打不断。

关于优先级:ARM核对中断优先级,有明确的可编程管理。

 

下面再来看看LinuxARM是怎么处理的,但记住一个前提:LinuxARM的硬件特性可以取舍,但不可更改。

1.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值