几天前一个学生问我ARM中断嵌套的问题,我才发现原来在我心中理所当然的事对学生来说理解实属不易。 

ARM有七种模式,我们这里只讨论SVC、IRQ和FIQ模式。 

我们可以假设ARM核心有两根中断引脚(实际上是看不见的),一根叫 irq pin, 一根叫fiq pin。在ARM的cpsr中,有一个I位和一个F位,分别用来禁止IRQ和FIQ。

先不说中断控制器,只说ARM核心。正常情况下,ARM核都只是机械地随着pc的指示去做事情,当CPSR中的I和F位为1时,IRQ和FIQ全部处于禁止状态。无论你在irq pin和fiq pin上面发什么样的中断信号,ARM不会理你,你根本不能打断它,因为它“耳聋”,"眼瞎"了。

当I位和F位为0时,irq pin上有中断信号过来时,就会打断arm的当前工作,并且切换到IRQ模式下,跳到相应的异常向量表(vector)位置去执行代码。这个过程是自动的,但是返回到被中断打断的地方就得您亲自动手。

当你跳到异常向量表,处于IRQ的模式的时候,此时如果irq pin上面又来中断信号,此时ARM是不会理你的,irq pin就像秘书,ARM核心就像老板,老板本来在做事,然后来了一个客户,秘书打断它,让客户进去。而此时再来一个客户,要么秘书不断去敲门问,要么客户走人。老板第一个客户没有会见完,不会理你。 

但是有一种情况例外,当ARM处在IRQ模式,这个时候fiq pin来了一个中断信号,fiq pin是什么?快速中断,好比公安局的来查刑事案件,才不管老板是不是在会见客户,直接打断,进入到fiq模式,跳到相应的fiq的异常向量表处去执行代码。那如果当ARM处理FIQ模式,fiq pin又来中断信号,也就是又一批公安来了,那没戏,都是执法人员,你打不断我。如果此时irq pin来了呢?来了也不理,正在办案,还敢来妨碍公务。 



所以得出一个结论: IRQ模式只能被FIQ模式打断,FIQ模式下谁也打不断

在打不断的情况下,irq pin 或fiq pin随便你怎么发中断信号,都是白发。 

所以除了fiq能打断irq以外,根本没有所谓中断嵌套的情况

但是再怎么说irq pin 和fiq pin加起来也就2根引脚,这么多中断源,怎么办呢?不可能谁来了都直接敲门吧。 

接下来该说谁来给irq pin或者 fiq pin发信号。从上文可以看到,可能是老板客户,也可能是公安。在ARM中,这个事情由中断控制器管理。 

拿最简单的2410/2440的中断控制器举例,中断控制器加一个子中断控制器,还有一个外部中断控制器管理了50多个中断资源,说穿了有50多个脚。这些脚除了外部中断都是规定了功能的,比如WDT、LCD、DMA等,这个功能不能改,因为2410/2440内部硬件连线已经决定了。 

当WDT和DMA中断都到来时,会被送到SRCPND寄存器中,两个中断都在里面,到底把哪一个送给ARM呢?这个时候先看INTMOD,也就是中断模式寄存器:哪个中断被设置成快速中断,哪个就被送上去;如果两个都被设置为快速中断呢?这不可能,因为同一时间只能有一个中断可以被设成快速中断。所以,如果有快速中断,这个时候直接给fiq pin发中断信号,打断ARM。 

要是没有快速中断呢,这个时候就看INTMSK,看WDT和DMA有没有被屏蔽,如果DMA在INTMSK被屏蔽,只有WDT继续向上送,如果都没有屏蔽,那么他们两个同时进入优先级寄存器PRIORITY,在这里根据优先级设置,一定会分出一个高一个低的优先级出来,优先级高的那个被送到INTPND寄存器,所以INTPND随时随地有且只有一个中断在里面。只要INTPND里面有中断,irq pin就不会一直不断给ARM发中断信号,当第一次发的时候,中断了ARM,这个时候ARM进入相应的异常向量并处于IRQ模式。

此时,INTPND仍然不断的通过irq pin向ARM发中断信号,但是此时ARM已经处于IRQ模式,不会理睬你。当你中断处理完,要退出IRQ模式,这个时候要小心,如果退出IRQ模式之前不清除INTPND里面的中断位,刚退出IRQ模式,又会被中断,因为INTPND一直在发中断信号。所以在退出IRQ模式前一定要清除INTPND里面的中断位

光清除INTPND里面的位还不行,因为SRCPND里面WDT和DMA的中断在,当你刚清除完INTPND,结果SRCPND里面又选了一个中断出来送到INTPND里面。所以正确的处理方法是退出IRQ模式之前,先清除SRCPND里相应的中断位,再清除INTPND里相应的位。请注意,SRCPND里面可能有多个位,所以清除你已处理过的中断就行,而INTPND里面只可能有一位,直接清掉即可。

再说说Linux的情况。Linux不用FIQ,只用到了IRQ。但是我们有时候一个中断需要处理很长时间,我们需要占用IRQ模式那么长的时间吗?不需要,linux在IRQ模式下只是简单的记录是什么中断,马上切换回SVC模式,换句话说,linux的中断处理都是在SVC模式下处理的。

