3514|1

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

Linux驱动之按键读取心得 [复制链接]

当一个进程睡眠, 它这样做以期望某些条件在以后会成真.任何睡眠的进程必须在它再次醒来时检查来确保它在等待的条件真正为真. 最常用的函数为:
    wait_event_interruptible(queue, condition)
其中queue 是要用的等待队列头. 注意它是"通过值"传递的. 条件是一个被这个宏在睡眠前后所求值的任意的布尔表达式; 直到条件求值为真值, 进程继续睡眠。
睡眠唤醒的函数为:
    void wake_up_interruptible(wait_queue_head_t *queue);
通过视频中将到的代码可以看出,使用了wait_event_interruptible()后,测试程序使用while循环读取按键状态也不会占据99%的CPU资源了, 进程会在条件不满足时进入睡眠,知道按键按下后,由wake_up_interruptible() 唤醒。
同步的另一种方法是使用select、poll机制。它是一种非阻塞 I/O 的应用程序常常使用的机制。 poll, select 和 epoll 本质上有相同的功能: 每个允许一个进程来决定它是否可读或者写一个或多个文件而不阻塞。file_operations结构体中poll的原型为:
unsigned int (*poll) (struct file *filp, poll_table *wait);  函数主要的作用就是为用户空间的poll、select提供一个系统调用。最后返回一个mask。
视频中poll的代码很简单,主要使用了poll_wait ()函数。
void poll_wait (struct file *, wait_queue_head_t *, poll_table *);
用户空间在调用poll前设置了struct pollfd fds[1];通过对fd和events参数的指定,使得在fd发生了events指定的条件后唤醒。最后判断ev_press是否按下,并返回位掩码。应用程序通过返回值是否为0判断是否需要读取按键状态。
视频还讲了一种异步的方法读取按键值。file_operations结构体中fasync原型为:
int(*fasync) (int fd, struct file *filp, int on)
驱动程序需要在该函数中通过fasync_helper()实现。fasync_helper 被调用来从相关的进程列表中添加或去除入口项, 当 FASYNC 标志因一个打开文件而改变。它的所有参数除了最后一个, 都被提供给 fasync 方 法并且被直接传递。当数据到达时 kill_fasync 被用来通知相关的进程。它的 参数是被传递的信号(常常是 SIGIO) 和 band, 这几乎都是 POLL_IN。
中断触发后通过kill_fasync()来唤醒进程。应用程序中signal设置信号,fcntl设置FASYNC标志位。
此帖出自ARM技术论坛

最新回复

调用来从相关的进程列表中添加或  详情 回复 发表于 2015-5-4 10:18
点赞 关注
 

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
调用来从相关的进程列表中添加或
此帖出自ARM技术论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表