poll机制 https://blog.csdn.net/frankyzhangc/article/details/6692210

较好的帖子 https://www.cnblogs.com/yihujiu/p/6397988.html

应用程序执行poll调用后,如果①②的条件不满足,进程就会进入休眠。那么,谁唤醒呢?除了休眠到指定时间被系统唤醒外,还可以被驱动程序唤醒──记住这点,这就是为什么驱动的poll里要调用poll_wait的原因

驱动程序:

驱动程序里与poll相关的地方有两处:一是构造file_operation结构时,要定义自己的poll函数。二是通过poll_wait来调用上面说到的__pollwait函数,__pollwait函数,从它的代码可知,它只是把当前进程挂入我们驱动程序里定义的一个队列里而已。

执行到驱动程序的poll_wait函数时,进程并没有休眠,我们的驱动程序里实现的poll函数是不会引起休眠的。让进程进入休眠,是前面分析的do_sys_poll函数的30行“__timeout = schedule_timeout(__timeout)”。

poll_wait只是把本进程挂入某个队列,应用程序调用poll > sys_poll> do_sys_poll > poll_initwait,do_poll > do_pollfd > 我们自己写的poll函数后,再调用schedule_timeout进入休眠。如果我们的驱动程序发现情况就绪,可以把这个队列上挂着的进程唤醒。可见,poll_wait的作用,只是为了让驱动程序能找到要唤醒的进程。即使不用poll_wait,我们的程序也有机会被唤醒:chedule_timeout(__timeout),只是休眠__time_out这段时间。

现在来总结一下poll机制:

1. poll > sys_poll > do_sys_poll >poll_initwait,poll_initwait函数注册一下回调函数__pollwait,它就是我们的驱动程序执行poll_wait时,真正被调用的函数。

2. 接下来执行file->f_op->poll,即我们驱动程序里自己实现的poll函数

它会调用poll_wait把自己挂入某个队列,这个队列也是我们的驱动自己定义的;

它还判断一下设备是否就绪。

3. 如果设备未就绪,do_sys_poll里会让进程休眠一定时间,这个时间是应用提供的“超时时间”

4. 进程被唤醒的条件有2:一是上面说的“一定时间”到了,二是被驱动程序唤醒。驱动程序发现条件就绪时,就把“某个队列”上挂着的进程唤醒,这个队列,就是前面通过poll_wait把本进程挂过去的队列。

5. 如果驱动程序没有去唤醒进程,那么chedule_timeout(__timeou)超时后,会重复2、3动作1次,直到应用程序的poll调用传入的时间到达, 然后返回。

---------------------------------------------------------------------------------------------------------------

poll机制:为了减少CPU资源的占用率,在编写驱动函数中添加poll机制

select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。

POLL:应用程序在一定时间内没有事件发生回返回来执行其它下面函数

先说poll,poll或select为大部分Unix/Linux程序员所熟悉,这俩个东西原理类似,性能上也不存在明显差异,但select对所监控的文件描述符数量有限制,所以这里选用poll做说明。

poll是一个系统调用,其内核入口函数为sys_poll,sys_poll几乎不做任何处理直接调用do_sys_poll,do_sys_poll的执行过程可以分为三个部分:

1,将用户传入的pollfd数组拷贝到内核空间,因为拷贝操作和数组长度相关,时间上这是一个O(n)操作,这一步的代码在do_sys_poll中包括从函数开始到调用do_poll前的部分。

2,查询每个文件描述符对应设备的状态,如果该设备尚未就绪,则在该设备的等待队列中加入一项并继续查询下一设备的状态。查询完所有设备后如果没有一个设备就绪,这时则需要挂起当前进程等待,直到设备就绪或者超时,挂起操作是通过调用schedule_timeout执行的。设备就绪后进程被通知继续运行,这时再次遍历所有设备,以查找就绪设备。这一步因为两次遍历所有设备,时间复杂度也是O(n),这里面不包括等待时间。相关代码在do_poll函数中。

3,将获得的数据传送到用户空间并执行释放内存和剥离等待队列等善后工作,向用户空间拷贝数据与剥离等待队列等操作的的时间复杂度同样是O(n),具体代码包括do_sys_poll函数中调用do_poll后到结束的部分。

