edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3152回复:24

一个驱动程序可以拥有多个中断吗?

楼主#
更多 发布于:2002-10-22 10:16
如果可以的话,是不是也得有多个ISR与之相对应?那么DPC也是这样了?可是各个ISR是如何协调的呢?比如当前ISR正在执行,另一个ISR被触发了该怎么办?

最新喜欢:

hapihapi
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-10-22 12:27
我自己来回答吧,我觉得是可以的,可以自己来维护一个CustomDPC,让每一个ISR都被排队进DPC里面,然后在CustomDPC里面同一处理。不知道这样行吗?
guoj
驱动小牛
驱动小牛
  • 注册日期2001-04-02
  • 最后登录2014-02-14
  • 粉丝3
  • 关注0
  • 积分15分
  • 威望55点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-10-22 12:37
WINDOWS的VMM不就是把硬件中断,软件中断等进行了统一处理,然后,判断是硬件中断,就调VPICD进行处理吗。
guoj
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-10-22 19:11
肯定的告诉你,可以。 :D
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-10-22 19:15
一个字:完全可以
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
guoj
驱动小牛
驱动小牛
  • 注册日期2001-04-02
  • 最后登录2014-02-14
  • 粉丝3
  • 关注0
  • 积分15分
  • 威望55点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-10-23 08:59
明明是,四个字,一句话嘛。
guoj
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-10-23 11:43
嗨,楼上的各位兄弟,既然可以,那后面的问题呢?也就是如何协调的问题!你们回答了可以,就跑了,也太那个了嘛》》》》 :D
minsoft
驱动小牛
驱动小牛
  • 注册日期2001-07-30
  • 最后登录2007-03-06
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-10-24 09:43
至于ISR,可以有两个不同的也可以共用一个,由IoConnectInterrupt决定,共用时在ISR中通过读硬件状态寄存器以于区别是哪个中断就行了。
至于DPC,也可以共用一个或有独立的两个。如果共用一个,在两个ISR中调用IoRequestDpc来申请DPC处理,如果不共用,其中一个得自己调用KeInitializeDpc初始化一个DPC,在ISR中调用KeInsertQueueDpc来排队DPC。我就这么做的,事实证明是成功的。
ISR和DPC的协调,操作系统根据IRQL来决定,如果你的两个ISR或DPC之间需要共享某些资源,那取最高的那个中断的IRQL,用KeAcquireSpinLock来同步。
少了e,就少了全部
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-10-24 16:12
一个字:绝!(这才是真的一个字!) :)
让我茅舍顿开,只是还有一点:如果高优先级的中断正在执行,低优先级的中断来了,那么该低优先级的中断的DPC是不是会丢失?
另外:假设只有一个ISR,有两个DPC的情况。

其中一个用IoRequestDpc()来调用DPC;

另一个用KeInsertQueueDpc来排队DPC,可是我如何来执行我的DPC呢?不知道可以用什么函数来实现?也就是说在ISR里面排完队以后,再调用一个函数,可以直接触发另一个函数(就象IoRequestDpc()触发DPCforISR一样),而这个函数也运行于DISPATCH_LEVEL?
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-10-25 16:06
minsoft,今天一直等你解答我的问题,可是毫无回音,嘿嘿 :D :cool: :cool: :cool:
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-10-25 21:57
呵呵!这个问题想很好的弄清楚的!建议你看看那本WINDOW 2000内幕揭密吧
lan2
驱动牛犊
驱动牛犊
  • 注册日期2002-04-20
  • 最后登录2011-07-01
  • 粉丝0
  • 关注0
  • 积分82分
  • 威望29点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-10-26 00:51
Mark 在他的站点上有篇 Advance DPC, 不知
能不能给你点启发
minsoft
驱动小牛
驱动小牛
  • 注册日期2001-07-30
  • 最后登录2007-03-06
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-10-26 12:59
很抱歉,几天没来。
如果只有一个中断一个DPC,而中断间隔时间很短的话,有可能会丢失。这和一个硬件中断时原理一样。调了KeInsertQueueDPC成功后不需再调其它任何函数,系统会自动产生一个软中断来调度你的DPC进程。
少了e,就少了全部
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-10-28 09:11
“调用KeInsertQueueDPC成功后不需再调其它任何函数,系统会自动产生一个软中断来调度你的DPC进程。”不是很明白,我认为在driver里面肯定要作一些工作,这个软中断才能和我的DPC进程相关!现在比如我的DPC处理函数是dpc(),(这个函数是我自己定义的,系统刚开始是不知道的),那么这个dpc()是如何和DPC队列相联系的?
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-10-28 09:21
刚刚看了DDK帮助,基本上明白了,这个dpc()原来是在KeInitializeDpc初始化的时候就已经和这个DPC队列发生了联系!给分了!!!
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-10-28 09:24
不好意思,可能是由于我的一个误操作,居然把给分按钮给弄没有了,那就只好新开一贴给分了!!!

minsoft请留意!
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-10-28 10:27
同时感谢lan2,谢谢你提供的资源信息!
hapi
驱动小牛
驱动小牛
  • 注册日期2002-03-08
  • 最后登录2007-09-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-10-31 10:44
请问minsoft:如果ISR中对DPC的连续多次调用之间的时间间隔太短,系统将忽略后入队的DPC对象。我想请问,我怎么实现多个DPC调用呢?事先我不能预期中断到来的时间间隔。我是不是可以调用不同的DPC对象来实现对DPC多次调用。
minsoft
驱动小牛
驱动小牛
  • 注册日期2001-07-30
  • 最后登录2007-03-06
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-10-31 14:19
楼上这位兄弟,其实你过于担心了。据我的经验,如果ISR/DPC不是很复杂,上层应用不是很重(如播放DVD等)时,PII以上的系统可以接受连续的100KHZ的中断不致丢失,我以前做一个虚拟示波器时特意测量过。(NT4。0,PII450,128M RAM)如果再快,那就请考虑使用DMA方式传输。
另外一种方法是使用一个队列自己维护。大致是这样,使用一系统线程不断查询队列,一旦为非空即取队头予以处理。ISR只负责将新的请求插入队列的尾部。
少了e,就少了全部
hapi
驱动小牛
驱动小牛
  • 注册日期2002-03-08
  • 最后登录2007-09-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-10-31 15:08
minsoft老兄,很多wdm驱动的书上都会提到这样的事实:windows2000 限定在某个时刻只有DPC对象的一个实例可以存在于系统DPC队列,拒绝已有实例在队列中的DPC对象进入队列。我现在考虑的是,我有什么办法使得ISR向DPC队列插入多个DPC对象而不被系统拒绝(即运行多个DPC对象)。谢谢!
上一页
游客

返回顶部