微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 字符设备驱动程序之异步通知

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

时间:11-21 来源:互联网 点击:

_drv_init);

module_exit(key_drv_exit);

MODULE_LICENSE("GPL");

=====================================================================

测试程序:

#include "sys/types.h"

#include "sys/stat.h"

#include "fcntl.h"

#include "stdio.h"

#include "poll.h"

#include "signal.h"

#include "sys/types.h"

#include "unistd.h"

#include "fcntl.h"

int fd;

void my_signal_fun(int signum)

{

unsigned char key_val;

read(fd, &key_val, 1);

printf("key_val: 0x%x\n", key_val);

}

int main(int argc, char **argv)

{

int Oflags;

signal(SIGIO, my_signal_fun);

fd = open("/dev/buttons", O_RDWR);

if(fd < 0)

printf("cant open!\n");

fcntl(fd, F_SETOWN, getpid());

Oflags = fcntl(fd, F_GETFL);

fcntl(fd, F_SETFL, Oflags | FASYNC);

while(1)

{

sleep(1000);

}

return 0;

}

===================================================================

解析:

1、驱动程序中定义static struct fasync_struct *button_async;

在key_drv_fops结构体中增加 .fasync = key_drv_fasync,

在key_drv_fasync 函数中初始化变量button_async;

在中断处理函数中发送信号:kill_fasync (&button_async, SIGIO, POLL_IN);

2、测试程序中定义信号接收函数:signal(SIGIO, my_signal_fun);

初始化,告诉驱动程序信号发给谁(进程PID):

fcntl(fd, F_SETOWN, getpid());

Oflags = fcntl(fd, F_GETFL);

fcntl(fd, F_SETFL, Oflags | FASYNC);

总结:正常情况下进程休眠,当有按键按下后驱动程序中的按键中断处理函数就会发送信号给休眠的应用程序,应用程序接收到信号以后进入处理函数读取按键值。


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top