atubb7
驱动牛犊
驱动牛犊
  • 注册日期2002-11-13
  • 最后登录2003-01-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1702回复:12

一个关于ISR的问题

楼主#
更多 发布于:2002-11-13 10:07
在win2000下,用driverworks开发一个PCI的驱动,用wizard生成了框架,两个版本,一个支持中断服务程序,另一个不支持,但是前者安装以后系统起不来,后者就没问题,迷惑!但我不能不用中断啊!
谢谢各位大侠援手!
nikko
驱动小牛
驱动小牛
  • 注册日期2002-08-08
  • 最后登录2004-09-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-13 10:08
我的也一样。  启动到75%就不动了! :mad:
http://202.106.185.224/music_1024/battleraper_02_04_27.mp3
atubb7
驱动牛犊
驱动牛犊
  • 注册日期2002-11-13
  • 最后登录2003-01-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-13 10:13
NIKKO 你还能看见它启动到75%啊 我的根本就黑屏
kxgchina
驱动小牛
驱动小牛
  • 注册日期2002-04-01
  • 最后登录2005-05-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-13 10:13
估计中断资源有冲突!
找找版上有这样的帖子
atubb7
驱动牛犊
驱动牛犊
  • 注册日期2002-11-13
  • 最后登录2003-01-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-13 10:15
和网卡中断冲突 但是我已经把网卡屏蔽掉了
nikko
驱动小牛
驱动小牛
  • 注册日期2002-08-08
  • 最后登录2004-09-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-13 10:17
你的寄存器初始化成功了吗?

不至于黑平呀!

刚才mirosoft 回的,可能能用!

绝对符合要求,这是个AMCC5933的驱程中的ISR程序,来自OSR,我的DRIVER也就在上面修改一下就成的。有问题可再问。

