阅读:1737回复:14
写过pci驱动的进来(给分40或更多)
这是我的读写pci内存的程序(bufferio方式):
NTSTATUS WdmPciRead( IN PDEVICE_OBJECT fdo, IN PIRP Irp) { PWDMPCI_DEVICE_EXTENSION dx = (PWDMPCI_DEVICE_EXTENSION)fdo->DeviceExtension; if( !dx->GotPortOrMemory) return CompleteIrp( Irp, STATUS_INSUFFICIENT_RESOURCES); if( dx->IODisabled) return CompleteIrp( Irp, STATUS_DEVICE_NOT_CONNECTED); if (!LockDevice(dx)) return CompleteIrp( Irp, STATUS_DELETE_PENDING); PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp); ULONG BytesTxd = 0; // Get call parameters ULONG ReadLen = IrpStack->Parameters.Read.Length; PULONG Buffer = (PULONG)Irp->AssociatedIrp.SystemBuffer; NTSTATUS status=STATUS_SUCCESS; PVOID newbuffer=ExAllocatePool(NonPagedPool,16384); // DebugPrint(\"读 %d 字节 \",(int)ReadLen); READ_REGISTER_BUFFER_ULONG(PULONG(dx->PortBase+0x00),PULONG(newbuffer),ReadLen/4); RtlCopyMemory(Buffer,newbuffer,ReadLen); // DebugPrintMsg(\"内存read字符串\"); // Complete IRP CompleteIrp(Irp,status,ReadLen); UnlockDevice(dx); return status; } ///////////////////////////////////////////////////////////////////////////// // WdmIoWrite: // // Description: // Handle IRP_MJ_WRITE requests // // Arguments: // Pointer to our FDO // Pointer to the IRP // IrpStack->Parameters.Write.xxx has write parameters // User buffer at: AssociatedIrp.SystemBuffer (buffered I/O) // MdlAddress (direct I/O) // // Return Value: // This function returns STATUS_XXX NTSTATUS WdmPciWrite(IN PDEVICE_OBJECT fdo, IN PIRP Irp) { PWDMPCI_DEVICE_EXTENSION dx = (PWDMPCI_DEVICE_EXTENSION)fdo->DeviceExtension; if( !dx->GotPortOrMemory) return CompleteIrp( Irp, STATUS_INSUFFICIENT_RESOURCES); if( dx->IODisabled) return CompleteIrp( Irp, STATUS_DEVICE_NOT_CONNECTED); if (!LockDevice(dx)) return CompleteIrp( Irp, STATUS_DELETE_PENDING); PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp); // Get call parameters ULONG WriteLen = IrpStack->Parameters.Write.Length; PULONG Buffer = (PULONG)Irp->AssociatedIrp.SystemBuffer; NTSTATUS status=STATUS_SUCCESS; LONG Bytes=4096; ULONG LoopNo=(WriteLen/4)/Bytes; ULONG EndBytes=(WriteLen/4)%Bytes; if(EndBytes==0) LoopNo--; for(ULONG i=0;i<=LoopNo;i++) { if(i==LoopNo && EndBytes!=0) { WRITE_REGISTER_BUFFER_ULONG(PULONG(dx->PortBase+0x00),Buffer+i*Bytes,EndBytes-1); } else { WRITE_REGISTER_BUFFER_ULONG(PULONG(dx->PortBase+0x00),Buffer+i*Bytes,Bytes); } } // DebugPrintMsg(\"内存写字符串\"); // DebugPrint(\"Write: %d bytes written\",(int)WriteLen); // Complete IRP CompleteIrp(Irp,status,WriteLen); UnlockDevice(dx); return status; } ////////////////////////////////////////////////////////// 这样的读取方式会不会对pci的传输速度有影响? 我的pci程序对板卡进行读写操作速度只有500k/s, 请教各位一般正常的pci读写操作速度? :D |
|
最新喜欢:cb615c...
|
沙发#
发布于:2002-07-01 14:07
是500K byte/s?
用IO的方法速度不会很快的,可以用DMA方式。 我见过100K sample/s的数据采集卡,一个sample是DWORD类型的话,就是400kb/s了。 能满足你的速度要求就行了呀。 |
|
板凳#
发布于:2002-07-01 14:14
DMA方式对硬件要求很高,硬件电路设计比较复杂,所以只能采用这种缓冲方式,是不是缓冲方式的速度很慢?
还有的就是,我是帮我们的硬件工程师来测板子,现在只有这种速度,肯定不行,他设计的标准是33M主频(我不是很懂这些东西),最起码每秒要超过10M才行。 |
|
|
地板#
发布于:2002-07-01 14:15
bufferio本身也会影响速度
他要将数据在应用层和核心层之间来回对拷 这适用于慢速设备 试试directio,适用快速设备 |
|
|
地下室#
发布于:2002-07-01 14:17
应该是500KB/S :D
[编辑 - 7/1/02 by shengws] |
|
|
5楼#
发布于:2002-07-01 14:18
10Mbytes/s?
PIO够呛阿。DMA吧。 DMA的硬件好像不是很复杂吧。呵呵。。。。 |
|
|
6楼#
发布于:2002-07-01 14:22
好像讨论过?
理论上最多也就133Mb/s,但是这不可能的。 |
|
7楼#
发布于:2002-07-01 14:28
我现在快疯了,我只想找出来是那里出的问题,是PIO方式出的问题?一般PIO方式能比DMA方式慢多少? :D
|
|
|
8楼#
发布于:2002-07-01 14:32
慢多了
|
|
|
9楼#
发布于:2002-07-01 14:33
采用DMA方式必须要硬件支持才行吗? :D
|
|
|
10楼#
发布于:2002-07-01 14:40
硬件上基本都是支持的,不需要另外加什么东西吧。你用的是专用芯片还是fpga自己写pci core的?
|
|
|
11楼#
发布于:2002-07-01 14:46
是actel公司的A54SX16A PQ208芯片,然后我们的硬件工程师烧录的pci协议 :D
|
|
|
12楼#
发布于:2002-07-01 14:50
你的卡是slave模式的吧?如果是的话,没有道理不支持系统的dma通道啊!
各位兄弟,你们说是不是阿? |
|
|
13楼#
发布于:2002-07-01 14:51
对于PCI的传输速度你可以这样计算:比如说普通的PCI(时钟频率为33m/s,每个时钟周期传输32位的数据)那么它的最大传输速度为:33x32/8=133,也就是每秒钟133兆字节(byte)。当然还有64位,和主频66m/s的PCI。如果不想改硬件,可以考虑在应用程序开多个缓冲用异步I/O的方式,但速度可以提高多少还要看你的实际应用。另外zydcat说的用directio来减少系统拷贝的次数也是个提高速度的好方法。
|
|
|
14楼#
发布于:2002-07-01 16:32
leerom的说法没错,一般的PCI读取速度应该是这样算,主频是33M的话是133M字节。
还有DMA应该都会支持的啊! |
|
|