OK6410之ADC驱动软件分析---阻塞与非阻塞IO

本文介绍了Linux内核中设备驱动的阻塞和非阻塞操作,强调了阻塞操作在某些场景下的高效性。通过等待队列(wait queue)实现阻塞进程的唤醒,详细讲解了等待队列的定义、初始化以及等待和唤醒事件的相关函数和宏,如wait_event、wait_event_interruptible等。
摘要由CSDN通过智能技术生成

   首先,学习一下设备的阻塞与非阻塞操作:

        阻塞操作是指,在执行设备操作时,若不能获得资源,则进程挂起直到满足可操作的条件再进行操作,被挂起的进程进入sleep 状态,被从调度器的运行队列移走,直到等待的条件被满足。非阻塞操作的进程在不能进行设备操作时,并不挂起,它或者放弃,或者不停地查询,直到可以进行操作为止。

      阻塞从字面上听起来似乎意味着低效率,实则不然。如果设备驱动不阻塞,则用户想获得设备资源只能不停地查询,这反而会耗费CPU资源。而阻塞访问时,不能获得资源的进程将进行休眠,它将CPU资源让给其他进程。

      在linux驱动程序中,使用等待队列(wait queue)来实现阻塞进程的唤醒。。 wait queue很早就作为一个基本的功能单位出现在 Linux内核里了,它以队列为基础数据结构,与进程 调度机制紧密结合,能够用于实现核心的异步事件通知机制。等待队列可以用来同步对系统资源的访问, Linux信号量在内核中也是由等待队列来实现的。

  

1、定义并初始化:

(1)

wait_queue_head_t my_queue;

init_waitqueue_head(&my_queue);

直接定义并初始化。init_waitqueue_head()函数会将自旋锁初始化为未锁,等待队列初始化为空的双向循环链表。

(2)

DECLARE_WAIT_QUEUE_HEAD(my_queue);

定义并初始化,相当于(1)

(3)定义等待队列:

DECLARE_WAITQUEUE(name,tsk);

 

3、等待事件:

(1)wait_event()宏:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值