那么中断号是怎么来的呢?它在ARM上固定死了,相应的中断号只有一个办法得到:查询irqs.h 。先用一个中断号注册一个中断处理程序,当中断发生的时候,Linux怎么知道是我这个中断号发生的中断呢?在处理中断的时候,先读取INTPND,根据需要再读取EINTPEND或SUBSRCPND计算出一个中断号,相应的处理算法在get_irq_nr_base这个宏中。irqs.h中的中断号就是根据这个算法把每个中断号算出来的。

可能是讲解ARM中断和中断嵌套最通俗易懂的文章的更多相关文章

  1. 软中断与硬中断 & 中断抢占 中断嵌套

    参考了这篇文章:http://blog.csdn.net/zhangskd/article/details/21992933 从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通 ...

  2. ARM学习篇 中断定时理解

    1. 中断控制器 a. 中断处理流程 P1--摘自S3C2440A手册 P1简要阐述了S3C2440A内置中断控制器处理中断的流程: ●​若某中断有自中断,则先接收子中断请求,否则,直接接受源中断. ...

  3. linux内核分析笔记----中断和中断处理程序【转】

    转自:http://www.cnblogs.com/hanyan225/archive/2011/07/17/2108609.html 中断还是中断,我讲了很多次的中断了,今天还是要讲中断,为啥呢?因 ...

  4. linux内核分析笔记----中断和中断处理程序

    中断还是中断,我讲了很多次的中断了,今天还是要讲中断,为啥呢?因为在操作系统中,中断是必须要讲的.. 那么什么叫中断呢, 中断还是打断,这样一说你就不明白了.唉,中断还真是有点像打断.我们知道linu ...

  5. (转) 中断处理程序&中断服务例程

             关于中断处理程序和中断服务例程ISR的区别及联系,之前一直搞混,今天抽时间将两者关系弄弄清楚.ok,下面进入主题.       首先中断处理程序(Interrupt Handler) ...

  6. 为什么ARM的frq中断的处理速度比较快

    FRQ向量位于异常向量表的最末端,不需要跳转就可以直接执行后面跟随的异常处理程序:FRQ模式中私有寄存器数量最多,在进行异常处理时不需要对这些寄存器进行压栈保存.

  7. GD32 ------ 使用外部中断,中断函数需要延时才能读到真正电平

    MCU:GD32F103RCT6 中断引脚没有外界上拉电阻 中断配置如下: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFI ...

  8. 【黑金ZYNQ7000系列原创视频教程】06.ZYNQ来自FPGA的中断——按键中断实验

    黑金论坛地址: http://www.heijin.org/forum.php?mod=viewthread&tid=36640&extra=page%3D1 爱奇艺地址: http: ...

  9. 最近发现了一篇讲解Vue的虚拟DOM,diff很棒的文章,特定记录转载一下

    本文章是转载的,为了方便以后复习,特地记录一下.他人请去原地址观看!!! 文章原地址:https://blog.csdn.net/m6i37jk/article/details/78140159 作者 ...

随机推荐

  1. asp.net mvc 动态编译生成Controller

    做网站后台管理系统的时候,有时我们需要根据用户的录入配置动态生成一些频道,这些频道需要用到独立的Controller,这时就需要用到运行时动态编译了.代码如下: using System.Web.Mv ...

  2. WeQuant交易策略—RSI

    RSI指标策略 策略介绍 RSI(相对强弱指标),是通过一段时期内的平均收盘上涨和下跌数,计算价格上涨所产生的波动占整个波动的百分比,来分析市场买卖盘的意向和实力. 计算公式(以日为单位举例) RSI ...

  3. 安全终端模拟工具Xshell 5使用密钥认证登录配置详细教程

    ▲版权声明:本文为博主原创文章,未经博主允许不得转载. Xshell支持SSH1 / SSH2协议,密码和DSA / RSA公钥用户认证方式等各种安全功能,并对各种加密算法进行加密.使用内置的Xshe ...

  4. 线性代数-矩阵-【4】点乘 C和C++的实现

    点击这里可以跳转至 [1]矩阵汇总:http://www.cnblogs.com/HongYi-Liang/p/7287369.html [2]矩阵生成:http://www.cnblogs.com/ ...

  5. java面向对象(二)之继承

    继承 介绍 继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力.继承即常说的is-a关系.子类继承父类的特征和行为,使得子类具有父类的各种属性和方法.或子类从父类继承 ...

  6. SQL 软解析和硬解析详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt329 当客户端进程,将SQL语句通过监听器发送到Oracle时, 会触发一个 ...

  7. HTML转义字符串

    HTML字符实体(Character Entities),转义字符串(Escape Sequence) 为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,> ...

  8. Ubuntu16.04下安装texlive

    Ubuntu 16.04下安装texlive的步骤如下: 1.下载texlive 打开终端输入:sudo apt-get install texlive-full  #下载这一过程会持续10-20分钟 ...

  9. Charles 抓包

    声明:本文为依依Love博主原创文章,未经博主允许不得转载   1. 简介: 2. 安装包下载: 3. 安装并替换破解版的jar包 4.设置mac代理 5.  安装证书: 6.  设置手机抓包     ...

  10. 即时作图新工具—ProcessOn【推荐】

    www.processon.com 推荐这个在线作图网站:免费登录,云端存储,面向对象,最重要的是提供了丰富模板! 在线软件的人气会越来越高,这是趋势啊~