linux字符设备驱动-异步通知笔记
2017-03-07 09:41
423 查看
一、开发环境
1、内核:Linux 2.6.22.6;
2、JZ2440
3、ubuntu 9.10
二、异步通知
使用异步通知,能够实现当驱动程序有数据时,主动发信号告诉应用程序。
1、应用程序需要做的事
(1)编写信号处理函数,即当收到信号时你要执行的函数,并用signal函数注册,如:signal(SIGIO,my_signal_fun)。
(2)驱动是通过PID确认要把信号发给哪个应用程序的。所以,准备接收驱动程序发送来的信号的应用程序需要把自己的PID告诉驱动程序。这个过程是通过下面三句话实现的。
fcntl(fd,F_SETOWN,getpid());//getpid的到本应用程序的pid
oflags=
fcntl(fd,F_GETFL);
fcntl(fd,F_SETFL,oflags|FASYNC);//执行词句会调用设置的.fasync = xxx,对应的xxx()函数,xxx()会调用fasync_helper()函数设
//置PID等信息
2、驱动程序需要做的事
(1)声明fasync_struct类型的结构体变量,如static
struct fasync_struct *key_async。上面设置的PID等信息就是填充这个结构体变量。
(2)在file_operations添加.fasync =xxx,并编写xxx函数。xxx()主要调用fasync_helper()函数设置PID等信息。
(3)在想发信号的地方使用函数kill_fasync,如kill_fasync
(&key_async, SIGIO, POLL_IN)。key_async结构体包含了发送的设置信息。
3、四个要素
(1)应用程序注册信号处理函数 收到信号执行信号处理函数
(2)谁发 驱动程序发信号
(3)发给谁 应用程序告诉驱动程序PID
(4)怎么发 驱动程序调用kill_fasync
三、命令
man getpip 通过这种方式看需要加的头文件,使用方法等。
kill -9 PID 结束进程
四、过程中的问题
发现把printf("my_signal_fun \n");放到read(fd,&keyval,1);上面如函数1,不会打印my_signal_fun。而放到其下面如函数2,则能正常打印。不不知为何。
函数1
void my_signal_fun(int signum)
{
unsigned char keyval;
printf("my_signal_fun \n");
read(fd,&keyval,1);
printf("keyval = 0x %x \n",keyval);
}
函数2
void my_signal_fun(int signum)
{
unsigned char keyval;
read(fd,&keyval,1);
printf("my_signal_fun \n");
printf("keyval = 0x %x \n",keyval);
}
1、内核:Linux 2.6.22.6;
2、JZ2440
3、ubuntu 9.10
二、异步通知
使用异步通知,能够实现当驱动程序有数据时,主动发信号告诉应用程序。
1、应用程序需要做的事
(1)编写信号处理函数,即当收到信号时你要执行的函数,并用signal函数注册,如:signal(SIGIO,my_signal_fun)。
(2)驱动是通过PID确认要把信号发给哪个应用程序的。所以,准备接收驱动程序发送来的信号的应用程序需要把自己的PID告诉驱动程序。这个过程是通过下面三句话实现的。
fcntl(fd,F_SETOWN,getpid());//getpid的到本应用程序的pid
oflags=
fcntl(fd,F_GETFL);
fcntl(fd,F_SETFL,oflags|FASYNC);//执行词句会调用设置的.fasync = xxx,对应的xxx()函数,xxx()会调用fasync_helper()函数设
//置PID等信息
2、驱动程序需要做的事
(1)声明fasync_struct类型的结构体变量,如static
struct fasync_struct *key_async。上面设置的PID等信息就是填充这个结构体变量。
(2)在file_operations添加.fasync =xxx,并编写xxx函数。xxx()主要调用fasync_helper()函数设置PID等信息。
(3)在想发信号的地方使用函数kill_fasync,如kill_fasync
(&key_async, SIGIO, POLL_IN)。key_async结构体包含了发送的设置信息。
3、四个要素
(1)应用程序注册信号处理函数 收到信号执行信号处理函数
(2)谁发 驱动程序发信号
(3)发给谁 应用程序告诉驱动程序PID
(4)怎么发 驱动程序调用kill_fasync
三、命令
man getpip 通过这种方式看需要加的头文件,使用方法等。
kill -9 PID 结束进程
四、过程中的问题
发现把printf("my_signal_fun \n");放到read(fd,&keyval,1);上面如函数1,不会打印my_signal_fun。而放到其下面如函数2,则能正常打印。不不知为何。
函数1
void my_signal_fun(int signum)
{
unsigned char keyval;
printf("my_signal_fun \n");
read(fd,&keyval,1);
printf("keyval = 0x %x \n",keyval);
}
函数2
void my_signal_fun(int signum)
{
unsigned char keyval;
read(fd,&keyval,1);
printf("my_signal_fun \n");
printf("keyval = 0x %x \n",keyval);
}
相关文章推荐
- 韦东山驱动视频笔记——4.字符设备驱动程序之异步通知
- 字符设备驱动笔记——异步通知(八)
- Linux字符设备驱动之异步通知
- Linux的异步通知字符设备驱动
- 07-S3C2440驱动学习(一)嵌入式linux字符设备驱动-按键驱动程序之异步通知机制+原子操作+互斥信号量+阻塞与非阻塞+定时器去抖
- 字符设备驱动之笔记-异步通知(fasync)
- 字符设备驱动之笔记-异步通知(fasync)
- linux字符设备驱动-异步通知
- 字符设备驱动学习笔记----异步通知机制
- Linux字符设备驱动之异步通知
- Linux 驱动学习笔记3 -- 字符设备驱动实例(driver+client)
- linux 学习笔记--字符设备驱动相关数据结构
- linux字符驱动之异步通知按键驱动
- [Linux驱动]字符设备驱动学习笔记(一)
- Linux 设备驱动学习之 异步通知
- Linux设备驱动程序学习(6)-高级字符驱动程序操作[(4)异步通知fasync]
- 字符设备驱动笔记——中断方式按键驱动之linux中断处理结构(五)
- linux字符设备驱动学习笔记(一):简单的字符设备驱动
- Linux设备驱动开发详解-Note(18)---Linux 设备驱动中的异步通知与异步 I/O(1)
- 嵌入式linux学习笔记4之字符设备驱动