对于那些需要进程独占的设备,需要使用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)

linux嵌入式系统驱动程序的阻塞与异步的更多相关文章

  1. Linux嵌入式系统与硬件平台的关系

    一. Linux嵌入式系统 操作系统是一种在计算机上运行的软件,它的主要任务是管理计算机上的系统资源,为用户提供使用计算机及其外部设备的接口.它存在的目的是为了管理所有硬件资源,并且提供应用软件一个合 ...

  2. ARM+LINUX嵌入式系统的终端显示中文乱码解决

    前一段时间解决的一个问题,看起来是个小问题,实际解决这个问题却花了一个星期的晚上休息时间,记录分享一下. 问题描述: linux内核配置中NLS(native language support)已经选 ...

  3. linux嵌入式系统交叉开发环境

    交叉开发的特点是使用交叉开发环境编译出目标机上可以运行的二进制程序. tool chain就是一整套的交叉开发工具,包括cross assembler.cross compiler. cross li ...

  4. 嵌入式系统Linux内核开发工程师必须掌握的三十道题(转)

    嵌入式系统Linux内核开发工程师必须掌握的三十道题 如果你能正确回答以下问题并理解相关知识点原理,那么你就可以算得上是基本合格的Linux内核开发工程师,试试看! 1) Linux中主要有哪几种内核 ...

  5. 嵌入式系统基础知识(一): 系统结构和嵌入式Linux

    目录 一. 嵌入式体系结构 二. 开发过程中的分工 三. 嵌入式软件体系结构 四. 嵌入式Linux 一. 嵌入式体系结构 <嵌入式系统设计师教程>这本书的前三章脉络很清晰, 按照嵌入式系 ...

  6. 嵌入式Linux驱动学习之路(一)嵌入式系统的软硬件架构

    硬件资料: 操作系统:(非虚拟机) zws@z-pc:~$ lsb_release -aNo LSB modules are available.Distributor ID: Ubuntu Desc ...

  7. 热烈庆祝华清远见2014嵌入式系统(Linux&Android)开发就业培训课程全面升级

    近日,华清远见公开宣布:2014嵌入式系统 (Linux&Android)开发就业培训课程再次升级!据悉,华清远见如今已经持续10年,一直保持课程每年2次的更新的频率.华清远见的每 次课程更新 ...

  8. [看门狗]基于Linux的嵌入式系统全程喂狗策略

    转自:http://blog.csdn.net/erickhuang1989/article/details/8721548 在嵌入式系统中,为了使系统在异常情况下能自动恢复,一般都会引入看门狗电路. ...

  9. [嵌入式开发入门]4412开发板从零建立Linux最小系统

    本文转自iTOP-4412开发板实战教程书籍 http://www.topeetboard.com iTOP-4412开发板不仅可以运行Android,还可以运行简单的Linux最小文件系统. 最小L ...

随机推荐

  1. spring 两个 properties

    A模块和B模块都分别拥有自己的Spring XML配置,并分别拥有自己的配置文件: A模块 A模块的Spring配置文件如下: <?xml version="1.0" enc ...

  2. 报名|「OneAPM x DaoCloud」技术公开课:Docker性能监控!

    如今,越来越多的公司开始 Docker 了,「三分之二的公司在尝试了 Docker 后最终使用了它」,也就是说 Docker 的转化率达到了 67%,同时转化时长也控制在 60 天内. 既然 Dock ...

  3. JQuery拾遗

    1.关于JQuery的animate,可以操作background么? 答:如果是单纯的JQuery不可以,需要引入JQuery的ui核心库.否则只支持宽高.透明度.上下左右位置的变化. 2.能否说一 ...

  4. 被 Windows 10 SDK 坑了

    抓包抓到的配置文件与完整版的VS一致,虽然显示出来的只有 Windows 10 通用工具,我还以为是只更新这些(因为列出来的几个,我确实之前没装),就愉快地点了安装,结果……新建项目时,发现 Wind ...

  5. wordpress模块无法拖拽/显示选项点击无反应

    问题:wordpress模块无法拖拽/显示选项点击无反应,还有编辑器的全屏什么的都用不了,按F12查看了console,提示很多jQuery is not defined... 解决方法:把wp-in ...

  6. 设计数据结构O1 insert delete和getRandom

    设计一个数据结构满足O(1)的insert, delete和getRandom.这个是从地里Amazon的面经中看到的. 我们可以使用一个resizable数组arr以及一个HashMap来完成. i ...

  7. Rate Limiter设计

    先存着,以后再写 http://iamzhongyong.iteye.com/blog/1982113 http://baike.baidu.com/view/2530454.htm https:// ...

  8. iOS:核心动画之动画组CAAnimationGroup

    CAAnimationGroup——动画组 动画组,是CAAnimation的子类,可以保存一组动画对象,将CAAnimationGroup对象加入层后,组中所有动画对象可以同时并发运行 属性说明: ...

  9. Android 禁止进入activity自动弹出键盘

    在Manifest.xml中设定activity的属性 android:windowSoftInputMode="stateHidden|stateUnchanged" 附相关属性 ...

  10. 关于Struts2的Validator的配置找不到DTD

    看教材的时候写的DTD是 <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN&q ...