Luckysune7
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2160回复:17

DeviceIOControl缓冲问题?

楼主#
更多 发布于:2003-05-25 14:05
要从端口读图像数据,能有256k左右。
想在sys中用
READ_PORT_BUFFER_ULONG( (PULONG)wPortEPP,
(PULONG)pBuffer,
ulongSize );
那么缓冲区怎么实现好呢?
在app中开辟缓冲,用deviceiocontrol传递给驱动程序,这样行么?
还是在驱动里开辟再传回给应用程序?共享内存是怎么回事?


 
RED_spring
驱动中牛
驱动中牛
  • 注册日期2002-07-28
  • 最后登录2016-11-06
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望19点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2003-05-25 18:01
顶。

arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2003-05-25 19:36
可以app开辟buffer,传给driver
Luckysune7
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-05-25 20:10
缓冲大小有限制么,如果数据量再大呢, 1G 能行不?
我现在想是不是得用共享内存。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2003-05-25 21:04
方法不少。
buffered_io
direct_io
共享内存
都可以
1G?没有试过。
Luckysune7
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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);  
          ……
 
glqgglq
驱动小牛
驱动小牛
  • 注册日期2001-04-16
  • 最后登录2008-10-28
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望4点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-05-26 09:13
应该是没有把app传上来的缓冲地址转换成驱动可用的物理地址
Luckysune7
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-05-26 09:46
不太明白,能再讲讲么?

我采用buffered方式,不是由I/O管理器先创建一个与用户模式数据缓冲区大小相等的系统缓冲区。驱动程序将使用这个系统缓冲区工作。I/O管理器负责在系统缓冲区和用户模式缓冲区之间复制数据。
还需要做什么么?
 

arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2003-05-26 10:49
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;
 

这时Irp->AssociatedIrp.SystemBuffer的内容是inbuffer的,你给的NULL
完成的时候才把Irp->AssociatedIrp.SystemBuffer的内容copy到outbuffer

if(!(DeviceIoControl(hDriver,   // 设备句柄
        IOCTL_READARRAY,  // 取设备属性信息
        (PVOID)buf, bSize,        // 输入数据缓冲区
        (PVOID)buf,bSize,        // 输出数据缓冲区
        &dwOutBytes,             // 输出数据长度
        (LPOVERLAPPED)NULL)))
这样再试看看。
siteddy
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2005-02-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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]
teddy
Luckysune7
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-05-26 12:35
依arthurtu所说,改了,还是死机呀
没办法,其实主要是往端口写图像信息,一样还是不行啊!!
请大家多帮忙,不够加分!
siteddy
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2005-02-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-05-26 14:00
兄弟:
    我已经把你的问题指出来了,你居然不理我,呵呵,好吧,我再告诉你一次,你回头去确认一下你的卡映射的IO端口的范围,然后你把这个范围和你的40K比较一下,如果你还不明白你的问题在哪里,我只能说我不是做驱动的。顺便告诉你一下,X86能够分配给所有IO端口的最大值是64K.你一块卡有本事去映射40k,不是你疯掉了,就是你们的硬件人员疯掉了。我说你的方法闻所未闻算是很客气了。
teddy
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2003-05-26 16:22
兄弟:
    我已经把你的问题指出来了,你居然不理我,呵呵,好吧,我再告诉你一次,你回头去确认一下你的卡映射的IO端口的范围,然后你把这个范围和你的40K比较一下,如果你还不明白你的问题在哪里,我只能说我不是做驱动的。顺便告诉你一下,X86能够分配给所有IO端口的最大值是64K.你一块卡有本事去映射40k,不是你疯掉了,就是你们的硬件人员疯掉了。我说你的方法闻所未闻算是很客气了。

有说映射40k(!)的IO地址吗? :o
Luckysune7同志,你的卡不是这样的吧? :o
siteddy
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2005-02-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-05-26 17:15
你看看他的代码哦就知道了。
READ_PORT_BUFFER_ULONG((PULONG)wPortEPP,
(PULONG)pBuffer,
ulongSize);
你认为他的ulongSize等于多少?他能死机很可能就去访问了不曾分配的端口。
退一步说,就算他用循环的方式去读这个(些)端口,然后pBuffer递增
你认为他能和卡端来的数据同步得上吗?是视频数据也,还不神奇?
teddy
Luckysune7
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-05-26 19:45
我是通过并口0x378,设置成epp模式,通过这个口读写数据快的,其实主要还是写数据,可以让板子始终等待我发出的图像数据。
to teddy:
我不太明白你的意思,呵呵,可能是我说的不够明白吧 。
bestrafi
驱动牛犊
驱动牛犊
  • 注册日期2003-05-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-06-04 15:49
说实话,我也不太懂siteddy前辈的意思,他的ulongSize的值是缓冲区的大小呀,又不是分配给I/O断口的地址的个数呀。
而且我觉得如果只是从断口读数据,不必要给出输入缓冲区的地址和大小的呀。
呵呵,不过,我是初学者,随便说说的。大家一起探讨,共同进步。
yunyanrong
驱动小牛
驱动小牛
  • 注册日期2003-04-18
  • 最后登录2013-03-02
  • 粉丝0
  • 关注0
  • 积分1040分
  • 威望457点
  • 贡献值1点
  • 好评度90点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-06-17 19:50
随便说点。

我觉得BUFFERED IO不好,不如DIRECT IO,直觉上后者需要的内存管理更少。
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-06-17 22:13
说实话,我也不太懂siteddy前辈的意思,他的ulongSize的值是缓冲区的大小呀,又不是分配给I/O断口的地址的个数呀。
而且我觉得如果只是从断口读数据,不必要给出输入缓冲区的地址和大小的呀。
呵呵,不过,我是初学者,随便说说的。大家一起探讨,共同进步。


我觉得是这个道理,是这么回事!!!
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
游客

返回顶部