博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
中断触发方式的比较(转载)
阅读量:4964 次
发布时间:2019-06-12

本文共 1310 字,大约阅读时间需要 4 分钟。

                                                                                    
中断触发方式的比较
      在前后台系统或者带有OS的系统,中断处理程序是相对比较难的,对系统的性能影响比较大。在带有OS的系统中,中断作为一个异步事件,还可以引发任务调度。在带有OS的系统中我们经常会关闭中断,而在ISR中我们常常也需要关闭一些中断,关闭中断如果处理得不好,很可能会出现很多想不到的结果,所以处理好中断非常的 关键。
      在这里对中断的触发方式进行介绍,不同的触发方式应用场合是不同的。一般中断分为电平触发和沿触发两种方式。
    沿触发: 这是很最常见的触发方式,我们可以用数字电路的方法来解释它的特性。沿触发应该应触发器来描述:  输入引脚(当作触发器的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优先级翻转问题,当然这可能是我编写程序的风格不好,但是分析起来也是很有趣的,类似于任务的优先级翻转。
    编写ISR一般要求尽可能的简短,网上有不少这方面的资料吧,这里就不罗嗦了。
转载自:

转载于:https://www.cnblogs.com/sql4me/archive/2009/09/29/1576216.html

你可能感兴趣的文章
ORACLE常用数值函数、转换函数、字符串函数
查看>>
IAAS、SAAS 和 PAAS 的区别、理解
查看>>
Java RMI详解
查看>>
idea设置条件断点
查看>>
6.【应急响应】Linux入侵排查思路
查看>>
windows32位系统 安装MongoDB
查看>>
C#中的扩展类的理解
查看>>
TypeScript--函数
查看>>
【转】谷歌大数据的三篇论文
查看>>
第三章编程练习题3.1
查看>>
删除重复数据只保留一条
查看>>
排序之快速排序(上)
查看>>
计算机端口大全
查看>>
如何使用BHO定制你的Internet Explorer浏览器
查看>>
Android中用文件初始化sqlite 数据库的文(一) (转)
查看>>
手写简化版SpringBoot
查看>>
Ruby 装pg的坑
查看>>
.NET泛型解析(上)
查看>>
(asp.net MVC学习)System.Web.Mvc.HtmlHelper学习及使用
查看>>
C# 给某个方法设定执行超时时间
查看>>