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都 ...
随机推荐
- wpf拖拽
简单拖拽的实现是,实现源控件的MouseDown事件,和目标控件Drop事件.调用DragDrop.DoDragDrop()以启动拖放操作,DragDrop.DoDragDrop()函数接受三个参数: ...
- HUAS 1477 经营与开发(贪心)
考虑DP,令dp[i][j][k]当前在第i个星球,用了j次维修,k次开采后所获得的最大价值.复杂度为O(n^3).超时 如果我们发现,对于初始时能力值为w所能产生的最大价值y,初始时能力值为1所能产 ...
- NOI 97 (Vijos 1464)积木游戏(DP)
很普通的DP,设dp[i][j][k]为第i块积木放在第j堆且摆放状态为k的最高高度.方程很容易推出. # include <cstdio> # include <cstring&g ...
- 【bzoj2834】回家的路 分层图最短路
题目描述 输入 输出 样例输入 2 1 1 2 1 1 2 2 样例输出 5 题解 分层图最短路 dis[i][0]表示到i为横向时起点到i的最短路,dis[i][1]表示到i为纵向时起点到i的最短路 ...
- 编写高效Lua代码的方法
编写高效Lua代码的方法 翻译自<Lua Programming Gems>Chapter 2:Lua Performance Tips:Basic fact By Roberto Ier ...
- Android 通知机制 Toast和Notification
Android常用的反馈系统状态信息的方式主要有三种 Toast提醒 通知栏提醒 对话框提醒 三种提醒分别适用于页面的提示.系统交互事件的通知和非常重要的提醒: 一.Toast Toast toast ...
- POJ3977:Subset——题解(三分+折半搜索)
http://poj.org/problem?id=3977 题目大意:有一堆数,取出一些数,记他们和的绝对值为w,取的个数为n,求在w最小的情况下,n最小,并输出w,n. ————————————— ...
- POJ3690:Constellations——题解
http://poj.org/problem?id=3690 题目大意:给一个图和几个子图,判断有多少种子图在原图出现过. —————————————————————— 二维哈希即可,操作看代码,我觉 ...
- BZOJ2654 & 洛谷2619:tree——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=2654 https://www.luogu.org/problemnew/show/P2619 给你 ...
- BZOJ2425:[HAOI2010]计数——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=2425 https://www.luogu.org/problemnew/show/P2518 你有 ...