作者:李柏章

几天前一个学生问我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发信号呢?上文中可以看到,是老板的客户,也可能是公安。这个事情就是由中断控制器来管理。

拿最简单的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中的中断号就是根据这个算法把每个中断算一下得来的。

还有子中断、外部中断,电平触发、边沿触发等,以后再谈。

作者介绍:本文由尚观科技老师和同学生(刘勇,孙贺,聂强,聂大鹏 ,牛须乐,孙磊)共同创作

ARM9nbsp;2410移植之ARM中断原理,…相关推荐

  1. 【转】ARM9 2410移植之ARM中断原理, 中断嵌套的误区,中断号的怎么来的

    from:https://www.crifan.com/switch_arm9_2410_transplant_arm_interrupt_principle_the_error_interrupt_ ...

  2. ARM9 2410移植之ARM中断原理, 中断嵌套的误区,中断号的怎么来的

    几天前一个学生问我ARM中断嵌套的问题,我才发现原在我心中理所当然的事对学生来说理解实属不易.      ARM有七种模式,我们这里只讨论SVC.IRQ和FIQ模式.      我们可以假设ARM核心 ...

  3. 同级中断可以嵌套吗_这可能是最通俗易懂的方式讲解ARM中断原理以及中断嵌套...

    几天前一个学生问我ARM中断嵌套的问题,我才发现原来在我心中理所当然的事对学生来说理解实属不易. ARM有七种模式,我们这里只讨论SVC.IRQ和FIQ模式. 我们可以假设ARM核心有两根中断引脚(实 ...

  4. 移植c语言算法到arm上,μCOS-II移植到ARM处理器上的几个要点

    原标题:μCOS-II移植到ARM处理器上的几个要点 本文主要介绍μCOS-II移植到ARM处理器上的几个要点,如下所示: uCOS II在ARM处理器上移植过程中的中断处理 uCOS II是一个源码 ...

  5. 嵌入式:ARM中断系统设计全解

    文章目录 一.ARM9的异常事件管理 二.ARM的中断原理 1. S3C2410的56个中断源 2. S3C2410中断处理的步骤 (1) 保存现场 (2) 模式切换 (3) 获取中断源 (4) 中断 ...

  6. Lua移植到arm上 并实现在arm上 可以让lua脚本调c语言,C语言调用lua脚本

    Lua移植到arm上 并实现在arm上 可以让lua脚本调c语言,C语言调用lua脚本 首先参考http://wiki.chumby.com/index.php?title=Lua&print ...

  7. arm中断保护和恢复_ARM中断返回的详细分析

    原标题:ARM中断返回的详细分析 在ARM体系中,通常有以下3种方式控制程序的执行流程: 1.在正常执行过程中,每执行一条ARM指令,程序计数器PC的值加4个字节:每执行一条Thumb指令,程序计数器 ...

  8. qt5.3.2移植到arm上出undefined reference to '__sync_sub_and_fetch_4的错

    qt5.3.2移植到arm上出undefined reference to '__sync_sub_and_fetch_4的错.解决办法如下, 使用工具:GCC4.4.1 QT源码:qt5.3.2 前 ...

  9. ARM中断返回地址详细分析

    ARM中断返回地址详细分析 在ARM体系中,通常有以下3种方式控制程序的执行流程: 1.在正常执行过程中,每执行一条ARM指令,程序计数器PC的值加4个字节:每执行一条Thumb指令,程序计数器PC加 ...

最新文章

  1. 三个优秀的语义分割框架 PyTorch实现
  2. java接口注入对象的意义_Java Web系列:Spring依赖注入基础
  3. Checkpoint IC_WEBCLIENT_PROCESS_CNTRL_DBG
  4. Grails动态下拉菜单
  5. 学java前要学css_教你一招:学习Java必须学会的CSS用法
  6. java打印三角形,菱形。任意边长大小
  7. 再问数据中台 - 数据中台是什么?
  8. 武汉科技大学城市学院计算机二级考试,湖北省计算机等级考试一年有几次报名...
  9. Px_ipc_name()函数
  10. tmux + zsh
  11. Linux常用命令之:软件安装命令
  12. Python数据分析学习系列 十四 数据分析案例
  13. Homegrown【翻译】
  14. 包装行业数智化采购管理系统提升企业采购效率,构筑智慧采购新生态
  15. Java基础 -> 线程池的底层⼯作原理
  16. NOIp2018停课集训总结
  17. 二叉平衡树(C++)
  18. 苹果xr怎么截屏_苹果怎么截图?教你各种iPhone机型截屏方法
  19. 一碗阳春面(一碗清汤荞麦面)
  20. 机器学习算法整理(六)— 贝叶斯算法_实现拼写检查器

热门文章

  1. 常用的 JS库 总结
  2. MySQL中出现 错误 2003Can‘t connect to MySQL server on‘localhost‘ (0)
  3. python entry.stringvar_tkinter entry widg中的StringVar()错误
  4. upload-labs通关学习笔记
  5. CF1311B. WeirdSort题解
  6. 新手必知:json、ajax、i8n
  7. 百度眼中的“地图世界”
  8. 网络信息通信的安全问题以及解决方法
  9. cat tail 正常,vi 中文乱码
  10. Linux命令之cat、tac、tail、head命令的使用