驱动篇:轮询操作(一)
发布日期:2021-06-29 11:34:45
浏览次数:2
分类:技术文章
本文共 1676 字,大约阅读时间需要 5 分钟。
轮询操作(一)
使用非阻塞 I/O 的应用程序通常会使用 select()和 poll()系统调用查询是否可对设备进行无阻塞的访问。select()和 poll()系统调用最终会引发设备驱动中的 poll()函数被执行,在 2.5.45 内核中还引入了 epoll(),即扩展的 poll()。select()和 poll()系统调用的本质一样,前者在 BSD UNIX 中引入的,后者在 System V中引入的。
应用程序中最广泛用到的是 BSD UNIX 中引入的 select()系统调用,其原型如下:
int select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,struct timeval *timeout);readfds、writefds、exceptfds 分别是被 select()监视的读、写和异常处理的文件描述符集合, numfds 的值是需要检查的号码最高的文件描述符加 1。 timeout 参数是一个指向 struct timeval 类型的指针,它可以使 select()在等待 timeout 时间后若没有文件描述符准备好则返回。
下列操作用来设置、清除、判断文件描述符集合。
FD_ZERO(fd_set *set)清除一个文件描述符集。FD_SET(int fd,fd_set *set)将一个文件描述符加入文件描述符集中。FD_CLR(int fd,fd_set *set)将一个文件描述符从文件描述符集中清除。FD_ISSET(int fd,fd_set *set)判断文件描述符是否被置位。
设备驱动中 poll()函数的原型如下:
unsigned int(*poll)(struct file * filp, struct poll_table* wait);第一个参数为 file 结构体指针,第二个参数为轮询表指针。这个函数应该进行以下两项工作。1 对可能引起设备文件状态变化的等待队列调用 poll_wait()函数,将对应的等待队列头添加到 poll_table。2 返回表示是否能对设备进行无阻塞读、写访问的掩码。
关键的用于向 poll_table 注册等待队列的 poll_wait()函数的原型如下:
void poll_wait(struct file *filp, wait_queue_heat_t *queue, poll_table * wait);poll_wait()函数所做的工作是把当前进程添加到 wait 参数指定的等待列表(poll_table)中。
驱动程序 poll()函数应该返回设备资源的可获取状态,即 POLLIN、POLLOUT、POLLPRI、POLLERR、POLLNVAL 等宏的位“或”结果。每个宏的含义都表明设备的一种状态,如 POLLIN(定义为 0x0001)意味着设备可以无阻塞地读,POLLOUT(定义为 0x0004)意味着设备可以无阻塞地写。
poll()函数的典型模板
static unsigned int xxx_poll(struct file *filp, poll_table *wait) { unsigned int mask = 0; struct xxx_dev *dev = filp->private_data; /*获得设备结构体指针*/... poll_wait(filp, &dev->r_wait, wait);//加读等待队列头 poll_wait(filp, &dev->w_wait, wait);//加写等待队列头 if (...)//可读 { mask |= POLLIN | POLLRDNORM; /*标示数据可获得*/} if (...)//可写{ mask |= POLLOUT | POLLWRNORM; /*标示数据可写入*/} ... return mask; }
转载地址:https://blog.csdn.net/zytgg123456/article/details/109898041 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2024年04月10日 07时28分01秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
关于RS-485总线,这篇很详细
2019-04-29
关于2021年电赛的一些想法,看到就是赚到!
2019-04-29
教你一秒分辨真假芯片!
2019-04-29
抽奖 | 送STM32开发板
2019-04-29
光立方,永远的神!
2019-04-29
学习STM32很简单?
2019-04-29
电赛 | 电源题软件如何准备?
2019-04-29
手把手教你DIY一款属于自己的万能红外遥控器!
2019-04-29
速看 | 电子元器件如何确定好坏?
2019-04-29
485通信自动收发电路,历史上最详细的解释
2019-04-29
【视觉盛宴三】不好意思,这些线材接口的横截面真的没见过
2019-04-29
一位头发发白的神人教你怎么写程序,运维,买电脑,写文章,平面设计!
2019-04-29
【第二期】那些设计漂亮、有创意的电路板!
2019-04-29
【第三期】那些设计漂亮、有创意的电路板!
2019-04-29
继续推荐公众号~
2019-04-29
「第二篇」全国一等奖,经验帖。
2019-04-29
「第三篇」全国电子设计竞赛,这些你必须知道的比赛细节,文末附上近十年电赛题目下载...
2019-04-29
5G小科普(漫画版,So easy!)
2019-04-29
无人再提华强北
2019-04-29
千万不要小瞧那些不好好写代码的程序员
2019-04-29