字符设备驱动程序——异步通知

时间:2014-03-05 17:50:02   收藏:0   阅读:451

1.各种读取按键值的方式比较
查询:耗CPU资源
中断:在应用程序中的read函数一直会休眠,直到有中断发生。
poll:在一段时间内跟中断相同,但是超时之后read函数会返回。
三种共同点:应用程序主动去读取按键的状态。
2.驱动程序主动去提醒应用的方式:异步通知
实现方式:signal
举例:
# kill -9 PID
kill发送9信号到PID

在ubuntu上测试的简单例子:
#include <stdio.h>
#include <signal.h>

void my_signal_fun(int signum)
{
  static int cnt = 0;
  printf("signal = %d, %d times.\n", signmu, ++cnt);
}

int main(int argc, char **argv)
{
  signal(SIGUSR1, my_signal_fun);//注册信号
  while(1)
  {
    sleep(1000);
  }
  return 0;
}
编译之后运行(在后台):
# kill -USR1 PID
注:具体的PID号码通过ps命令查看。

需要完成四步功能:
(1)应用程序中:注册信号处理函数
(2)驱动程序中:将出现的事件通过信号发送给应用程序
(3)应用程序需要事先告诉驱动程序自己的PID号
(4)发送的办法:驱动程序调用kill_fasync函数
3.为了使设备支持异步通信机制,驱动程序中需要涉及以下3项工作
(1)支持F_SETOWN命令,能在这个控制命令处理中设置file->f_owner为对应的进程ID。不过此项工作一般由内核来完成,设备驱动无需处理。
(2)支持F_SETFL命令的处理,每当FASYNC标志改变时,驱动程序中的fasync()函数将得以执行。驱动中应该事先fasync()函数。
(3)在设备资源可获得时,调用kill_fasync()函数激发相应的信号。
补充:
应用程序
fcntl(fd, F_SETOWN, getpid());//告诉内核,发给谁
oflags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, oflags | FASYNC);//改变fasync标记,最终会调用到驱动的faync>fasync_helper:初始化/释放fasync_struct

字符设备驱动程序——异步通知,布布扣,bubuko.com

原文:http://blog.csdn.net/laoniu_c/article/details/20484135

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!