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
  • 566

linux 设备驱动异步通知总结

  • 2016年02月18日 15:18
  • 16KB
  • 下载

关于_linux外部中断驱动异步通知应用程序

1,file 1,-> ent_test.c /* * file ent_test.c * Copyright by jiangdou QQ:344283973 * * RK3188 ENT...

Linux的异步通知字符设备驱动

Fasync字符驱动: 1、在我们用户程序下所做的工作: ⑴ 注册信号处理函数。 通过signal 或sigaction()实现。 ⑵ 使进程成为该文件的的属主进程。  通过fcntl 的F_SETO...

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

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

linux驱动之异步通知

异步通知 为了启动文件的异步通知机制,用户程序需要执行两个步骤: 1 fcntl(int fd, F_SETOWN, getpid());  //设置接受SIGIO和SIGURG的进程,如...

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

一、异步通知机制 从按键的实现方式来说,可以分为以下几种方式 查询方式,极度耗费CPU资源中断方式,平时休眠,按键按下,唤醒休眠poll机制,不需要一直read,根据poll返回值来决定是否rea...

对linux下异步通知fasync的理解

异步通知,的确是一种很好处理机制,熟练掌握这种手段,对我们写高质量的应用程序很有帮助。下面说说对它的理解: 异步通知,就是让驱动去告诉应用,底层硬件发生了什么事,而不是应用主动地去查询驱动,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux_12th_异步通知
举报原因:
原因补充:

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