rilyyu
驱动小牛
驱动小牛
  • 注册日期2006-11-17
  • 最后登录2010-08-17
  • 粉丝0
  • 关注0
  • 积分512分
  • 威望130点
  • 贡献值0点
  • 好评度127点
  • 原创分0分
  • 专家分0分
阅读:1685回复:10

关于流驱动的一些问题

楼主#
更多 发布于:2007-07-30 10:15
1.如果某个流驱动的作用是用中断来接受和发送数据的,一般来说创建中断线程的代码是应该放在XXX_Init中还是XXX_Open中呢
2.假设应用程序中分配一块缓冲区,调用ReadFile将这块缓冲区的指针传递给XXX_Read函数,XXX_Read是内容如下:
XXX_Read(...)
{
      ...   //检查参数合法性
      ...   //设置各种初始环境
      //进入中断,中断线程读取数据,并填充到传入的缓冲区地址
     return  //返回
}
如果XXX_Read函数在中断函数还未将所有数据读完的情况下就返回了,应用程序在操作缓冲区时和中断线程会不会发生冲突,有的话,应该如何解决。利用线程同步的机制,让XXX_Read函数在中断线程读完所有需要的数据再返回的方法可取吗?
3.流驱动接口能实现被多个应用程序调用吗?比如多个进程同时调用CreateFile,并通过该驱动与硬件设备通信。这种实现有什么需要注意的地方。

谢谢大家的指点^_^
sniper167
驱动中牛
驱动中牛
  • 注册日期2006-07-12
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分13分
  • 威望411点
  • 贡献值0点
  • 好评度321点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-07-30 10:35
1。个人觉得应该放在XXX_Init中,因为这个驱动是用中断来接受和发送数据,只要开机进系统后,就有中断来的可能。
2。要达人来说说。不过串口驱动的COM_Read能给你些答案
3。注意互斥。

请达人现身,关注中
[url]http://sniper167.bokee.com[/url]
rilyyu
驱动小牛
驱动小牛
  • 注册日期2006-11-17
  • 最后登录2010-08-17
  • 粉丝0
  • 关注0
  • 积分512分
  • 威望130点
  • 贡献值0点
  • 好评度127点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-07-31 09:28
谢谢楼上大侠指点
rilyyu
驱动小牛
驱动小牛
  • 注册日期2006-11-17
  • 最后登录2010-08-17
  • 粉丝0
  • 关注0
  • 积分512分
  • 威望130点
  • 贡献值0点
  • 好评度127点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-08-02 10:24
顶一下,对于后两个问题希望得到更详细的阐述
谢谢各位大侠
bbmyc
驱动牛犊
驱动牛犊
  • 注册日期2006-08-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分386分
  • 威望79点
  • 贡献值0点
  • 好评度38点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-08-02 10:33
可用使用hOpenContext参数来实现流驱动程序的单访问和多访问
bbmyc
驱动牛犊
驱动牛犊
  • 注册日期2006-08-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分386分
  • 威望79点
  • 贡献值0点
  • 好评度38点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-08-02 10:35
也就是说要想实现多访问,对于XXX_Open函数来说,每次调用都应该返回不同的hOpencontext值。应该跟踪从XXX_open返回的哪一个值正在被使用。
shentong973
驱动牛犊
驱动牛犊
  • 注册日期2005-08-21
  • 最后登录2011-03-08
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望77点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-08-02 10:50
2,你的XXX_Read函数内容我觉得有问题,你在读函数里怎么可能进入中断?,我觉得应该是在读函数里将中断已经读取的数据填充到应用程序传入的缓冲区地址,如果需要读到一定长度的数据才返回的话,需要驱动程序配合,在打开设备时置阻塞标志.

3,可是实现被多个应用程序打开.
microsun
论坛版主
论坛版主
  • 注册日期2002-11-11
  • 最后登录2014-07-18
  • 粉丝0
  • 关注0
  • 积分1052分
  • 威望1159点
  • 贡献值0点
  • 好评度848点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-08-04 08:15
1.这个线程在哪创建都行,主要的是要达到你的目的,INIT只会调一次,而OPEN在CREATEFILE时就会被调到.
2.READ函数可以等到IST读完数据以后再返回,就不会有你的问题了.
3.CREATEFILE多次是可以的,主要是看你的系统有什么样的需求.多个线程从同一个设备上读写数据是否可行.比如对串口设备做这种操作就是没有意义的,而硬盘就是可以的.
需要注意的只有一点,就是把操作硬件的代码放在CriticalSection中,让同一时间只有一个线程在访问硬件.
学海无涯
sniper167
驱动中牛
驱动中牛
  • 注册日期2006-07-12
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分13分
  • 威望411点
  • 贡献值0点
  • 好评度321点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-08-06 10:14
呵呵 抛了个砖头还引出玉来了 学习学习
[url]http://sniper167.bokee.com[/url]
bbmyc
驱动牛犊
驱动牛犊
  • 注册日期2006-08-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分386分
  • 威望79点
  • 贡献值0点
  • 好评度38点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-08-07 20:48
不错,学习到不少。呵呵
frostofmourne
驱动牛犊
驱动牛犊
  • 注册日期2007-11-25
  • 最后登录2007-12-25
  • 粉丝0
  • 关注0
  • 积分410分
  • 威望42点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-11-25 23:58
学习~~~
march forth alone through the ashes
游客

返回顶部