Linux_12th_异步通知

原创 2017年01月03日 08:22:48

异步通知:

之前的三种读取按键电平状态的方法分别是:查询法、中断法、中断+Poll机制。

这三种方法都需要应用程序主动去读取,我们可以进一步改进,
如果应用程序可以休眠或者做别的事情,当发生按键中断时,驱动中的中断服务函数来主动提醒应用程序去读取就好了。
这个设想可以通过驱动程序给应用程序发信号的方法来实现。
首先明确,目的? 当按键按下时,驱动程序去提醒应用程序读取按键值。(即实现驱动和应用之间的异步通知)
 1.怎么做?    使用信号机制来实现,也就是发信号。
 2.谁发?        驱动程序发信号。
 3.怎么发?    使用kill_fasync
 4.发给谁?    发给应用程序。(应用程序事先要告诉驱动自己的PID)
 5.收到后做什么?  应用程序在信号处理函数中处理要做的工作。
根据以上几点来写出支持异步通知功能的驱动和应用程序。
当中断发生时,进入中断服务函数,将按键值记录下来,然后唤醒进程,并且使用kill_fasync(&buttons_async, SIGIO, POLL_IN)给进程发信号。
第一个参数是一个结构体,buttons_async结构体中显然包含应用程序发给驱动的那个PID;第二个参数表示信号的类别,SIGIO只是一个数字29;
第三个参数表示原因,POLL_IN表示有数据等待读取。
那么在中断发生之前,需要对buttons_async结构体进行初始化。
我们在驱动fasync函数中使用fasync_helper(fd, file, on, &buttons_async)函数来初始化buttons_async结构体。
这就是“谁发”和“怎么发”。
接下来,“发给谁”。
当然是发给应用程序,那应用程序首先得把自己的PID告诉驱动,应用程序通过fcntl这个系统调用把进程ID告诉驱动,fcntl(fd, F_SETOWN, getpid());
Oflags = fcntl(fd, F_GETFL);   
fcntl(fd, F_SETFL, Oflags | FASYNC);  // 改变fasync标记,最终会调用到驱动的faync > fasync_helper:初始化/释放buttons_async结构体
最后,“收到后做什么”
应用程序处于休眠状态,当驱动唤醒进程,并发送信号时,应用程序就会调用信号处理函数,我们需要先调用signal函数来指定我们自己实现的信号处理函数。
signal(SIGIO, my_signal_fun);

在my_signal_fun函数中使用read函数来读取我们在中断服务函数中记录好的按键电平。




  
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

linux设备驱动归纳总结(三):7.异步通知fasync (2010-12-29 15:56)

CU首页 ┊ fh265>>博客 微博 相册 个人中心 好友 消息 [退出] ┊ 随便看看   博文 博主 相册  投票 活...
  • fh400
  • fh400
  • 2011-11-02 17:12
  • 530

异步通知《来自Linux驱动程序开发实例》

您所在的位置:读书频道 > 操作系统 > Linux > 1.2.8 异步通知 1.2.8 异步通知 2012-05-22 13:38 冯国进 机械工业出版社 我要评论(0) 字号:T |...

Linux驱动技术(四) _异步通知技术

http://www.cnblogs.com/xiaojiang1025/p/6376561.html 异步通知的全称是"信号驱动的异步IO",通过"信号"的方式,放期望获取的资...

linux设备驱动归纳总结(三):7.异步通知fasync

转自: http://blog.chinaunix.net/uid-25014876-id-62725.html linux设备驱动归纳总结(三):7.异步通知fasync xxxxxxxxxx...

深入浅出 Linux设备驱动异步通知介绍

结合阻塞与非阻塞访问、poll函数可以较好地解决设备的读写,但是如果有了异步通知就更方便了。异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬...

linux中驱动异步通知应用程序的方法

原文:http://blog.chinaunix.net/uid-21714580-id-119967.html 驱动程序运行在内核空间中,应用程序运行在用户空间中,两者是不能直接通信的。但...
  • liuzq
  • liuzq
  • 2017-06-20 18:33
  • 65

07-S3C2440驱动学习(一)嵌入式linux字符设备驱动-按键驱动程序之异步通知机制+原子操作+互斥信号量+阻塞与非阻塞+定时器去抖

一、异步通知机制 从按键的实现方式来说,可以分为以下几种方式 查询方式,极度耗费CPU资源中断方式,平时休眠,按键按下,唤醒休眠poll机制,不需要一直read,根据poll返回值来决定是否rea...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)