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 ...
随机推荐
- Yarn的服务库和事件库
对于生命周期较长的对象,YARN采用了基于服务对象管理模型对其进行管理. 该模型有一下特点: 每个被服务化的对象都分为4个状态 任何服务状态变化都可以触发另外一些动作 可以通过组合方式对任意服务进行组 ...
- 简单CSS hack:区分IE6、IE7、IE8、Firefox、Opera
一.跨浏览器的网页设计一直是让人很头疼的问题,这不只是因为浏览器的版本众多,还有一个重要的原因是相同浏览器的不同时期的版本也会有差异,甚至是在不同操作同台上还会有不同.因此使CSS hack技术进行浏 ...
- C# 模拟一个处理消息队列的线程类 Message Queue
// 模拟一个处理消息队列的类 class MessageHandler { // 消息队列 private Queue<string> messageQue = new Queue< ...
- Sqli-labs less 29
Less-29 首先先看下tomcat中的index.jsp文件 在apache的index.php中,sql语句为 $sql="SELECT * FROM users WHERE id=' ...
- Linux关于watch的用法
Linux关于watch的用法 2011-07-20 0个评论 收藏 我要投稿 watch 是一个非常实用的命令,基本所有的 Linux 发行版都带有这个小工具,如同名字一 ...
- 【四】php字符串操作
1.trim函数,我们队trim函数并不陌生,用于去除字符串两头的空白符.php的trim方法也可以做到这一点,但是还可以使用第二个参数,用于规定你在两头去掉什么.php中还有 ltrim 和 rtr ...
- 开源搜索引擎Solr的快速搭建及集成到企业门户最佳实施方案--转载
笔者经过研究查阅solr官方相关资料经过两周的研究实现了毫秒级百万数据的搜索引擎的搭建并引入到企业门户.现将实施心得和步骤分享一下. 1. jdk1.6 安装jdk1.6到系统默认目录下X: ...
- POJ 1491
#include<iostream> #include<cmath> #include<iomanip> #define MAXN 50 using namespa ...
- hdu 4023 Game 博弈论
思路: 将15种分成5类: 1.1和2为一类: 2.3,4,5,6为一类: 3.7,8,9,10为一类: 4.11,12,13,14,15为一类: 5.15为一类. 比较各类的优先级,就会发现放置的顺 ...
- 一起学习redis源码
redis的一些介绍,麻烦阅读前面的几篇文章,想对redis的详细实现有所了解,强力推荐<redis设计与实现>(不仅仅从作者那儿学习到redis的实现,还有项目的管理.思想等,作者可能比 ...