poll实现步骤:

1、在驱动函数file_operation结构体上添加一个.poll函数,然后在函数里执行poll_wait,这个函数用来判断硬件事件是否发生

2、测试程序需要调用ret = poll(fds, 1, 5000)函数来获取事件发生信息。

比如一个按键事件: 为什么要有poll机制

1、查询方法:一直在查询,不断去查询是否有事件发生,整个过程都是占用CPU资源,消耗CPU资源非常大。

2、中断方式:当有事件发生时,就去跳转到相应事件去处理,CPU占用时间少。

3、poll方式: 中断方式虽然占用CPU资源少,但是在应用程序上需要不断在死循环里面执行读取函数,应用程序不能去做其它事情。poll机制解决了这个问题,当有事件发生时,才去执行读read函数,按键事件没有按下时,超过时间后返回,去执行其它的处理函数。

===================================下面是程序分析==============================

驱动程序

1、需要添加头文件,顺带修改log

2、定义一个全局变量,保存键值

3、根据寄存器读出的值改变键值,key_press主要用来做中断标记

key_press = 1; //表示有中断发生了

wake_up_interruptible(&kwait); /* 唤醒休眠的进程 */

4、判断中断标志

5、把键值上传到用户空间

wait_event_interruptible(kwait, key_press); /* 如果没有按键动作,休眠 判断条件为key_press=0 休眠

if(!copy_to_user(buffer, &key_value, 1)) ///* 如果有按键动作, 返回键值 */

6、把上升沿添加,变成跳变沿

7、poll机制需要添加的

static unsigned int key_poll(struct file *file, poll_table *wait)

mask |= POLLIN | POLLRDNORM;

poll_wait(file, &kwait, wait); // 不会立即休眠

设备驱动中的poll() 函数原型如下

unsigned int(*poll)(struct file *filp, struct poll_table * wait);

第一个参数是file结构体指针,第二个参数是轮询表指针,poll设备方法完成两件事:

a -- 对可能引起设备文件状态变化的等待队列调用poll_wait()函数,将对应的等待队列头添加到poll_table,如果没有文件描述符可用来执行 I/O, 则内核使进程在传递到该系统调用的所有文件描述符对应的等待队列上等待。

b -- 返回表示是否能对设备进行无阻塞读、写访问的掩码。

位掩码:POLLRDNORM, POLLIN,POLLOUT,POLLWRNORM

设备可读,通常返回:(POLLIN | POLLRDNORM)

设备可写,通常返回:(POLLOUT | POLLWRNORM)

8、添加poll函数

9、修改设备名称

应用程序

把poll函数加上,如果没有中断触发,隔一万毫秒循环读一次

int poll(struct pollfd *fds,nfds_t nfds, int timeout);

总的来说,Poll机制会判断fds中的文件是否可读,如果可读则会立即返回,返回的值就是可读fd的数量,如果不可读,那么就进程就会休眠timeout这么长的时间,然后再来判断是否有文件可读,如果有,返回fd的数量,如果没有,则返回0.

count=poll(&pfd, 1, 10000); //有按键中断时返回1,无时为0

pfd.fd=fd;

27 pfd.events = POLLIN;\

29 poll(&pfd, 1, 5000);

测试

应用

驱动

