阅读:1969回复:4
中断服务程序要做些什么? |
|
|
沙发#
发布于:2002-04-18 11:53
ISR例程运行在DIRQL级别,不宜做过多的事情。凡是碰到要挂接中断的程序必须注册DPC例程,将一些操作放到这些延迟例程里面去做。
具体说来,ISR中一般做这些事情: 1:确定中断是否属于该驱动程序。如果不属于,则立刻返回; 2:执行设备确认中断所需的任何操作。 3:确定是否还有数据要传输。如果还有,开始下一个设备操作。这就将最终导致另一个中断。 4:如果所有数据已经被传输(或者发生一个设备错误),通过调用IoRequestDpc排队DPC请示。 5:返回TRUE值。 以下是一段示例代码: BOOLEAN Isr( IN PKINTERRUPT pIntObj, IN PVOID pServiceContext) { PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pServiceContext; PDEVICE_OBJECT pDevObj= pDevExt->pDevice; PIRP pIrp = pDevObj->CurrentIrp; if( GetIrq()!=MyIrq ) //GetIrq is a user defined function return FALSE; if( bLeftBytes == 0) //finished all transfer IoRequestDpc(pDevObj,pIrp,(PVOID)pDevExt); //pDevExt used as context. return TRUE; |
|
|
板凳#
发布于:2002-04-19 04:10
基本上看你想干什么了,比如中断来了你只想写个控制字,isr里做就行了,如果要启动dma,一般数据量挺大时,isr里启动一下,再开个dpc做传输。Tom_lyd说的是标准做法,你要是很明白硬件到底要干什么,也可以稍微变通一下,只要不做dma或不与用户层打交道也不牵涉延时等等,dpc就可以免了。isr的过程Tom_lyd已经说的很清楚了,我就不再重复了:)
|
|
地板#
发布于:2003-04-11 10:32
在ds中可以这么写程序:
参考一下嘛:) BOOLEAN IntwdmDwvice::Isr_irq(void) { if(IsOurInterrupt()) { m_DpcFor_Irq.Request(); return TRUE; } else return FALSE; } VOID IntwdmDevice::DpcFor_Irq(PVOID Arg1,PVOID Arg2) { //TODO:添加你的中断任务代码 } 大家多交流,我觉得DS很容易上手:) |
|
|
地下室#
发布于:2003-04-13 09:06
要记得清中断,呵呵
|
|
|