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

相关文章

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W