字符驱动之按键(四: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452879.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第二章 API的理解和使用

2.1.1全局命令 Key * 查看所有键&#xff0c;(慎用&#xff0c;会把所有键都遍历一次并列出) Dbsize 查看键总数&#xff0c;不会遍历所有键&#xff0c;只是从内置函数中读取一个数 Exists [key] 检查键是否存在 Del [key] 删除键 Expire [key] [seconds] 设置键过期时间 Type…

java uuid 线程安全_java – 在多线程应用程序中生成相同的UUID

我使用UUID.randomUUID().toString()将一个唯一值附加到最终存储在数据库中的字符串,并对其具有唯一约束但是因为我的应用程序是多线程的,所以执行在UUID生成的同时发生,并且最终将相同的UUID附加到字符串并且持久性失败.有没有更好的方法来生成随机字符串,即故障安全方法.我尝…

社会生活、工作中的著名法则

社会生活中的著名法则(1)&#xff1a;马太效应 《新约 马太福音》中有这样一个故事&#xff0c;一个国王远行前&#xff0c;交给三个仆人每人一锭银子&#xff0c;吩咐他们&#xff1a;“你们去做生意&#xff0c;等我回来时&#xff0c;再来见我。”国王回来时&#xff0c;第一…

Django中--使用redis存储历史浏览记录

class UserInfoView(LoginRequiredMixin, View):用户中心-信息页def get(self, request):显示# Django会给request对象添加一个属性request.user# 如果用户未登录->user是AnonymousUser类的一个实例对象# 如果用户登录->user是User类的一个实例对象# request.user.is_aut…

3D虚拟试衣有望解决厘米级服装误差 网购服装不再蒙

还在担心网购服装对实际穿着效果没把握吗&#xff1f;随着京东App 6.6.3版本的更新&#xff0c;京东试试3D虚拟试衣功能正式上线&#xff0c;消费者可按照自己的身材比例创建专属的3D模型&#xff0c;而试穿效果则可以完全依照模型来展现。据了解&#xff0c;这个系统未来还将实…

关于idea修改当前使用的git账户的问题

1、问题描述&#xff1a; 由于前一段时间公司迁移git&#xff0c;就是将项目代码等迁移到另一个git服务器上&#xff0c;结果用idea从git上clone代码的时候发现没有指定仓库,如下提提示 2、排查原因&#xff1a; 开始怀疑是没有把自己加入到项目成员里面&#xff0c;经过检查是…

分页和分段的区别

1.页是信息的物理单位&#xff0c;分页是由于系统管理的需要。段是信息的逻辑单位&#xff0c;分段是为了满足用户的要求。 2.页的大小固定且由系统决定&#xff0c;段的长度不固定&#xff0c;决定于用户所编写的程序&#xff0c;通常由编译程序在对源程序紧进行编译 时&…

java 修饰_Java 修饰符

摘录自http://www.runoob.com/java/java-modifier-types.htmlJava 修饰符Java语言提供了很多修饰符&#xff0c;主要分为以下两类&#xff1a;访问修饰符非访问修饰符修饰符用来定义类、方法或者变量&#xff0c;通常放在语句的最前端。我们通过下面的例子来说明&#xff1a;pu…

内存分配,任意字节对齐

有这么一道题目&#xff0c;要求按任意字节对齐分配内存&#xff0c;接口&#xff1a;char * aligned_malloc(int size, int alignment)//size 为分配的内存大小&#xff0c;alignment对齐基数&#xff08;可以为任意数&#xff09;这个在gcc库函数里能找到源码&#xff0c;在f…

day16-Dom提交表单以及其他

一、前言 之前我们学习的是from提交表单&#xff0c;那个是html的提交表单方式&#xff0c;现在我们用dom来提交表单&#xff0c;还有一些其他的方式 二、dom提交表单 2.1、html提交表单 说明&#xff1a;form标签跟submit类型的input标签结合 <body><form id"f1…

分布式文件系统FastDFS

1. 什么是FastDFS FastDFS 是用 c 语言编写的一款开源的分布式文件系统。FastDFS 为互联网量身定制&#xff0c; 充分考虑了冗余备份、负载均衡、线性扩容等机制&#xff0c;并注重高可用、高性能等指标&#xff0c;使用 FastDFS 很容易搭建一套高性能的文件服务器集群提供文件…

html5 下拉刷新(pc+移动网页源码)

本文demo下载地址&#xff1a;http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId1071 本文实现在html5网页中使用下拉功能自动刷新显示更多内容, 使用jquery捕捉和处理相应的鼠标事件, 例如内容在顶部时&#xff0c;触发下拉事件后显示更多内容; 如内容在…

操作系统内存管理问题集锦

1. 可采用哪几种方式将程序装入内存?它们分别适用于何种场合? a. 首先由编译程序将用户源代码编译成若干目标模块&#xff0c;再由链接程序将编译后形成的目标模块和所需的-库函数链接在一起&#xff0c;组成一个装入模块&#xff0c;再由装入程序将装入模块装入内存&#x…

java同名变量在list中添加两次_快速解决List集合add元素,添加多个对象出现重复的问题...

首先我们在new 一个对象的时候&#xff0c;对象的id是唯一确定的&#xff1b;将对象add入list中时&#xff0c;放入list中的其实是对象的引用 &#xff1b;而每次循环只是简单的set 对象的属性&#xff0c;set新的属性值&#xff0c;而add进list中的对象还是同一个对象id&#…

python面试题总结(1)--语言特性

1. 谈谈对 Python 和其他语言的区别 答&#xff1a; Python 是一门强类型的可移植、可扩展、可嵌入的解释型编程语言&#xff0c;属于动态语言&#xff1b;其语法简洁优美、功能强大无比、应用领域非常广泛且具有强大完备的第三方库。 &#xff08;注&#xff1a;语言有无类型…

视频网站盈利模式与营销策划

在与数十家视频网站进行信息网络传播权交易过程中&#xff0c;在研究视频网站内容和盈利模式基础上&#xff0c;综合自己在传统媒体和新媒体领域十几年的策划和营销经验&#xff0c;我发现&#xff1a;视频网站的盈利模式其实早就形成多种体系&#xff0c;但是盈利之路艰难&…

USACO 06JAN 牛的舞会 洛谷2863

题目描述 The N (2 < N < 10,000) cows are so excited: it’s prom night! They are dressed in their finest gowns, complete with corsages and new shoes. They know that tonight they will each try to perform the Round Dance. Only cows can perform the Round…

[UWP]了解模板化控件(4):TemplatePart

原文:[UWP]了解模板化控件(4)&#xff1a;TemplatePart1. TemplatePart TemplatePart&#xff08;部件&#xff09;是指ControlTemplate中的命名元素。控件逻辑预期这些部分存在于ControlTemplate中&#xff0c;并且使用protected DependencyObject GetTemplateChild(String ch…

动态重定位的增加的紧凑功能

动态重定位增加了紧凑的功能&#xff0c;在动态的分区分配时&#xff0c;可以对外部碎片进行紧凑来为没有内存空间进行存储的进程进行分配。

java 重载 equals_实现Student类的equals重载函数

[java]代码库//测试类public class StudentDemo {public static void main(String[] args) {Student s1 new Student("000","张三",18);Student s2 new Student("000","张三",18);//随便改boolean flag s1.equals(s2);System.out.p…