linux嵌入式系统驱动程序的阻塞与异步
对于那些需要进程独占的设备,需要使用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嵌入式系统驱动程序的阻塞与异步的更多相关文章
- Linux嵌入式系统与硬件平台的关系
一. Linux嵌入式系统 操作系统是一种在计算机上运行的软件,它的主要任务是管理计算机上的系统资源,为用户提供使用计算机及其外部设备的接口.它存在的目的是为了管理所有硬件资源,并且提供应用软件一个合 ...
- ARM+LINUX嵌入式系统的终端显示中文乱码解决
前一段时间解决的一个问题,看起来是个小问题,实际解决这个问题却花了一个星期的晚上休息时间,记录分享一下. 问题描述: linux内核配置中NLS(native language support)已经选 ...
- linux嵌入式系统交叉开发环境
交叉开发的特点是使用交叉开发环境编译出目标机上可以运行的二进制程序. tool chain就是一整套的交叉开发工具,包括cross assembler.cross compiler. cross li ...
- 嵌入式系统Linux内核开发工程师必须掌握的三十道题(转)
嵌入式系统Linux内核开发工程师必须掌握的三十道题 如果你能正确回答以下问题并理解相关知识点原理,那么你就可以算得上是基本合格的Linux内核开发工程师,试试看! 1) Linux中主要有哪几种内核 ...
- 嵌入式系统基础知识(一): 系统结构和嵌入式Linux
目录 一. 嵌入式体系结构 二. 开发过程中的分工 三. 嵌入式软件体系结构 四. 嵌入式Linux 一. 嵌入式体系结构 <嵌入式系统设计师教程>这本书的前三章脉络很清晰, 按照嵌入式系 ...
- 嵌入式Linux驱动学习之路(一)嵌入式系统的软硬件架构
硬件资料: 操作系统:(非虚拟机) zws@z-pc:~$ lsb_release -aNo LSB modules are available.Distributor ID: Ubuntu Desc ...
- 热烈庆祝华清远见2014嵌入式系统(Linux&Android)开发就业培训课程全面升级
近日,华清远见公开宣布:2014嵌入式系统 (Linux&Android)开发就业培训课程再次升级!据悉,华清远见如今已经持续10年,一直保持课程每年2次的更新的频率.华清远见的每 次课程更新 ...
- [看门狗]基于Linux的嵌入式系统全程喂狗策略
转自:http://blog.csdn.net/erickhuang1989/article/details/8721548 在嵌入式系统中,为了使系统在异常情况下能自动恢复,一般都会引入看门狗电路. ...
- [嵌入式开发入门]4412开发板从零建立Linux最小系统
本文转自iTOP-4412开发板实战教程书籍 http://www.topeetboard.com iTOP-4412开发板不仅可以运行Android,还可以运行简单的Linux最小文件系统. 最小L ...
随机推荐
- ios 环境配置网址
http://blog.csdn.net/cwb1128/article/details/18019751
- ios frame、bound和center定义及使用场景总结
frame:指的是视图在父视图的坐标系统中的大小和位置. bound:指的是视图在视图本身的坐标系统中的大小(位置起点是原点). center:指的是视图在父视图坐标系统中的中心点. frame和bo ...
- javascript设计模式--备忘录模式(Memento)
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- MySQL各个版本区别
MySQL 的官网下载地址:http://www.mysql.com/downloads/ 在这个下载界面会有几个版本的选择. 1. MySQL Community Server 社区版本,开源免费, ...
- C#中String跟string的“区别”
string是c#中的类,String是.net Framework的类(在C# IDE中不会显示蓝色) C# string映射为.net Framework的String 如果用string,编译器 ...
- 针对局域网IM飞秋(feiq)的开发总结
先上代码了,通过java代码群发feiq消息: package com.triman.constant; import java.io.IOException; import java.io.Unsu ...
- android模拟器(genymotion)+appium+python 框架执行基本原理(目前公司自己写的)
android模拟器(genymotion)+appium+python 框架执行的基本过程: 1.Push.initDate(openid)方法 //业务数据初始化 1.1 v5db.p ...
- Jmeter正则表达式提取器的使用方法(转)
下面简单介绍一下Jmeter正则表达式提取器的使用方法. 1.添加Jmeter正则表达式提取器:在具体的Request下添加Jmeter正则表达式提取器(Jmeter正则表达式在“后置处理器”下面) ...
- 数论之高次同余方程(Baby Step Giant Step + 拓展BSGS)
什么叫高次同余方程?说白了就是解决这样一个问题: A^x=B(mod C),求最小的x值. baby step giant step算法 题目条件:C是素数(事实上,A与C互质就可以.为什么?在BSG ...
- 如何使用SPY++查找
自动化测试中,如果需要做UI automation的时候往往需要抓取object的工具.实际上这种工具有很多,认识的大牛使用SPY++,于是我也选择了这个.下面列出基本使用方法.有点像XACC spy ...