阅读:1386回复:9
谁能说说这几个例程的执行顺序和主要作用?
PCI9054的驱动,中断控制方式(没有采用DMA方式),有如下几个例程,请帮我理一下它们执行的顺序和主要功能?
StartIo SerialRead Read SerialWrite Write DpcFor_Irq Isr_Irq 我现在已经知道 Read-->StartIo-->SerialRead (1) Write-->StartIo-->SerialWrite (2) 以及 Isr_Irq-->DpcFor_Irq (3) 但是不知道第(3)和第(1),(2)是怎么联系起来的? 其中具体程序如下: //------------------------------------------------------ NTSTATUS PCI9054Device::Write(KIrp I) { if (I.WriteSize() == 0) { I.Information() = 0; return I.PnpComplete(this, STATUS_SUCCESS); } return QueueIrp(I, LinkTo(CancelQueuedIrp)); } //------------------------------------------------------- void PCI9054Device::SerialWrite(KIrp I) { NTSTATUS status = STATUS_SUCCESS; ULONG i; // Declare a memory object KMemory Mem(I.Mdl()); // Use the memory object to create a pointer to the caller\'s buffer PUCHAR pBuffer = (PUCHAR) Mem.MapToSystemSpace(); ULONG dwTotalSize = I.WriteSize(CURRENT); ULONG dwBytesSent = 0; //清空FIFO m_IoPortRange1.outb(0,0); //用I/O输出命令往FIFO写数据 for (i=0;i<dwTotalSize;i++) m_IoPortRange1.outb(0x4,*pBuffer++); I.Information() = dwBytesSent; I.Status() = status; PnpNextIrp(I); } //-------------------------------------------------------- VOID PCI9054Device::StartIo(KIrp I) { if ( !I.TestAndSetCancelRoutine( LinkTo(CancelQueuedIrp), NULL, CurrentIrp()) ) { return; } switch (I.MajorFunction()) { case IRP_MJ_READ: SerialRead(I); break; case IRP_MJ_WRITE: SerialWrite(I); break; default: ASSERT(FALSE); PnpNextIrp(I); break; } } //------------------------------------------------------- BOOLEAN PCI9054Device::Isr_Irq(void) { ULONG status; status= m_IoPortRange0.ind(INTCSR); if ((status & 0x200000)==0) { // Return FALSE to indicate that this device did not cause the interrupt. return FALSE; } m_IoPortRange0.outd(DMAMODE0,0x20800); m_IoPortRange0.outb(DMACSR0,0x10);//Clear Interrupt // Request deferred procedure call // The arguments to Request may be any values that you choose m_DpcFor_Irq.Request(NULL, NULL); return TRUE; } [编辑 - 8/11/03 by stephen80320] |
|
沙发#
发布于:2003-08-12 12:19
我认为它们之间是通过保存在CurrentIrp中的指针所指向的IRP联系起来的。
|
|
板凳#
发布于:2003-08-12 12:42
能不能说具体一点,细节一点。
太抽象了我还是不明白:( |
|
地板#
发布于:2003-08-15 13:08
ReadFile->Read->StartIo->SerialRead->Isr(有可能的话)->Dpc WriteFile->Write->StartIo->WerialWrite->Isr(有可能的话)->Dpc 第一个Func为Win32 API |
|
|
地下室#
发布于:2003-08-16 21:49
既然如此,那么为什么SerialRead例程中看不出调用了Isr呢?
|
|
5楼#
发布于:2003-08-18 19:03
isr是在硬件中断产生后,由系统的io管理器调用的。至于中断什么时候产生,取决于硬件设计
|
|
6楼#
发布于:2003-08-19 08:30
楼主有这本书,可以直接看这本书上的内容,里面有讲的。
|
|
7楼#
发布于:2003-08-23 23:40
楼主有这本书,可以直接看这本书上的内容,里面有讲的。 是哪本书,叫什么名字? |
|
8楼#
发布于:2003-08-24 10:38
如果采用中断方式的话,还是前面一位老兄说的对,ISR什么时候执行是和硬件相关的,当硬件发出中断信号的时候,对应的驱动中的ISR就执行, serialread,怎么和ISR联系起来?我也很想知道这个,这个问题也就是驱动和硬件联系(ISR被执行)与驱动和应用联系(serialread) 怎么握手的问题 。
|
|
|
9楼#
发布于:2003-08-24 21:54
[quote]楼主有这本书,可以直接看这本书上的内容,里面有讲的。 是哪本书,叫什么名字? [/quote] 你上面的那段例程出自于哪本书? 我说的就是这本书了 |
|