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脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断