linux 阻塞IO

1.阻塞和非阻塞 IO 是 Linux 驱动开发里面很常见的两种设备访问模式,在编写驱动的时候一定要考虑到阻塞和非阻塞。
这里的“IO”并不是单片机的的“GPIO”(引脚)。
这里的 IO 指的是 Input/Output,也就是输入/输出,是应用程序对驱动设备的输入/输出操作。

2.当应用程序对设备驱动进行操作的时候,如果不能获取到设备资源,那么阻塞式 IO 就会将应用程序对应的线程挂起,直到设备资源可以获取为止。

应用程序调用 read 函数从设备中读取数据,当设备不可用或数据未准备好的时候就会进入到休眠态。等设备可用的时候就会从休眠态唤醒,然后从设备中读取数据返回给应用程序。

3.阻塞访问最大的好处就是当设备文件不可操作的时候进程可以进入休眠态,这样可以将CPU 资源让出来。

4.等待队列
4.1、等待队列头
    wait_queue_head_t 需要定义一个。定义以后使用    init_waitqueue_head函数初始化。或者使用宏DECLARE_WAIT_QUEUE_HEAD。

4.2、等待队列项
    wait_queue_t表四等待队列项,或者使用宏DECLARE_WAITQUEUE(name, tsk)。  

4.3、添加队列项到等待队列头
    add_wait_queue函数

4.4、移除等待队列项
    资源可用的时候使用remove_wait_queue函数移除。
4.5、唤醒
    wake_up唤醒

5.使用:

5.1 包含头文件:

#include <linux/wait.h>
#include <linux/ide.h>

5.2 定义等待队列头

wait_queue_head_t  r_wait; /* 读等待队列头 */

5.3 初始化等待队列头

init_waitqueue_head(&imx6uirq.r_wait);

5.4 等待事件

    /* 等待以 dev->r_wait 为等待队列头的等待队列被唤醒,前提是 condition 条件必须满足(为真),否则一直阻塞 。 */
    wait_event_interruptible(dev->r_wait, atomic_read(&dev->releasekey)); /* 等待按键有效 */

5.5 唤醒进程

    /* 当设备可以使用的时候就要唤醒进入休眠态的进程 */
    if(atomic_read(&dev->releasekey)) {
         wake_up(&dev->r_wait);
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值