Hasen的linux设备驱动开发学习之旅--支持轮询操作的设备驱动

2024-06-08 03:32

本文主要是介绍Hasen的linux设备驱动开发学习之旅--支持轮询操作的设备驱动,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


/*** Author:hasen* 参考 :《linux设备驱动开发详解》* 简介:android小菜鸟的linux* 	         设备驱动开发学习之旅* 主题:支持轮询操作的设备驱动* Date:2014-11-07*/
在globalfifo的poll()函数中,首先将设备结构体中的r_wait和w_wait等待队列头添加到等待列表,
然后通过判断dev->current_len是否等于0来获取设备的可读状态,通过判断dev->current_len是否等于
GLOBALFIFO_SIZE来获得设备的可写状态。

struct globalfifo_dev{struct cdev cdev ;/*cdev结构体*/unsigned int current_len ;/*当前fifo的有效长度*/unsigned char mem[GLOBALFIFO_SIZE] ;/*全局内存*/struct semaphore sem ;/*并发控制用的信号量*/wait_queue_head_t r_wait ;/*@@读用的等待队列头*/wait_queue_head_t w_wait ;/*@@写用的等待队列头*/
}/*globalfifo设备驱动的poll()函数*/
static unsigned int globalfifo_poll(struct file *filp,poll_table *wait)
{unsigned int mask = 0 ;struct globalfifo_dev *dev = filp->private_data ;/*获得设备结构体指针*/down(&dev->sem) ;poll_wait(filp,&dev->r_wait,wait) ;poll_wait(filp,&dev->w_wait,wait) ;/*@@fifo非空*/if(dev->current_len != 0)mask |= POLLIN | POLLRDNORM ; /*@@标示数据可获得*//*@@fifo非满*/if(dev->current_len != GLOBALFIFO_SIZE)mask |= POLLOUT | POLLWRNORM ;/*@@标示数据可写入*/up(&dev->sem) ;return mask ;
}
注意,要把globalfifo_poll赋给global_fops的poll成员:
static const file_operations globalfifo_fops = {....poll = globalfifo_poll,...
} ;

关于global_fops的poll成员参见文章《linux中file_operations结构体详解》,这里也粘贴过来方便查阅

unsigned int (*poll) (struct file *, struct poll_table_struct *);  //poll 方法是 3 个系统调用的后端: poll, epoll, 和 select, 都用作查询对一个或多个文件描述符的读或写是否会阻塞. poll 方法应当返回一个位掩码指示是否非阻塞的读或写是可能的, 并且, 可能地, 提供给内核信息用来使调用进程睡眠直到 I/O 变为可能. 如果一个驱动的 poll 方法为 NULL, 设备假定为不阻塞地可读可写.

监控globalfifo是否可以非阻塞读写的应用程序

#include ...#define FIFO_CLEAR 0X1 
#define BUFFER_LEN 20 
main()
{int fd,num ;char rd_ch[BUFFER_LEN];fd_set rfds , efds ;/*读和写文件描述符集*//*以非阻塞方式打开/dev/globalfifo设备文件*/fd = open("/dev/globalfifo",O_RDONLY | O_NONBLOCK) ;if(fd != -1){/*FIFO清0*/if(ioctl(fd,FIFO_CLEAR,0) < 0)printf("ioctl command failed\n") ;while(1){FD_ZERO(&rfds) ;FD_ZERO(&wfds) ;FD_SET(fd,&rfds) ;FD_SET(fd,&wfds) ;select(fd+1 ,&rfds, &wfds, NULL, NULL) ;/*数据可获得*/if(FD_ISSET(fd,&rfds))printf("Poll monitor:can be read\n") ;/*数据可写入*/if(FD_ISSET(fd,&wfds))printf("Poll monitor:can be written\n") ;}}else{printf("open device failed !\n") ;}
}

             运行时看到,到没有任何输入,即FIFO为空时,程序不断地输出"Poll monitor:can be written",当通过
echo向/dev/globalfifo写入一些数据后,将输出"Poll monitor:can be read"和"Poll monitor:can be written",如果
不断地通过echo向/dev/globalfifo写入数据直到写满FIFO,发现pollmonitor程序只输出"Poll monitor:can be read"。
对于globalfifo而言,不会出现既不能读,又不能写的情况。

代码中调用的函数详解,请参考文章《Hasen的linux设备驱动开发学习之旅--阻塞与非阻塞I/O》中轮询部分。



这篇关于Hasen的linux设备驱动开发学习之旅--支持轮询操作的设备驱动的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1041093

相关文章

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3