1 采用之前的中断按键法,程序会一直在read函数中死循环。
 2     使用了poll之后,在一段时间内如果有按键按下就会返回,如果没有按键按下等时间到再返回。
 3
 4 应用程序的open,read,write,poll分别对应了驱动程序的open,read,write和poll。
 5 首先,增加fileoperation结构体。
 6
 7 static struct file_operations third_drv_fops = {
 8     .owner = THIS_MODULE,
 9     .open  = third_drv_open,
10     .read  = third_drv_read,
11     .write = third_drv_write,
12     .poll  = third_drv_poll,
13 };
14
15 copy的poll函数如下:
16 staitc unsigned mounts_poll(struct file *file,poll_table *wait)
17 {
18     struct proc_mounts *p = file->private_data;
19     struct mnt_namespace *ns = p->m.private;
20     unsigned res = 0;
21
22     poll_wait(file,&ns->poll,wait);
23
24     spin_lock(&vfsmount_lock);
25     if(p->event != ns->event)
26     {
27         p->event = ns->event;
28         res = POLLERR;
29     }
30     spin_unlock(&vfsmount_lock);
31     return res;
32 }
33
34 其中的核心部分为:
35     poll_wait(file,&ns->poll,wait);
36
37
38 static unsigned forth_drv_poll(struct file *file,poll_table *wait)
39 {
40     unsigned mask = 0;
41     poll_wait(file,&button_waitq,wait);    //不会立刻进入休眠
42
43     if(ev_press)
44         mask |= POLLIN | POLLRDNORM;
45 }
46
47 系统调用poll时,它们对应的内核函数是sys_poll。
48 sys_poll核心是调用了do_sys_poll函数。
49
50 app:    调用poll函数
51 kernel:    调用sys_poll函数
52         do_sys_poll(ufds,nfds,&timeout_jiffies);//第三个参数是超时参数。
53             poll_initwait(&table);
54             do_poll(nfds,head,&table,timeout);
55
56
57 修改后的测试程序:
58 int main(int argc,char** argv)
59 {
60     int fd;
61     unsigned char key_val;
62
63     struct pollfd fds[1];    //需要检测的文件个数为一
64
65     fd = open("/dev/buttons",O_RDWR);
66     if(fd < 0)
67         printf("can't open buttons\n");
68 //poll相关设置
69     fds[0].fd = fd;            //打开的文件为fd
70     fds.[0].enents = POLLIN;    //pollin表示有数据待读取
71
72     while(1)
73     {
74         ret = poll(fds,1,5000);    //参数分别为fds(结构体),1为文件个数,5000为事件。
75     //返回值为0表示超时
76         if(ret == 0)
77         {
78             printf("timeout!\n");
79         }
80         read(fd,&key_val,1);
81         printf("key_val = 0x%x\n",key_val);
82     }
83 }

转载于:https://www.cnblogs.com/stm32f4/p/8351192.html

字符驱动之按键(四:poll机制)相关推荐

  1. 从零开始之驱动发开、linux驱动(十四、字符驱动之按键中断方式实现和等待队列分析)

    第8节的轮询方式查询按键,非常的浪费CPU资源,这一节主要就是来解决这个问题的. 第12节的中断程序框架也给了出来,这一节我们来完成中断方式的代码实现和分析. 这节是通过使用等待队列的方式来解决CPU ...

  2. 字符驱动之按键(一:无脑轮询法)

    一.添加头文件二.构造fileoperation结构体static struct fileoperations second_drv_fops = {.owner = THIS_MODULE;.ope ...

  3. poll机制读取按键值

    poll机制 https://blog.csdn.net/frankyzhangc/article/details/6692210 较好的帖子 https://www.cnblogs.com/yihu ...

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

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

  5. Linux驱动入门(四)非阻塞方式实现按键驱动

    Linux驱动入门系列 Linux驱动入门(一)字符设备驱动基础 Linux驱动入门(二)操作硬件 Linux驱动入门(三)Led驱动 Linux驱动入门(四)非阻塞方式实现按键驱动 Linux驱动入 ...

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

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

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

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

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

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

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

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

最新文章

  1. 量子计算机是二进制码,知识丨量子计算
  2. NDK 交叉编译常用变量
  3. redhat7防火墙关闭_Linux7关闭防火墙
  4. 案例分析 | 由Decimal操作计算引发的Spark数据丢失问题
  5. 商品pid是什么意思_0基础搞懂自动驾驶传统算法与深度学习的鸿沟-PID控制算法与MLP优化方法...
  6. HTTP之Last-Modified、Etage、If-Modified-Since理论与实践(C++ Qt实现)
  7. 华为鸿蒙OS发布!余承东:如果安卓不可用,随时启用鸿蒙
  8. APPCAN学习笔记005---AppCan IDE安装下载,AppCan IDE启动
  9. Jakarta-ORO正则表达式的运用
  10. 区块链开发入门书籍和文档
  11. less知识点总结(二)
  12. mysql56允许远程连接_mysql允许远程连接的方法
  13. LINUX下载编译LanguageTool
  14. ToStringBuilder学习总结
  15. 情人节送男生什么礼物好,情人节送礼清单
  16. 蝰蛇音效音效包_用数据科学分析音效迷艺术
  17. 程序员的自我修养 -- 读书笔记
  18. Word中批量插入图片,自动排版
  19. vue中基础理论知识
  20. vectorvn1610报价_【德国VECTOR VN1610模块】价格_厂家 - 中国供应商

热门文章

  1. Caused by: java.lang.IllegalStateException: StandardEngine[Tomcat].StandardHost[localhost].TomcatEmb
  2. 使用枚举完成学生类,性别的设置。
  3. php暂停循环,在特定数量的递归循环后,PHP停止执行
  4. Exception in thread main com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport e
  5. Oracle存储过程中如何根据指定的参数判断该参数的值否存在数据表中:
  6. leetcode181. 超过经理收入的员工(SQL)
  7. pytorch学习入门 (二) Variable(变量)
  8. Linux(9)--添加新用户+赋sudo权限
  9. OpenCL 第6课:矩阵转置
  10. 中国历史上影响最大的10首诗