字符驱动之按键(四:poll机制)
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机制)相关推荐
- 从零开始之驱动发开、linux驱动(十四、字符驱动之按键中断方式实现和等待队列分析)
第8节的轮询方式查询按键,非常的浪费CPU资源,这一节主要就是来解决这个问题的. 第12节的中断程序框架也给了出来,这一节我们来完成中断方式的代码实现和分析. 这节是通过使用等待队列的方式来解决CPU ...
- 字符驱动之按键(一:无脑轮询法)
一.添加头文件二.构造fileoperation结构体static struct fileoperations second_drv_fops = {.owner = THIS_MODULE;.ope ...
- poll机制读取按键值
poll机制 https://blog.csdn.net/frankyzhangc/article/details/6692210 较好的帖子 https://www.cnblogs.com/yihu ...
- 韦东山驱动视频笔记——3.字符设备驱动程序之poll机制
linux内核版本:linux-2.6.30.4 目的:我们在中断方式的按键应用程序中,如果没有按键按下,read就会永远在那等待,所以如果在这个程序里还想做其他事就不可能了.因此我们这次改进它,让它 ...
- Linux驱动入门(四)非阻塞方式实现按键驱动
Linux驱动入门系列 Linux驱动入门(一)字符设备驱动基础 Linux驱动入门(二)操作硬件 Linux驱动入门(三)Led驱动 Linux驱动入门(四)非阻塞方式实现按键驱动 Linux驱动入 ...
- 字符设备驱动程序之poll机制
前面的按键中断驱动,只能实现当有按键按下的时候,输出,平时cpu处于休眠状态.如果我想实现,休眠一段时间执行一些指令,当有中断发生时,cpu又可以立即响应.那就得用poll机制. poll机制分析 韦 ...
- linux 内核驱动的poll,嵌入式Linux驱动开发(五)——poll机制原理以及驱动实现...
前情回顾: 再开始今天的内容之前,先简单review一下,我们都用了什么方案来获取按键值,他们的特点都是什么.只有不断地理清了思路,我们才能够更好的理解,为何会出现如此多的解决方案,当遇到问题的时候, ...
- linux 内核驱动的poll,Linux驱动基石之POLL机制
来源:百问网 作者:韦东山 本文字数:2344,阅读时长:4分钟 1.适用场景 在前面引入中断时,我们曾经举过一个例子: 妈妈怎么知道卧室里小孩醒了? 时不时进房间看一下:查询方式 简单,但是累 进去 ...
- 字符设备驱动程序之poll机制(韦大仙)
明确为什么要引用poll机制? while(1) { read(fd,&key_val,1);//如果没有按键按下,它会一直在等待.现在想做这么一件事情:如果5s后,没有按键按下,它就会返回. ...
最新文章
- 量子计算机是二进制码,知识丨量子计算
- NDK 交叉编译常用变量
- redhat7防火墙关闭_Linux7关闭防火墙
- 案例分析 | 由Decimal操作计算引发的Spark数据丢失问题
- 商品pid是什么意思_0基础搞懂自动驾驶传统算法与深度学习的鸿沟-PID控制算法与MLP优化方法...
- HTTP之Last-Modified、Etage、If-Modified-Since理论与实践(C++ Qt实现)
- 华为鸿蒙OS发布!余承东:如果安卓不可用,随时启用鸿蒙
- APPCAN学习笔记005---AppCan IDE安装下载,AppCan IDE启动
- Jakarta-ORO正则表达式的运用
- 区块链开发入门书籍和文档
- less知识点总结(二)
- mysql56允许远程连接_mysql允许远程连接的方法
- LINUX下载编译LanguageTool
- ToStringBuilder学习总结
- 情人节送男生什么礼物好,情人节送礼清单
- 蝰蛇音效音效包_用数据科学分析音效迷艺术
- 程序员的自我修养 -- 读书笔记
- Word中批量插入图片,自动排版
- vue中基础理论知识
- vectorvn1610报价_【德国VECTOR VN1610模块】价格_厂家 - 中国供应商
热门文章
- Caused by: java.lang.IllegalStateException: StandardEngine[Tomcat].StandardHost[localhost].TomcatEmb
- 使用枚举完成学生类,性别的设置。
- php暂停循环,在特定数量的递归循环后,PHP停止执行
- Exception in thread main com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport e
- Oracle存储过程中如何根据指定的参数判断该参数的值否存在数据表中:
- leetcode181. 超过经理收入的员工(SQL)
- pytorch学习入门 (二) Variable(变量)
- Linux(9)--添加新用户+赋sudo权限
- OpenCL 第6课:矩阵转置
- 中国历史上影响最大的10首诗