中断处理------文件IO模型 (四)异步通知 基于tiny4412开发板

12 篇文章 0 订阅
10 篇文章 0 订阅

之前说的几个模型都是主动去监控的,那么这个异步通知就和之前说的不一样,是被动的,当中断发生时候去通知CPU,CPU就会过来做这件事,然后昨晚再跳回去做原来的事

在这里插入图片描述
从张图可以看出,需要有个发送信号(驱动),一个接收信号(app)

下面我们来实现发送和接收信号的功能

接收信号功能(app):

signal(SIGIO,catch_signal);//设置信号处理函数
		fcntl(fd,F_SETOWN,getpid());
		int flags=fcntl(fd,F_GETFL);//拿到open时候的flags
		fcntl(fd,F_SETFL,flags | FASYNC);

在信号处理函数中,只要收到SIGIO函数就会执行对应的信号处理函数catch_signal,
fcntl(fd,F_SETOWN,getpid())将当前进程设置成SIGIO的属主进程,getpid()获取进程号
fcntl(fd,F_SETFL,flags | FASYNC);将打开文件时候获取的flags设置成FASYNC,
总结:需要做好这三件事
在这里插入图片描述
现在已经将接受驱动发送信号的事情做好了,接下来做收到信号以后需要做出相应的操作,在catch_signal函数中实现

void catch_signal(int s){
	if(s==SIGIO)
		{
			printf("\nWe got signo!!\n");
			 read(fd,&key,sizeof(struct key_event));
		                 if(key.code==KEY_ENTER)
		                        {
		                        if(key.value==0)
		                                {
		                                        printf("\n              key up!!!!!!!!!!        \n");   
		                                }
		                        if(key.value==1)
		                                {
		                                        printf("\n              key down!!!!!!!!!!      \n");    
		                                }
		                        }
							
			
		}


}

发送信号的驱动程序:
什么时候发送信号呢?当然是按下按键,中断发生的时候,所以在中断处理函数中.

kill_fasync(&my_key.fapp,SIGIO,POLLIN);//发送信号

此外还要在file_operations结构体中实现fsync函数

static struct file_operations myfops={
        .owner=THIS_MODULE,
        .open=key_open,
        .release=key_close,
        .write=key_write,
        .read=key_read,
        .poll=key_poll,
        .fsync=key_fsync,
     
};

同时去实现这个函数
fasync_helper作用就是初始化fasync,包括分配内存和设置属性,最后在驱动的release里把fasync_helper初始化的东西free掉。

int key_fsync (int fd,struct file *file, int on)
{
	return fasync_helper(fd,file,on, &my_key.fapp);
	//fasync_helper中前三个函数是调用app调用fcntl函数时候自己传参的
	//然后将这三个参数处理后存到最后一个参数
}

我们来看看这个函数的原型

int fasync_helper(int fd, struct file * filp, int on, struct fasync_struct **fapp)

最后一个参数的类型是struct fasync_struct **
所以我们要将一个这样的类型传进去,为了好惯例,在结构中定义

struct fasync_struct *fapp;

这样就可以实现异步通知了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值