| 
					阅读:1822回复: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应该都会支持的啊! | |
| 
 | 
 
							 
				 
				
 
				