博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux嵌入式系统驱动程序的阻塞与异步
阅读量:4571 次
发布时间:2019-06-08

本文共 1522 字,大约阅读时间需要 5 分钟。

对于那些需要进程独占的设备,需要使用linux提供的阻塞编程。步骤如下:

1.在设备驱动程序中定义该设备的进程等待列多,并将其初始化

static wait_queue_head_t wait_queue;

init_waitqueue_head(&wait_queue);

2.在设备驱动程序的读操作中,调用函数wait_event 实现阻塞访问

int mixled_read(struct file * filp,char__user * buffer,size_t size,loff_t * ppos)

{

wait_event(wait_queue,Elmixled_dev->full_flag!=0);

elmixled_dev->full_flag = 0;

if(copy_to_user(buffer,Elmixled_dev->buf,read_lea))

{

printk(“copy to user err!”);

}

return lead_len;

}

在写操作中,调用wake_up函数唤醒该设备等待进程列队上的进程

int mixled_write(struct file * filp, const char__user * buffer,size_t size,loff_t * ppos)

{

int write_len =size;

if(copy_from_user(Elmixled_dev->buf,buffer,write_len))

{

printk(“copy from user err”);

}

elmixled_dev->full_flag = 1;

wake_up(&wait_queue);

return write_len;

}

 

对于异步驱动编程,需要做的步骤如下:

1.定义设备驱动程序的异步通知列队

struct fasync_struct * fasync_queue;

实现设备驱动程序的异步操作函数fasync,并在异步操作函数fasync中调用fasync_helper函数将当前进程添加到设备驱动程序的异步通知列队

int mixled_fasync(int fd,struct file * file ,int on)

{

printk(“enter mixled_fasync function”);

return fasync_helper(fd,file,on,&Elmixled_dev->fasync_queue);

}

struct file_operations mixled_ops={

    …

    .fasync = mixled_fasync

}

3.在设备驱动程序中,当检测到设备状态信息发生变化时,如数据到达或者按键被按下就需要通知应用程序,调用函数kill_fasync想应用程序发送异步通知消息

irqeturn_t mixled_isr(int irq,void * dev_id)

{

printk(“key interrupt take place”);

if(Elmixled_dev-》fasync_queue)

{

kill_fasync(&Elmixled_dev->fasync_queue,SIGIO,POLLMSG)

}

return IRQ_HANDLED;

}

4.在设备驱动的close函数中,调用mixled_fasync函数将当前进程从设备的异步通知列队中移除

mixled_fasync(-1,file,0)

转载于:https://www.cnblogs.com/pavkoo/p/3479163.html

你可能感兴趣的文章
Maven多模块项目搭建
查看>>
Scala
查看>>
Android 中LinearLayout控件属性
查看>>
面向对象之多态性
查看>>
树状数组
查看>>
【2019.8.14 慈溪模拟赛 T1】我不是!我没有!别瞎说啊!(notme)(BFS+DP)
查看>>
多任务--进程 及 进程间通信
查看>>
多线程/多进程+QProgressBar实现进度条
查看>>
多任务(进程)案例----- 拷贝文件夹
查看>>
Kotlin的快速入门
查看>>
底层原理
查看>>
21. Merge Two Sorted Lists
查看>>
创建数组
查看>>
dict使用
查看>>
ASP.NET MVC的帮助类HtmlHelper和UrlHelper
查看>>
02_ListActive中响应事件 并LogCat输出
查看>>
doubleclick adx note
查看>>
Celery框架
查看>>
[c#]asp.net开发微信公众平台(4)关注事件、用户记录、回复文本消息
查看>>
[转载,感觉写的非常详细]DUBBO配置方式详解
查看>>