阅读:2161回复:17
DeviceIOControl缓冲问题?
要从端口读图像数据,能有256k左右。
想在sys中用 READ_PORT_BUFFER_ULONG( (PULONG)wPortEPP, (PULONG)pBuffer, ulongSize ); 那么缓冲区怎么实现好呢? 在app中开辟缓冲,用deviceiocontrol传递给驱动程序,这样行么? 还是在驱动里开辟再传回给应用程序?共享内存是怎么回事? |
|
沙发#
发布于:2003-05-25 18:01
顶。
|
|
板凳#
发布于:2003-05-25 19:36
可以app开辟buffer,传给driver
|
|
地板#
发布于:2003-05-25 20:10
缓冲大小有限制么,如果数据量再大呢, 1G 能行不?
我现在想是不是得用共享内存。 |
|
地下室#
发布于:2003-05-25 21:04
方法不少。
buffered_io direct_io 共享内存 都可以 1G?没有试过。 |
|
5楼#
发布于:2003-05-25 21:35
我现在用buffered_io,缓冲大小40k
deviceiocontrol一执行就死机,能是什么问题啊,我刚开始学作驱动,没有经验,能帮我看看么 app: ULONG dwOutBytes; ULONG buf[10000]; if(!(DeviceIoControl(hDriver, // 设备句柄 IOCTL_READARRAY, // 取设备属性信息 NULL, 0, // 输入数据缓冲区 (PVOID)buf,bSize, // 输出数据缓冲区 &dwOutBytes, // 输出数据长度 (LPOVERLAPPED)NULL))) …… driver; pBuffer = (PULONG)Irp->AssociatedIrp.SystemBuffer; …… case IOCTL_READARRAY: …… READ_PORT_BUFFER_ULONG((PULONG)wPortEPP, (PULONG)pBuffer, ulongSize); …… |
|
6楼#
发布于:2003-05-26 09:13
应该是没有把app传上来的缓冲地址转换成驱动可用的物理地址
|
|
7楼#
发布于:2003-05-26 09:46
不太明白,能再讲讲么?
我采用buffered方式,不是由I/O管理器先创建一个与用户模式数据缓冲区大小相等的系统缓冲区。驱动程序将使用这个系统缓冲区工作。I/O管理器负责在系统缓冲区和用户模式缓冲区之间复制数据。 还需要做什么么? |
|
8楼#
发布于:2003-05-26 10:49
app: 这时Irp->AssociatedIrp.SystemBuffer的内容是inbuffer的,你给的NULL 完成的时候才把Irp->AssociatedIrp.SystemBuffer的内容copy到outbuffer if(!(DeviceIoControl(hDriver, // 设备句柄 IOCTL_READARRAY, // 取设备属性信息 (PVOID)buf, bSize, // 输入数据缓冲区 (PVOID)buf,bSize, // 输出数据缓冲区 &dwOutBytes, // 输出数据长度 (LPOVERLAPPED)NULL))) 这样再试看看。 |
|
9楼#
发布于:2003-05-26 11:45
问题1:你传入参数为NULL,和0,系统为你分配0字节的systembuffer,
但这时你的systembuffer指针是有值的,是一个没有初始话的随机值,当你往systembuffer回写值的时候覆盖了此时指针所指地址的值,当机的可能性百分之99.999。 问题2:你不可能分配1G的系统空间,2000PRO的系统内存中分页池和非分页池合起来最大的时候也不到1G,事实上你能分到100M就算你很神了,节约点。所以,你的传入参数首先不能是空指针NULL,更要注意的是sizeof(input)不能是零,除非你不用输出。也不能太大。 问题3:这位老兄从端口上读图象数据,闻所未闻,神了。 [编辑 - 5/26/03 by siteddy] |
|
|
10楼#
发布于:2003-05-26 12:35
依arthurtu所说,改了,还是死机呀
没办法,其实主要是往端口写图像信息,一样还是不行啊!! 请大家多帮忙,不够加分! |
|
11楼#
发布于:2003-05-26 14:00
兄弟:
我已经把你的问题指出来了,你居然不理我,呵呵,好吧,我再告诉你一次,你回头去确认一下你的卡映射的IO端口的范围,然后你把这个范围和你的40K比较一下,如果你还不明白你的问题在哪里,我只能说我不是做驱动的。顺便告诉你一下,X86能够分配给所有IO端口的最大值是64K.你一块卡有本事去映射40k,不是你疯掉了,就是你们的硬件人员疯掉了。我说你的方法闻所未闻算是很客气了。 |
|
|
12楼#
发布于:2003-05-26 16:22
兄弟: 有说映射40k(!)的IO地址吗? :o Luckysune7同志,你的卡不是这样的吧? :o |
|
13楼#
发布于:2003-05-26 17:15
你看看他的代码哦就知道了。
READ_PORT_BUFFER_ULONG((PULONG)wPortEPP, (PULONG)pBuffer, ulongSize); 你认为他的ulongSize等于多少?他能死机很可能就去访问了不曾分配的端口。 退一步说,就算他用循环的方式去读这个(些)端口,然后pBuffer递增 你认为他能和卡端来的数据同步得上吗?是视频数据也,还不神奇? |
|
|
14楼#
发布于:2003-05-26 19:45
我是通过并口0x378,设置成epp模式,通过这个口读写数据快的,其实主要还是写数据,可以让板子始终等待我发出的图像数据。
to teddy: 我不太明白你的意思,呵呵,可能是我说的不够明白吧 。 |
|
15楼#
发布于:2003-06-04 15:49
说实话,我也不太懂siteddy前辈的意思,他的ulongSize的值是缓冲区的大小呀,又不是分配给I/O断口的地址的个数呀。
而且我觉得如果只是从断口读数据,不必要给出输入缓冲区的地址和大小的呀。 呵呵,不过,我是初学者,随便说说的。大家一起探讨,共同进步。 |
|
16楼#
发布于:2003-06-17 19:50
随便说点。
我觉得BUFFERED IO不好,不如DIRECT IO,直觉上后者需要的内存管理更少。 |
|
17楼#
发布于:2003-06-17 22:13
说实话,我也不太懂siteddy前辈的意思,他的ulongSize的值是缓冲区的大小呀,又不是分配给I/O断口的地址的个数呀。 我觉得是这个道理,是这么回事!!! |
|
|