poll机制读取按键值相关推荐

  1. TM1650读取按键值异常

    本人刚参加工作两三个月,目前公司开发需要自己做一些小工具,现在用一个旧版本的TM1650做一个矩阵键盘的按键板,原理图局部如下,基本就是参考官方的手册里的图设计的. 在读取按键值(函数如下)是发现不管 ...

  2. linux poll机制 阻塞,linux poll机制使用(一)

    一.poll机制的作用 1.poll机制的作用 在前面的使用中断的的方式来读取按键值(linux 中断管理(四)).使用这种方式读取按键,如果按键没有按下的时候,应用程序会一直处于睡眠的状态.如果想要 ...

  3. TM1650数码管驱动芯片驱动数码管读取按键程序

    折腾了四五个小时,官方给的datasheet有不少的问题,这里纠正一下按键读取时序错误: 读取的数据跟文档里面的数据提前了一位,在这里给大家提个醒! 下面贴上代码 c文件: #include &quo ...

  4. linux 内核驱动的poll,嵌入式Linux驱动开发(五)——poll机制原理以及驱动实现...

    前情回顾: 再开始今天的内容之前,先简单review一下,我们都用了什么方案来获取按键值,他们的特点都是什么.只有不断地理清了思路,我们才能够更好的理解,为何会出现如此多的解决方案,当遇到问题的时候, ...

  5. 字符设备驱动程序之poll机制(韦大仙)

    明确为什么要引用poll机制? while(1) { read(fd,&key_val,1);//如果没有按键按下,它会一直在等待.现在想做这么一件事情:如果5s后,没有按键按下,它就会返回. ...

  6. 字符设备驱动程序之poll机制

    前面的按键中断驱动,只能实现当有按键按下的时候,输出,平时cpu处于休眠状态.如果我想实现,休眠一段时间执行一些指令,当有中断发生时,cpu又可以立即响应.那就得用poll机制. poll机制分析 韦 ...

  7. 韦东山驱动视频笔记——3.字符设备驱动程序之poll机制

    linux内核版本:linux-2.6.30.4 目的:我们在中断方式的按键应用程序中,如果没有按键按下,read就会永远在那等待,所以如果在这个程序里还想做其他事就不可能了.因此我们这次改进它,让它 ...

  8. linux 内核驱动的poll,Linux驱动基石之POLL机制

    来源:百问网 作者:韦东山 本文字数:2344,阅读时长:4分钟 1.适用场景 在前面引入中断时,我们曾经举过一个例子: 妈妈怎么知道卧室里小孩醒了? 时不时进房间看一下:查询方式 简单,但是累 进去 ...

  9. c++ linux 线程等待与唤醒_Linux驱动程序基石-POLL机制(附.视频)

    今天<升级版全系列嵌入式视频_入门篇>新增一节视频:19.2_POLL机制 时长24分钟,免费观看 何为POLL机制? 给驱动程序加一个闹钟,让APP不必死等数据: 既可以快速掌握 POL ...

最新文章

  1. SQL Server日志清除的两种方法 .
  2. 使用Nginx实现服务器反向代理和负载均衡
  3. “三通一达”创始人均来自桐庐 有的村人均GDP上亿
  4. C++ STL的妙用
  5. icmp端口_pingtunnel搭建icmp隧道
  6. idea javafx添加maven_maven+IDEA+JavaFX+JFoenix
  7. java源代码连接jsp,java网络五子棋的源代码-JSP教程,Java技巧及代码
  8. 临界区设计太大或太小有何缺点_小户型太小怎么办?17个实用空间设计拯救你家,小家越住越大...
  9. 解决从登录页通过this.$router.push跳转首页后 点返回健路由变而页面不变的问题
  10. leetcode之前K个高频元素
  11. easyx按钮透明度特效_【素材】100组4K灰尘粒子烟雾特效
  12. 配置HP LaserJet M1536dnf MFP打印机通过TCPIP共享多台计算机
  13. “蔚来杯“2022牛客暑期多校训练营5:A Don‘t Starve
  14. 深蓝代表的计算机应用领域是,2002年10月高等教育自学考试计算机应用基础
  15. java学习笔记 - 集合类综合案例 斗地主
  16. Ubuntu 22.4网易云音乐启动失败处理方法
  17. C/C++找工作这点事
  18. trufflle init 出现 unbox fail的情况
  19. Opencv+ZBar识别条形码、二维码
  20. IEEE 2017 STAM16 阅读笔记

热门文章

  1. 【JAVA】超简单的1-100猜数字小游戏
  2. 阅读笔记:养女儿的四大要点!
  3. 禁用SpringSecurity安全配置
  4. selectedIndex
  5. spring security导致登录后从https跳转至http解决方案
  6. JS-firstChild,firstElementChild,lastChild,firstElementChild,nextSibling,nextElementSibling
  7. (六)播放暂停、下一曲、上一曲功能实现
  8. 如何构建更加高效、准确的对话模型:ChatGPT和大规模预训练模型
  9. Java偏序关系_java中的偏序关系
  10. Multi-exposure image fusion via deep perceptual enhancement 通过深度感知增强实现多曝光图像融合