poll 机制

poll 机制

  • 一、poll机制概述
  • 二、使用流程
  • 三、编程
    • 3.1 驱动编程
    • 3.1 应用编程
  • 四、POLL 机制的内核代码详解
  • 五、编译后上机实验

poll 机制与休眠唤醒机制的区别:
休眠唤醒方式时,进程如果没有得到唤醒信号,需要一直休眠,进程就干不了其他事情了,但是使用poll机制时,可以设置一个超时时间,在超时时间内休眠,超时后可以去干别的。简单说:
应用程序必须要等待某个时间发生:用休眠唤醒机制。
应用程序可以在设定的时间内等待某时间发生,超时后还得去干别的。

一、poll机制概述

① APP不知道是否有事件发生,调用poll函数并传入超时时间。此时线程先放入队列。
② APP进入内核态,如果有事件发生,则poll立即返回。线程也出队列,APP被唤醒。
③ 如果没数据,就休眠一段时间。
④ 如果在休眠期间,有中断被调用,唤醒了队列中的线程,APP被唤醒。
⑤ 当超时时间到了之后,内核也会唤醒 APP。
⑥ APP根据函数的返回值就知道是否有数据,如果有数据就调用read读数据。

二、使用流程

在这里插入图片描述
主要的流程在图中展示的很清楚,注意几点:
① 驱动中的drv_poll把线程挂入队列,但并不在drv_poll中休眠,休眠的过程是在内核文件系统中完成的。
② drv_poll要返回数据状态,因为驱动工程师给我们简化了好多事儿,所以我们写这个函数要遵守一定规则,返回的状态必须是指定好的几个,其中常用的有:
POLLIN :有数据可读
POLLOUT:可以写数据了
③ APP 调用一次 poll,有可能会导致 drv_poll 被调用 2 次
④ 线程被唤醒的原因有 2:中断发生了去队列 wq 中把它唤醒,超时时间到了内核把它唤醒
⑤ APP要判断poll返回的原因,有数据还是超时,并分别处理。

三、编程

3.1 驱动编程

驱动程序中实现file_operation结构体中的poll接口函数实现例子如下:
在这里插入图片描述
其中poll要做两件事:
① 把当前线程挂入队列 wq,用内核的函数poll_wait
② APP 调用 poll 函数时,有可能是查询“有没有数据可以读” :POLLIN,也有可能是查询“你有没有空间给我写数据” :POLLOUT。
POLLRDNORM 等同于 POLLIN,为了兼容某些 APP 把它们一起返回。
POLLWRNORM 等同于 POLLIN,为了兼容某些 APP 把它们一起返回。

3.1 应用编程

注意:APP 可以调用 poll 或 select 函数,这 2 个函数的作用是一样的。
可以监测多个文件,监测多种事件,常用的就POLLIN,POLLIN。
在这里插入图片描述
poll函数简要说明:
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
参数fds 要传入一个结构体数组,数组用于存储要监测的文件句柄(可多个)、指定的捕获类型,返回的捕获类型。
参数nfds指明fds 中有多少个文件句柄啊。
参数timeout为超时时间,单位为ms。

应用程序部分代码如下:

	fds[0].fd = fd;fds[0].events = POLLIN; //看有没有数据可读nfds = 1; //fds.fd 这个文件存放文件句柄的数组中有几个要监控timeout = 5000; //单位为mswhile (1){ret = poll(fds, nfds, timeout);if (1 == ret  && (fds[0].revents & POLLIN)) //poll返回了 且 得是有数据可读{read(fd, &val, 4); /* 3. 读文件 */printf("get button : 0x%x\n", val);} else if (0 == ret){printf("time out !!! \n");}}

四、POLL 机制的内核代码详解

待补充,,,

五、编译后上机实验

注:提前修改设备树,支持pinctrl子系统,gpio子系统,在设备树中添加节点并指定中断信息。
在这里插入图片描述
**下图为在超时时间内按下按键:**按下一次按键后,驱动中dev_poll被调用了两次。
在这里插入图片描述
**下图为等待poll超时:**可见ev_poll被调用了两次。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/11127.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业数智化转型痛点

建设痛点 企业信息系统建设经历的三个阶段:信息化、网络化(即我们常说的互联网)、以及目前正在进行中的数智化。 企业数智化转型过程中,IT管理人员会面临以下问题困扰: 1,系统架构不规范 业务系统技术标准不…

React 中重新实现强制实施表单

就像设计人员一样,在添加逻辑之前,您需要为不同的状态“模拟”或创建“模拟”。例如,这里只是表单的视觉部分的模拟。这个模拟由一个 prop 控制,其默认值为 :statusempty 识别组件的不同视觉状态确定触发这些状态更改…

解决java.lang.IllegalArgumentException异常的正确方法

java.lang.IllegalArgumentException 是 Java 中的一个异常类,表示方法中传递的参数不合法。这个异常通常在方法被调用时抛出,表明方法的参数出现了问题。要正确解决这个异常,你可以按照以下步骤进行: 查看异常信息:首…

免费思维13招之七:空间型思维

免费思维13招之七:空间型思维 本篇给你带来的是空间型思维。 空间型思维,具体分为内部空间型思维和外部空间型思维。 什么叫内部空间型思维呢? 内部空间型就是充分利用现有空间或资源为社会提供免费服务,积累人气,增加流量,从而带动消费。 为什么你生意不好?为什么你…

