linux驱动开发阻塞和非阻塞IO.pdf

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
linux 设备中的阻塞和非阻塞 I/O 一、等待队列 在 linux 驱动程序中,可以使用等待队列来实现阻塞进程的唤醒。等待队列 是以队列为基础数据结构,与进程调度机制紧密结合,能够用于实现内核中的 异步事件通知机制 。等待队列可以用来同步对系统资源的访问,在内核中, 信 号量也是依赖于等待队列来实现的 。 作用:所有的等待资源的任务都被放入到等待队列中。 二、实现 等待队列是一个队列数据结构所以,队列有等待队列头和等待队列项。 1 、定义“等待队列头” wait_queue_head_t my_head; 在使用的时候要先初始化以下,定义了几个队列,就初始化几次。 2 、初始化“等待队列头” init_waitqueue_head(&my_head); 在内核中 include/linux/wait.h 中定义如下 struct lock_class_key在内核中定义为空的结构体 在 kernel/wait.c 中__init_waitqueue_head函数的实现 第一句话的意思是自旋锁的初始化。最后一句话的意思是初始化队列头。 在 include/linux/list.h 中有实现代码: 在内核中为了方便使用,有一个宏可以完成等待队列头的定义和初始化: DECLARE_WAIT-QUEUE_HEAD(name); name 为队列头的名字 3 、定义等待队列 DECLARE_WAITQUEUE(name,tsk); 定义并初始化一个名为 name 的等待队列 name就是等待队列的名字,也是等待队列头的名字, tsk 一般是写如当前 的任务(进程) current (内核中的全局变量,代表当前任务)。 4 、添加 / 移除等待队列 void fastcall add_wait_queue(wait_queue_heat_t *q,wait_queue_t *wait); void fastcall remove_wait_queue(wait_queue_head_t *q ,wait_queue_t*wait) 5 、等待事件 wait_event(queue,condition);不可中断的等待事件 wait_event_interruptible(queue,condition); 可中断的等待事件,所以在使用 时候,要先判断是否由于中断返回还是有资源返回。 wait_event_timeout(queue,condition,timeout);timeout是等待的时间,超时就 会返回,同样的也是不可中断的 wait_event_interruptible_timeout(queue,condition,timeout); 同样的是可中断, 使用的时候也要判断。 Condition 为满足的条件。 6 、唤醒队列 void wake_up(wait_queue_head_t *queue);唤醒等待队列中的所有的任务 void wake_up_interruptible(wait_queue_head_t *queue);只唤醒可中断等待 的任务, 7 、在等待队列上睡眠 sleep_on(wait_queue_head_t *q);把当前任务设置为不可中断,不可中断的 等待态,并创建一个等待队列,并加入这个新创建的等待队列 interruptible_sleep_on(wait_queue_head_t *q);与上面的一样,就是,设置 状态为可中断的等待态。 三、程序分析 在本程序中用到了简单睡眠和手动睡眠两种方法。本驱动程序中的缓冲区 是一个循环的缓冲区,类似与循环队列。当 rp == rw 时候说明缓冲区空,定 rp 与 rw 相差 1 时候,说明缓冲区满。操作和循环队列类似。 程序的源代码如下: 1、头文件 驱动程序中所需要的头文件如下: 2、全局变

文档评论(0)

zxs4123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档