免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2117 | 回复: 5

有什么办法不用中断能让读写挂起呢? [复制链接]

论坛徽章:
0
发表于 2009-08-26 19:16 |显示全部楼层
对IO进行操作,提供三个寄存器,读寄器(R_REG),写寄存器(W_REG),状态寄存器(S_REG),通过S_REG来判断是否可读写操作,这应该是最简单的一个驱动程序了,实现倒很简单,可是郁闷的来了。
(前提:该硬件没有提供任何中断)

应用程序使用时如何操作呢?好像只能
while((state=read(S_REG))== xx);
data=read(R_REG);

如何能不用while呢?编写驱动程序让read(R_REG)时直接挂起,通过S_REG的状态改变来唤醒呢?

想了半天没想出解决办法,望各位大大指教一二

论坛徽章:
0
发表于 2009-08-27 02:13 |显示全部楼层
可以自己定义个SEMAPHORE, 用wait_event_interruptible。
详细说明看 LDD3, CHAPTER 6, PAGE 147-161, Blocking I/O

论坛徽章:
0
发表于 2009-08-27 09:33 |显示全部楼层

回复 #1 rollin7 的帖子

不提供中断的话,你可以suspend read/write 操作,但是你得提供一种手段在状态寄存器发生改变的时候去唤醒sleep的进程(f.e 可以使用timer,以一定的间隔去poll S_REG)

所以没有中断的话,只能poll,区别就是在read/write的时候poll还是在别的地方poll。

论坛徽章:
0
发表于 2009-08-27 21:01 |显示全部楼层
原帖由 accessory 于 2009-8-27 02:13 发表
可以自己定义个SEMAPHORE, 用wait_event_interruptible。
详细说明看 LDD3, CHAPTER 6, PAGE 147-161, Blocking I/O


恕我愚昧,用wait_event_interruptible不知道如何实现

如果在驱动的xx_read里加上wait_event_interruptible(&wq,flag),可这个flag却是xx_read(S_REG)==xx,  无限循环,有点晕了?

原帖由 eexplorer 于 2009-8-27 09:33 发表
不提供中断的话,你可以suspend read/write 操作,但是你得提供一种手段在状态寄存器发生改变的时候去唤醒sleep的进程(f.e 可以使用timer,以一定的间隔去poll S_REG)

所以没有中断的话,只能poll,区别就是在 ...


多谢,以上方法我也考虑过,但采用timer的话实时性达不到要求,如果timer的时间设得太短,CPU占用还是太高。不过实在没着时,只能用此办法

[ 本帖最后由 rollin7 于 2009-8-28 00:20 编辑 ]

论坛徽章:
0
发表于 2009-08-28 00:22 |显示全部楼层
原帖由 accessory 于 2009-8-27 02:13 发表
可以自己定义个SEMAPHORE, 用wait_event_interruptible。
详细说明看 LDD3, CHAPTER 6, PAGE 147-161, Blocking I/O


不好意思,想明白了,笨了一回,在wait_event_interruptible里的flag, 也就是读S_REG,我可以不用此xx_read函数来操作,而改用io的读在里面循环不就行了。

多谢多谢

论坛徽章:
0
发表于 2009-08-28 01:35 |显示全部楼层
不客气。另外,我同意3楼说得,没提供中断得设备就只能POLL. 区别就是在什么时候POLL了。
还要看上层得应用程序需要怎样得接口。最简单的就是在应用程序调用READ的时候才去POLL. POLL 一段时间,比如3秒后,还是不行就返回个错误代码,让上面自己决定是接着POLLL还是等下POLL.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP