handle_level_irq 与handle_edge_irq 的区别【转】
转自:http://blog.csdn.net/xavierxiao/article/details/6087277
版权声明:本文为博主原创文章,未经博主允许不得转载。
Linux 里,
handle_level_irq
* Level type interrupts are active as long as the hardware line has
* the active level. This may require to mask the interrupt and unmask
* it after the associated handler has acknowledged the device, so the
* interrupt line is back to inactive.
当中断线电平达到激活电平,中断一直会被激活。 所以需要刚进中断处理函数就要屏蔽掉中断,
等handler 处理完后再打开中断(unmask)
Pesudo code
- handle_level_irq()
- {
- mask( irq );
- ack( irq );
- status |=IRQ_INPROGRESS;
- handle_IRQ_event();
- status &=~IRQ_INPROGRESS;
- unmask( irq );
- }
由于irq在整个处理过程中都被屏蔽,所以需要handle_level_irq里的action要尽量简短
handle_edge_irq
* Interrupt occures on the falling and/or rising edge of a hardware
* signal. The occurence is latched into the irq controller hardware
* and must be acked in order to be reenabled. After the ack another
* interrupt can happen on the same source even before the first one
* is handled by the assosiacted event handler. If this happens it
* might be necessary to disable (mask) the interrupt depending on the
* controller hardware. This requires to reenable the interrupt inside
* of the loop which handles the interrupts which have arrived while
* the handler was running. If all pending interrupts are handled, the
* loop is left.
中断发生在上升沿/下降沿, 它会被中断控制器锁存起来,需要ack 后才能重新使能。 Ack 后新的
中断可以在前一个中断正在被处理时产生,如果这种情况发生,则需要屏蔽中断。同时,需要用一个loop
来处理中断处理过程中又有中断产生的情况,在这个loop中重新把中断屏蔽打开。 如果所有pending的
中断都处理完了,loop就可以离开。
Pesudo code
- handle_edge_irq()
- {
- if( status & IRQ_INPROGRESS ) {
- status |= (IRQ_PENDING | IRQ_MASKED);
- mask();
- ack();
- return;
- }
- ack();
- status |= IRQ_INPROGRESS;
- do{
- if( status & (IRQ_PENDING | IRQ_MASKED ) )
- umask();
- handle_IRQ_event();
- }while( status & IRQ_PENDING );
- status &= ~IRQ_INPROGRESS;
- }
中断触发方式的比较
http://blog.21ic.com/user1/2662/archives/2007/37347.html
输入引脚(当作触发器的CLK) ----> 触发器------> 中断控制器
,当输入引脚的相应的沿到来时,就会将触发器置1,并触发中断,触发器会一直保持电平1除非在ISR中用一条语句清0,否则会不断的触发中断,这也就是每
次触发中断都要清0的原因。当有高优先级的中断运行后退出时,处理器检测到触发器的值为1,所以依然会进入中断服务程序。
缓冲器的作用就是对信号整形,并增加驱动能力,缓冲器输出的数据和输入的数据相同,可以看出输入引脚的电平直接放映到输出引脚,以高电平触发为例,只要输
入引脚的电平为高就立即触发中断,当ISR退出时如果电平依然为高则会再次触发中断,这也就是持续触发的来由,所以采用电平触发时必须保证电平的持续时间
不能太长,在ISR中可能需要适当的延时操作保证退出时电平为低,或者读出电平值,电平变低时才退出。 在带用
OS的系统中,很多关键的数据或者代码区(临界区)都需要关闭中断,那么它对中断有什么影响呢?
电平触发如果电平的持续时间比较短,很可能在关闭中断后再开中断之前电平已经变低,结果开中断后中断就没有触发,结果是这次中断被漏掉了,所以在带OS的
系统中一定不能关闭中断太久,在允许中断嵌套的情况下必须保证高优先级的中断执行时间不能超过电平的持续时间。
综合考虑,电平触发的持续时间不能太短也不能太长,在自己的系统中要仔细地考虑好中断地持续时间。
另外,开关中断也是很讲究的,在我的开发中我就发现一种“ISR优先级翻转现象”,比如我有三个ISR,按照优先级的高低次序一次是 ISR0
ISR1 ISR2,我在ISR3 关闭ISR0的中断(因为共享数据需要互斥),可知ISR3
运行时ISR0不能得到响应,然而ISR1的优先级高于ISR2,所以在支持嵌套的情况下ISR1会打断ISR2的执行,显然这时即使ISR0中断到来也
不会得到响应,这也就是我遇到的ISR优先级翻转问题,当然这可能是我编写程序的风格不好,但是分析起来也是很有趣的,类似于任务的优先级翻转。
handle_level_irq 与handle_edge_irq 的区别【转】的更多相关文章
- arm GIC介绍之四【转】
转自:https://blog.csdn.net/sunsissy/article/details/73882718 GIC是ARM体系中重要的组件,在认识到GIC的组成和功能之后,了解到IRQ的大致 ...
- 非常好!!!Linux源代码阅读——中断【转】
Linux源代码阅读——中断 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/2_int.html 目录 为什么要有中断 中断的作用 中断的处 ...
- 对中断的理解handle_level_irq【原创】
如下为本人原创,在解决问题的过程中的一点心得,如果有描述不准确的地方还请各位指出,非常感谢 Linux内核版本:linux-4.9.18 曾有一次调试触摸屏的时候遇到如下的问题 /startup/mo ...
- c#与java的区别
经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲... 一般C#多用于业务系统的开发 ...
- jquery和Js的区别和基础操作
jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...
- 【原】nodejs全局安装和本地安装的区别
来微信支付有2年多了,从2年前的互联网模式转变为O2O模式,主要的场景是跟线下的商户去打交道,不像以往的互联网模式,有产品经理提需求,我们帮忙去解决问题. 转型后是这样的,团队成员更多需要去寻找业务的 ...
- 探究@property申明对象属性时copy与strong的区别
一.问题来源 一直没有搞清楚NSString.NSArray.NSDictionary--属性描述关键字copy和strong的区别,看别人的项目中属性定义有的用copy,有的用strong.自己在开 ...
- X86和X86_64和X64有什么区别?
x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,ntel官方文档里面称为&qu ...
- Java中Comparable与Comparator的区别
相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...
随机推荐
- ping traceroute原理
ping命令工作原理 ping命令主要是用于检测网络的连通性. Ping命令发送一个ICMP请求报文给目的IP,然后目的IP回复一个ICMP报文. 原理:网络上的机器都有唯一确定的IP地址,我们给目标 ...
- Java InputStream转File
文件处于磁盘上或者流处于内存中 在输入流有已知的和预处理的数据时,如在硬盘上的文件或者在流处于内存中.这种情况下,不需要做边界校验,并且内存容量条件允许的话,可以简单的读取并一次写入. InputSt ...
- Java调用WebService之Axis实现
import org.apache.axis.client.Call; import org.apache.axis.client.Service; /** * @ClassName: TestAxi ...
- javaBean默认接受request发送过来的数据,根据键自动设置属性
javaBean默认接受request发送过来的数据,根据键自动设置属性
- BZOJ 1509 逃学的小孩(树的直径)
题意:从树上任找三点u,v,w.使得dis(u,v)+min(dis(u,w),dis(v,w))最大. 有一个结论u,v必是树上直径的两端点. 剩下的枚举w就行了. 具体不会证... # inclu ...
- 【bzoj5049】[Lydsy九月月赛]导航系统 并查集+双向BFS最短路
题目描述 给你一张 $n$ 个点 $m$ 条边的随机图,边权为1.$k$ 次询问两点间最短路,不连通则输出-1. 输入 第一行包含3个正整数n,m,k(2<=n<=100000,1< ...
- hadoop 使用map将SequenFile里的小文件解压出来
上例中将HDFS里小文件通过mapper压缩到一个文件中,本例将这些小文件解压出来. mapreduce可以按SequenceFile的key进行分片. 1.mapper public class M ...
- Unity游戏开发技术的最佳实践
活动详情 作为全球规模最大的Unity开发者聚会,历年的Unite大会都成为开发者们获取Unity最新技术知识,交流开发经验,把握行业发展脉搏,体验全球前沿科技与高品质Made with Unit ...
- Python 编程实战提高测试工作效率实例之svn 文件管理
#coding=utf-8 ''' Created on 2016年8月22日 @author:Tom Gao ''' importre importos importtime "" ...
- HUD.2544 最短路 (Dijkstra)
HUD.2544 最短路 (Dijkstra) 题意分析 1表示起点,n表示起点(或者颠倒过来也可以) 建立无向图 从n或者1跑dij即可. 代码总览 #include <bits/stdc++ ...