///////////////////////////////////////////////////////////////////////////////
//
// OsrHandleInterrupt
//
// When the AMCC device generates an interrupt, this function is called.
// Note that in our simple model of the world here, every transfer is
// completed successfully. We just don\'t bother with error detection
// and handling. If you wanted this to be a REAL driver, you\'d have to
// do the appropriate error detection and handling.
//
// INPUTS:
//
// Interupt - Address of the KINTERRUPT Object for our device.
//
// ServiceContext - Address of our device extension.
//
// OUTPUTS:
//
// None.
//
// RETURNS:
//
// TRUE if our device is interrupting, FALSE otherwise.
//
// IRQL:
//
// This routine is called at IRQL == DIRQL.
//
// NOTES:
//
// As is true for all ISR\'s in NT, this routine is called with the
// interrupt spin lock held.
//
///////////////////////////////////////////////////////////////////////////////
BOOLEAN OsrHandleInterrupt(PKINTERRUPT Interupt, PVOID ServiceContext)
{
BOOLEAN ourDeviceInterrupting = FALSE;
POSR_DEVICE_EXT devExt = (POSR_DEVICE_EXT)ServiceContext;
ULONG intRegister;
ULONG csrRegister;

#if DBG
DbgPrint(\"OSRPCI: ISR entered\\n\");
#endif

//
// Get the current interrupt CSR from our device
//
intRegister = READ_PORT_ULONG(devExt->AmccBaseRegisterAddress+ICSR_OFF);

#if DBG
DbgPrint(\"*****************AMCC INTCSR = 0x%0x\\n\",intRegister);
OsrPrintIntcsr(intRegister);
#endif


//
// Is our device presently interrupting?
//
if (intRegister & AMCC_INT_INTERRUPTED) {

//
// Yes, it is!
//
ourDeviceInterrupting = TRUE;

#if DBG
DbgPrint(\"\\tInterrupt is ours.\\n\");
#endif

//
// Store away some context so when we get to our DpcForIsr we\'ll know
// what caused the interrupt. Specifically, we accumulate bits in the
// \"IntCsr\" field of our device extenstion indicating what interrupts
// we\'ve seen from the device. Note that since we support simultaneous
// read and write DMA operations, we could get both a read complete
// interrupt and a write complete interrupt before the DpcForIsr has
// had a chance to execute. Thus, we must carefully ACCUMULATE the
// bits.
//
// N.B. We guard these bits with the Interrupt Spin Lock. The bits
// cannot be set or cleared unless holding that lock.
//
devExt->IntCsr |= (intRegister & AMCC_INT_ACK_BITS);

//
// Acknowledge the interrupt on the device
//
WRITE_PORT_ULONG(devExt->AmccBaseRegisterAddress+ICSR_OFF, intRegister);

//
// IF the interrupt was as a result of a READ or WRITE operation
// completing (either with success or error) request our DpcForIsr.
//
if(intRegister & (AMCC_INT_READ_COMP | AMCC_INT_WRITE_COMP)) {

#if DBG
DbgPrint(\"Requesting DPC\\n\");
#endif
IoRequestDpc(devExt->DeviceObject, 0, NULL);
}

}

return(ourDeviceInterrupting);
}




 

____________________
 :o
http://202.106.185.224/music_1024/battleraper_02_04_27.mp3
nikko
驱动小牛
驱动小牛
  • 注册日期2002-08-08
  • 最后登录2004-09-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-13 10:18
是不是没有判断终端原呀?
http://202.106.185.224/music_1024/battleraper_02_04_27.mp3
atubb7
驱动牛犊
驱动牛犊
  • 注册日期2002-11-13
  • 最后登录2003-01-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-11-13 10:20
NIKKO 你说的初始化寄存器是指什么?
atubb7
驱动牛犊
驱动牛犊
  • 注册日期2002-11-13
  • 最后登录2003-01-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-13 10:33
我在想,一个干净的由wizard生成的框架,不加任何东西,不指望硬件能干活,安装应该是没有问题的。
我的理解对吗?
nikko
驱动小牛
驱动小牛
  • 注册日期2002-08-08
  • 最后登录2004-09-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-11-13 11:07
应该是不行的!  起码中断是一定要处理的!

具体我也在想,有结果告诉你!

其实我也很弱,到这里来学习的! :D
http://202.106.185.224/music_1024/battleraper_02_04_27.mp3
yjhleaf
驱动小牛
驱动小牛
  • 注册日期2001-11-04
  • 最后登录2005-11-23
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-11-14 17:07
  这个问题以前说过了的,再说中断寄存器初始化是bios自己搞定的了。假如没有初始化的话,不就是中断没有共享,没有共享怎么回有冲突呢?
忽如一夜春风来,千树万树梨花开。
hglzw
驱动小牛
驱动小牛
  • 注册日期2001-06-12
  • 最后登录2006-03-03
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-11-19 09:03
用ds做得是吧。
在中断处理callback函式Isr_Irq(void)中

  if (false)
{
// Return FALSE to indicate that this device did not cause
// the interrupt.
return FALSE;
}
//上面条件永远不会满足,是吧。问题就出在这儿。在启动时,一些
//不是你的中断跑到这儿,而你没return false,拜托,我要死
//了。。。。

//如果你要使用中断你就改成
        if(!是我的中断)
               return false;
//如果你只简单用一下,不做任何处理
       可改为
        if(true)
             return false;
       或直接return false  就可以了。呵呵
return false  就是不对中断做任何处理,将它传下去,交由其他驱动程序处理。
如果对中断处理,完整的应这样:

   Isr_Irq(void)//中断处理callback函式
{
//先判是不是自己的中断
    if(!是我的中断)//如何判断,问设计这个硬件的人
               return false;

 //现在肯定是自己的中断了,那末先关掉中断源吧,也就是清除中
//断标志,以免中断重入。。
      clrirq();//你自己编的一个关/清除/屏蔽中断函数
     //接下来调用中断延时处理函式
     if (!m_DpcFor_Irq.Request(NULL, NULL))  //可用你要传输
//的参数代替NULL,如果dpc中没有队列,那么将会立即调用中断延
//时处理函式,否则将在dpc排队
       {

         //如果有错就在这里解决
       }
  //接下来再打开中断屏蔽,允许中断继续发生。。
   openirq();//你自己编的

//  一切ok,就。。。
     return  true;
}

//你要在中断时做得事在中断延时处理函式中完成就行了
   DpcFor_Irq(PVOID Arg1, PVOID Arg2)//中断延时处理函式
  {
  //中断发生时,你要做得事,象采集数据了什么得。。就在这儿做
 //在此时如发生中断也没问题,中断将会在dpc排队,执行完这个
//接着就可执行下一个,中断永不会丢掉-----当然中断时间需大于
//Isr_Irq(void)中断处理callback函式这段代码执行的时间---中断
//不会这么快吧--------我晕!

}





[编辑 -  11/19/02 by  hglzw]
[img]http://www.kinboh.com/images/5130.jpg[/img]
yytv
驱动牛犊
驱动牛犊
  • 注册日期2002-03-05
  • 最后登录2009-06-04
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-11-19 10:44
IoRequestDpc(devExt->DeviceObject, 0, NULL);
上面这句对吗?为什么要传为0 的Irp进去?
游客

返回顶部