poll机制
使用POLL机制代替linux输入子系统(input subsystem)之按键输入和LED控制中的异步通知,实现同样的效果。
1.代码
只简单修改input_subsys_test.c, input_subsys_drv.c不变
input_subsys_test.c
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <stdio.h>
- #include <poll.h>
- #include <signal.h>
- #include <sys/types.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <linux/input.h>
- int fd;
- void my_signal_fun(int signum)
- {
- struct input_event buttons_event, leds_event;
- /* [cgw]: 异步通知产生时返回的数据 */
- read(fd, &buttons_event, sizeof(struct input_event));
- /* [cgw]: 打印事件类型,事件码,事件值 */
- printf("type: 0x%x code: 0x%x value: 0x%x\n",
- buttons_event.type,
- buttons_event.code,
- buttons_event.value);
- /* [cgw]: 返回的是KEY_L或KEY_S值 */
- if (buttons_event.code == KEY_L || buttons_event.code == KEY_S) {
- /* [cgw]: 按键弹起 */
- if (buttons_event.value == ) {
- /* [cgw]: 构造一个EV_LED事件 */
- //leds_event.type = EV_SND;
- leds_event.type = EV_LED;
- //leds_event.code = SND_BELL;
- leds_event.code = LED_MUTE;
- /* [cgw]: KEY_L和KEY_S控制LED的亮灭 */
- if (buttons_event.code == KEY_L) {
- leds_event.value = 0xAA;
- } else if (buttons_event.code == KEY_S) {
- leds_event.value = 0xEE;
- }
- /* [cgw]: 发送LED控制事件 */
- write(fd, &leds_event, sizeof(struct input_event));
- printf("led write!\n");
- }
- }
- }
- int main(int argc, char **argv)
- {
- int ret, arg;
- struct pollfd fds[];
- fd = open("/dev/event1", O_RDWR | O_NONBLOCK);
- //printf("fd = 0x%x\n", fd);
- if (fd < )
- {
- printf("can't open!\n");
- }
- /* [cgw]: 设置文件标识符 */
- fds[].fd = fd;
- /* [cgw]: 设置应用程序要响应的事件 */
- fds[].events = POLLIN;
- while ()
- {
- /* [cgw]: 休眠5S */
- ret = poll(fds, , );
- /* [cgw]: 唤醒或超时 */
- printf("wake up!\n");
- if (ret == )
- {
- printf("time out\n");
- }
- else
- {
- my_signal_fun(arg);
- }
- }
- return ;
- }
2. 实验
2.1
安装驱动程序:
insmod input_subsys_drv.ko
- # insmod input_subsys_drv.ko
- input: input_subsys_dev as /class/input/input1
- input subsys open!
- input subsys init!
运行应用程序
./input_subsys_test
- # ./input_subsys_test
- wake up!
- type: 0x1 code: 0x26 value: 0x1
- wake up!
- type: 0x1 code: 0x26 value: 0x0
- led event!
- value: 0xaa
- led write!
- wake up!
- type: 0x11 code: 0x7 value: 0xaa
- wake up!
- type: 0x1 code: 0x1f value: 0x1
- wake up!
- type: 0x1 code: 0x1f value: 0x0
- led event!
- value: 0xee
- led write!
- wake up!
- type: 0x11 code: 0x7 value: 0xee
- wake up!
- type: 0x1 code: 0x1c value: 0x1
- wake up!
- type: 0x1 code: 0x1c value: 0x0
- wake up!
- time out
- wake up!
- time out
3. 现象分析
按一下按键KEY_L,终端输出:
- wake up!
- type: 0x1 code: 0x26 value: 0x1
- wake up!
- type: 0x1 code: 0x26 value: 0x0
- led event!
- value: 0xaa
- led write!
- wake up!
- type: 0x11 code: 0x7 value: 0xaa
poll机制的更多相关文章
- 嵌入式Linux驱动学习之路(十二)按键驱动-poll机制
实现的功能是在读取按键信息的时候,如果没有产生按键,则程序休眠在read函数中,利用poll机制,可以在没有退出的情况下让程序自动退出. 下面的程序就是在读取按键信息的时候,如果5000ms内没有按键 ...
- Linux学习 :中断处理机制 & poll机制
中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务 的程序中去,服务完毕后再返回去继续运行被暂时中断的程序 ...
- 入门级的按键驱动——按键驱动笔记之poll机制-异步通知-同步互斥阻塞-定时器防抖
文章对应视频的第12课,第5.6.7.8节. 在这之前还有查询方式的驱动编写,中断方式的驱动编写,这篇文章中暂时没有这些类容.但这篇文章是以这些为基础写的,前面的内容有空补上. 按键驱动——按下按键, ...
- 韦东山驱动视频笔记——3.字符设备驱动程序之poll机制
linux内核版本:linux-2.6.30.4 目的:我们在中断方式的按键应用程序中,如果没有按键按下,read就会永远在那等待,所以如果在这个程序里还想做其他事就不可能了.因此我们这次改进它,让它 ...
- poll机制分析
更多文档:http://pan.baidu.com/s/1sjzzlDF linux poll/select用法及在字符驱动中的简单实现 1.poll和select 使用非阻塞I/O 的应用程序常常使 ...
- poll机制分析[转]
所有的系统调用,基于都可以在它的名字前加上"sys_"前缀,这就是它在内核中对应的函数.比如系统调用open.read.write.poll,与之对应的内核函数为:sys_open ...
- 8.中断按键驱动程序之poll机制
本节继续在上一节中断按键程序里改进,添加poll机制. 那么我们为什么还需要poll机制呢.之前的测试程序是这样: ) { read(fd, &key_val, ); printf(" ...
- 字符设备驱动(六)按键poll机制
title: 字符设备驱动(六)按键poll机制 tags: linux date: 2018-11-23 18:57:40 toc: true --- 字符设备驱动(六)按键poll机制 引入 在字 ...
- Linux驱动之poll机制的理解与简单使用
之前在Linux驱动之按键驱动编写(中断方式)中编写的驱动程序,如果没有按键按下.read函数是永远没有返回值的,现在想要做到即使没有按键按下,在一定时间之后也会有返回值.要做到这种功能,可以使用po ...
随机推荐
- php修改
做出一张表,点击登录后进入此表 然后多建立一个<td></td>用来增加一列操作 <h1>英雄联盟英雄表</h1> <table width= ...
- js倒计时-倒计输入的时间
计算指定时间到指定时间之间相差多少天.时.分.秒. 节日.活动.商城常用. 原理: 主要使用到时间戳,也就是从1970 年 1 月 1 日 到指定时间的毫秒数. 1. 求出毫秒差 :当两个时间直接进行 ...
- JMeter压力测试
Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域. 它可以用于测试静态和动态资源例如静态文件. ...
- IOC的理解
转载http://www.cnblogs.com/xdp-gacl/p/4249939.html 很不错的文章,虽说是java的,但是.net也通用,所以复制一分,拿来看看挺不错的. 1.1.IoC是 ...
- springmvc环境搭建以及常见问题解决
1.新建maven工程 a) 打开eclipse,file->new->project->Maven->Maven Project b) 下一步 c) 选择创建的工程为 ...
- ASP.NET Core真实管道详解[2]:Server是如何完成针对请求的监听、接收与响应的【上】
Server是ASP .NET Core管道的第一个节点,负责完整请求的监听和接收,最终对请求的响应同样也由它完成.Server是我们对所有实现了IServer接口的所有类型以及对应对象的统称,如下面 ...
- Bagging与随机森林算法原理小结
在集成学习原理小结中,我们讲到了集成学习有两个流派,一个是boosting派系,它的特点是各个弱学习器之间有依赖关系.另一种是bagging流派,它的特点是各个弱学习器之间没有依赖关系,可以并行拟合. ...
- 6.JAVA之GUI编程Action事件
功能:单击一个按钮实现关闭窗口: import java.awt.*; import java.awt.event.*; public class StudyAction { // 定义该图形所需的组 ...
- 深入理解CSS过渡transition
× 目录 [1]定义 [2]过渡属性 [3]持续时间[4]延迟时间[5]时间函数[6]多值[7]阶段[8]触发[9]API 前面的话 通过过渡transition,可以让web前端开发人员不需要jav ...
- STemwin汉字显示
硬件环境: STM32F429,电容屏800X480 5点触控RGB屏幕 ,SPI flash: 软件环境: UCOSIII,STemwin: 汉字显示方法: 1.在SPIflash中装在字库XBF_ ...