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

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

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

最新喜欢:

hapihapi
hapi
驱动小牛
驱动小牛
  • 注册日期2002-03-08
  • 最后登录2007-09-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-10-31 20:31
to edriver:我的意思是同一个DPC对象不能在DPC队列中出现两次,当然DPC队列中可以有多个不同的DPC对象。不知道对不对。 :D :D :D
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-10-31 16:13
to hapi:你的意思是不是在DPC队列里面任何时候只能有一个DPC对象?如果当前正好有一个DPC在处理时,就不能有DPC被排队进来?否则将被排队的DPC就会丢失?那如果是这样,就不能称之为DPC队列了!因为这个队列就只有一个DPC。是不是这样?
minsoft
驱动小牛
驱动小牛
  • 注册日期2001-07-30
  • 最后登录2007-03-06
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-10-31 15:51
自己维护一个双向队列(不是DPC队列,借助系统线程)就不存在这个问题呀,随你插入多少个都行。
少了e,就少了全部
hapi
驱动小牛
驱动小牛
  • 注册日期2002-03-08
  • 最后登录2007-09-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-10-31 15:33
to edriver:你说的不错,但问题是如果已经有DPC对象在DPC队列中,系统将拒绝这一DPC对象的再次入队。也就是说在DPC队列中,不可能出现有两个相同的DPC对象。这是我的理解,我的疑惑是怎么解决同一DPC对象的入队问题。即你的某个ISR不断调用DPC入队,怎么解决?请大家指教。
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-10-31 15:23
但在同一时刻,有多个DPC队列应该是没有问题的,再说,插入多个DPC对象和某时只能运行一个DPC并不矛盾呀!不知道对不对?
hapi
驱动小牛
驱动小牛
  • 注册日期2002-03-08
  • 最后登录2007-09-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-10-31 15:08
minsoft老兄,很多wdm驱动的书上都会提到这样的事实:windows2000 限定在某个时刻只有DPC对象的一个实例可以存在于系统DPC队列,拒绝已有实例在队列中的DPC对象进入队列。我现在考虑的是,我有什么办法使得ISR向DPC队列插入多个DPC对象而不被系统拒绝(即运行多个DPC对象)。谢谢!
minsoft
驱动小牛
驱动小牛
  • 注册日期2001-07-30
  • 最后登录2007-03-06
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于: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分
8楼#
发布于:2002-10-31 10:44
请问minsoft:如果ISR中对DPC的连续多次调用之间的时间间隔太短,系统将忽略后入队的DPC对象。我想请问,我怎么实现多个DPC调用呢?事先我不能预期中断到来的时间间隔。我是不是可以调用不同的DPC对象来实现对DPC多次调用。
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-10-28 10:27
同时感谢lan2,谢谢你提供的资源信息!
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-10-28 09:24
不好意思,可能是由于我的一个误操作,居然把给分按钮给弄没有了,那就只好新开一贴给分了!!!

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

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

另一个用KeInsertQueueDpc来排队DPC,可是我如何来执行我的DPC呢?不知道可以用什么函数来实现?也就是说在ISR里面排完队以后,再调用一个函数,可以直接触发另一个函数(就象IoRequestDpc()触发DPCforISR一样),而这个函数也运行于DISPATCH_LEVEL?
minsoft
驱动小牛
驱动小牛
  • 注册日期2001-07-30
  • 最后登录2007-03-06
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于: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分
19楼#
发布于:2002-10-23 11:43
嗨,楼上的各位兄弟,既然可以,那后面的问题呢?也就是如何协调的问题!你们回答了可以,就跑了,也太那个了嘛》》》》 :D
上一页
游客

返回顶部