iOS ------ MRC

一,MRC MRC:Manual reference Counting与ARC是两种不同的内存管理机制。ARC是自动引用计数,有编译器在编译时自动插入内存管理代码。而MRC是手动引用计数,开发者需要手动管理对象的引用计数。开发者需要手动调用retain&#xff0…

信息系统架构基本概念及发展_2.信息系统架构的定义

1.几种架构的定义 信息系统架构仍在不断发展中,还没有形成一个公认的定义,这里举出几个定义。 定义1:软件或计算机系统的信息系统架构是该系统的一个(或多个)结构,而结构由软件元素、元素的外部可见…

最全-全分辨率免ROOT免费脚本开发工具《懒人精灵》系统视频教程

---全分辨率免ROOT免费脚本开发工具《懒人精灵》--- 一、基础板块-视频教程 1.懒人精灵核心基础视频教程(一):https://www.bilibili.com/video/BV1vr4y1P7hh/ 2.懒人精灵核心基础视频教程(二):https://www.bilibili.com/video/BV1BB4y1X7rw/ 二、插件-…

ppt保存文件奇怪问题

我发现ppt中的形状保存成jpg,png和pdf时,格式不一样 比如 当右键单击时,然后选择另存为图片 png格式 jpg格式 pdf格式 感觉还是很奇怪,就pdf的格式比较靠谱一点

2024年建筑施工特种作业人员安全生产知识试题

100分题库提供安全员考试试题、建筑安全员考试预测题、建筑安全员ABC考试真题、安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 单选题(1-10) 1.因生产安全事故受损害的从业人员,除…

Busybox 在 Docker 中的部署和启动

可以使用 docker pull 指令下载 busybox:latest 镜像: PS C:\Users\yhu> docker pull busybox:latest latest: Pulling from library/busybox ec562eabd705: Pull complete Digest: sha256:5eef5ed34e1e1ff0a4ae850395cbf665c4de6b4b83a32a0bc7bcb998e24e7bbb St…

ElasticSearch集群环境

ElasticSearch集群环境 1、Linux单机 下载地址:LINUX X86_64 (elastic.co) 下载之后进行解压 tar -zxf elasticsearch-7.8.0-linux-x86_64.tar.gz 名字太长了改个名字改成es mv elasticsearch-7.8.0 es因为安全问题,Elasticsearch 不允许 root 用户…

性能优化 | el-table中内嵌大量el-input控件导致渲染卡顿的问题

场景 项目中有一个应用场景,用户需要在表单中大量使用选择框以及输入框填写数据(每一行大概有三十几个输入框),当选择框与输入框达到一定数量的时候,页面会出现输入不连续、卡顿的现象,如下图:…

【信息系统项目管理师知识点速记】风险管理:规划风险管理

规划风险管理是确保项目风险得到有效管控的关键前期步骤,它为整个项目生命周期中识别、分析、应对和监控风险提供了蓝图。 核心目的 匹配度:确保风险管理策略与项目风险水平、组织及干系人重要性相匹配。适时调整:项目初期完成,但需在重大变动时重新评估和调整。输入要素 …

16.直方图均衡化

数字图像处理(17): 直方图均衡化处理 简介 直方图均衡化是一种简单有效的图像增强技术,通过改变图像的直方图来改变图像中各像素的灰度,主要用于增强动态范围偏小的图像的对比度。当原始图像的灰度分布较为集中的时候,可能造成图像不够清晰&…

如何高效率阅读文献

很多导师曾说,不应该花费超过30分钟阅读一篇论文,在某些特殊的时间段,30分钟甚至可能都算是太多的时间,比如:你正准备毕业论文或者想要发表论文的时候…… 文献阅读为何如此重要?又该如何有效快速的阅读&a…

C++基础与深度解析 | 什么是C++ | C++开发环境与相关工具 | C++编译/链接模型

文章目录 一、什么是C二、C的开发环境与相关工具三、C的编译/链接模型 一、什么是C C是一门比较流行的编程语言(高级语言),同时也是一门复杂的语言。从TIOBE 编程社区指数中可以看出:在2024.04中,其编程语言受欢迎程度…

HCIP【BGP综合实验】

目录 一、实验拓扑图: 二、实验要求: 三、实验思路: 四、实验步骤: 1、进行网段的子网划分(整个实验总共有19条网段): (1)首先,根据实验要求,将172.16.0.0/16全部划…

2024湖南理工学院程序设计竞赛(同步赛) G. 区间递减(思维题 分类讨论 ST表)

题目 https://ac.nowcoder.com/acm/contest/82672/G 思路来源 出题人 涼風青葉7代码 题解 注意到三种情况即可, 第一种情况,10 9 8 1 2,保留1 第二种情况,6 5 10 9 4 4,保留5 4 4 第三种情况,6 5 4&…

基于STM32单片机的二轮平衡小车

设计一个基于STM32单片机的二轮平衡小车是一个涉及硬件选择、软件编程、控制算法和机械设计的复杂项目。这里我可以给你一个大致的项目概述和一些基础的代码示例,但请注意,完整的项目设计和实现将需要更详细的规划和大量的调试工作。 1. 项目概述 二轮…

SpringBoot使用腾讯云实现短信功能

引入依赖 <!-- 腾讯云依赖 --> <dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java</artifactId><version>3.1.270</version> </dependency>配置文件 # 腾讯云短信配置 sms:tence…