C 嵌入式系统设计模式 14:轮询模式

本书的原著为:《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》,讲解的是嵌入式系统设计模式,是一本不可多得的好书。

本系列描述我对书中内容的理解。本文章描述访问硬件的设计模式之七:轮询模式。

从硬件获取传感器数据或信号时,另一种常见的模式是定期进行检查,这个过程被称为 轮询(polling)。

轮询的基本思想是由软件主动去检查(即“询问”)硬件状态或数据是否已准备好,而不是等待硬件来通知软件(如通过 中断观察者模式)。这种方法简单且易于实现,但效率可能较低,因为软件可能需要频繁地检查硬件,即使数据并没有更新。

摘要

轮询模式 (Polling Pattern)是检查硬件是否有新数据或信号的最简单方式。轮询可以是 周期性 (periodic) 的,也可以是 伺机性 (opportunistic) 的。周期性轮询使用定时器来指示何时应该对硬件进行采样,而伺机性轮询则在系统方便的时候进行,例如在主要系统函数之间或在重复执行周期的某个时间点。

伺机性轮询,顾名思义,不那么规律,但它对系统可能正在执行的其他活动的时间性影响较小。这意味着,如果系统在某些时候较为空闲,伺机性轮询可以作为一种低开销的方式来检查硬件状态,而不会显著干扰其他关键任务。

问题

轮询模式解决了在系统运行过程中获取新的传感器数据或硬件信号的问题,尤其适用于那些数据或事件并非高度紧急的情况。由于轮询操作可以在系统控制下进行,并且可以调整轮询的频率,因此它提供了一种灵活且可控的数据获取方式。

模式结构

该模式有两种类型:

  1. 伺机性轮询
    在这里插入图片描述

  2. 周期性轮询
    在这里插入图片描述

模式详情

应用层

应用层的 applicationFunc() 函数包含一个循环,在循环中调用 poll() 函数。例如:

while (processing) 
{ action1(); action2(); action3(); OpportunityPoller_poll(me->itsOpportunisticPoller); 
}

设备

该设备通过对外函数提供数据、设备状态等信息。这个元素可以是一个设备驱动程序,也可以简单地从内存或端口映射设备中读取信息。这个类提供了两个函数,一个用于检索数据(在图中定义为 deviceData 类型数据),另一个用于检索设备状态(图中定义为 int 类型整数)。

在图中,有 MAX_POLL_DEVICES 个设备关联到 伺机性轮询 上,因此 poll() 函数会扫描所有这些设备并通知它们各自的 客户端

伺机性轮询器

此元素具有 poll() 函数,该函数扫描所关联的设备以获取数据和设备状态,并将此信息传递给每个设备的相应客户端。伺机性轮询器周期性轮询器 之间的区别在于,后者除了轮询数据外,还具有计时器初始化和关闭功能。

周期性轮询器

周期性轮询器 是一种软件组件,它定期扫描所关联的设备以获取数据和设备状态。与 伺机性轮询器 不同,周期性轮询器按照预定的时间间隔执行轮询操作。

主要功能和组件

  1. poll() 函数:这是周期性轮询器的核心函数,负责扫描所关联的设备并获取数据和设备状态。一旦获取到信息,它会将这些数据传递给每个设备的相应客户端。

  2. 设置轮询时间的变量:周期性轮询器允许用户通过 setPollTime(t) 函数设置轮询的时间间隔。这个变量决定了轮询器多久执行一次 poll() 函数。

  3. 启动和停止轮询的服务:周期性轮询器提供 startPolling()stopPolling() 函数来控制轮询操作的开始和停止。

    • startPolling() 函数负责初始化定时器。
    • stopPolling() 函数用于停止定时器,从而停止轮询操作。

轮询数据客户端

这是一个客户端,客户端使用 设备 的数据、状态等信息。通常每个设备都有自己的客户端,但也存在所有设备的数据只有一个客户端的情况。

轮询定时器

轮询定时器 元素表示一个定时器以及与该定时器相关的服务。startTimer() 方法负责初始化定时器,并将其与handleTimerInterrupt() 中断服务例程关联起来。当中断发生时,handleTimerInterrupt() 会被执行,进而触发轮询操作。handleTimerInterrupt() 的工作流程通常如下:

  1. 重置定时器计数:这是为了确保下一次定时器中断能够在正确的时间发生。
  2. 调用 poll() 函数:这是轮询操作的核心部分,它会扫描并读取设备的数据和状态信息。

轮询定时器还提供中断服务例程(ISR)的安装和移除:

  • installInterruptTimer() 函数负责将中断服务例程(ISR)的地址插入到中断向量表中。这是确保定时器中断能够正确触发并调用相应处理函数的关键步骤。
  • removeInterruptHandler() 函数用于从中断向量表中移除之前安装的中断服务例程,恢复原始的中断向量设置。然而,请注意,在您的描述中并没有直接提到这个函数被周期性轮询器使用;它可能是作为更底层或更一般化的服务存在的。

效果

轮询的优点在于其简单性和能够同时检查多个设备的能力。它不需要复杂的中断设置和管理,因此更容易实现和维护。轮询的主要缺点是它可能无法及时处理快速变化的事件或数据,因为它只在轮询周期到达时才检查设备状态。

因此,必须注意,如果数据与信号有相关的截止时间(deadlines),那么轮询时间加上响应时间必须始终小于这些截止时间。如果数据到达的速度快于轮询时间,那么数据将会丢失。这在许多应用中可能不是问题,但在某些情况下可能是致命的。

相比之下,中断处理可以立即响应设备状态的变化,因为它是由设备本身触发的。但是,中断处理需要更复杂的设置和管理,包括中断向量的配置、中断服务例程的编写和中断优先级的设置等。此外,如果多个设备同时触发中断,还需要处理中断嵌套和优先级的问题。

因此,在选择使用轮询还是中断处理时,需要根据具体的应用场景和需求进行权衡。

实现策略

最简单的实现方式是在主循环中进行硬件检查,只要系统运行,该循环就会一直执行。这被称为 对称伺机性轮询,因为它始终以相同的方式运行,即使处理循环所需的时间可能会有很大的变化。非对称伺机性轮询 指的是在处理过程中,在方便但无关的点上进行新数据检查。这种方法提供了更大的灵活,(如果需要更快的响应,可以增加一些检查),但增加了系统的复杂性和维护难度,因为需要在多个不相关的点上插入检查代码,并且需要确保这些检查不会干扰主要流程的执行。

周期性轮询 是以固定时间间隔(称为周期)进行的轮询。时间间隔不是严格不变的,而是有较小的抖动。实际轮询时间与预期轮询时间之间的差异很小。为了实现这种规律性,新数据的检查是由与中断绑定的定时器启动的。因此,轮询模式的周期性变体只是中断模式的一个特例。

实例

见原书。






读后有收获,资助博主养娃 - 千金难买知识,但可以买好多奶粉 (〃‘▽’〃)
千金难买知识,但可以买好多奶粉

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

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

相关文章

图像生成地表最强!Playground v2.5技术报告解读重磅来袭!超越SD、DALL·E 3和 Midjourney

文章链接:https://arxiv.org/pdf/2402.17245 模型地址: https://huggingface.co/playgroundai/playground-v2.5-1024px-aesthetic 本文分享了在文本到图像生成模型中实现SOTA美学质量的三个见解。专注于模型改进的三个关键方面:增强色彩和对…

代码异常处理

一、异常格式 错误堆栈信息的格式大致如下: 第一行包含了错误类型(Exception或Error)和错误描述。 从第二行开始,每一行都表示一个调用栈帧(Stack Frame),包含了类名、方法名和代码行号。二、…

单片机独立按键控制LED状态

一、前言 这幅图是按键的抖动与时间的联系 按键抖动:对于机械开关,当机械鮑点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的…

动态规划|【路径问题】礼物的最大价值(LCR 166.珠宝的最高价值)

目录 题目 题目解析 思路 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 代码 题目 LCR 166. 珠宝的最高价值 (现在leetcode上面是这个题)这个题跟下面这个题叙述方式一样,就拿下面这个 题来讲解) 题目描述&…

Java配置48-nginx 按照日期生成日志

1. 背景 默认情况下&#xff0c;nginx 的日志会一直输入到 access.log&#xff0c;长时间运行后会导致这个日志文件过大。 2. 方法 修改 nginx.conf map $time_iso8601 $logdate {~^(?<ymd>\d{4}-\d{2}-\d{2}) $ymd;default date-not-found;}access_log logs/acce…

深度神经网络联结主义的本质

一、介绍 在新兴的人工智能 (AI) 领域&#xff0c;深度神经网络 (DNN) 是一项里程碑式的成就&#xff0c;突破了机器学习、模式识别和认知模拟的界限。这一技术奇迹的核心是一个与认知科学本身一样古老的思想&#xff1a;联结主义。本文深入探讨了联结主义的基本原理&#xff0…

四、《任务列表案例》后端程序实现和测试

本章概要 准备工作功能实现前后联调 4.1 准备工作 数据库脚本 CREATE TABLE schedule (id INT NOT NULL AUTO_INCREMENT,title VARCHAR(255) NOT NULL,completed BOOLEAN NOT NULL,PRIMARY KEY (id) );INSERT INTO schedule (title, completed) VALUES(学习java, true),(学…

打造透明银行存储:Solidity智能合约的实践与探索

引言&#xff1a; 随着区块链技术的快速发展&#xff0c;智能合约作为其中的核心组件&#xff0c;正被越来越多地应用于各种场景。作为智能合约的编程语言&#xff0c;Solidity因其对以太坊平台的深度支持而备受关注。在这篇文章中&#xff0c;我们将通过构建一个透明的银行存储…

【踩坑专栏】追根溯源,从Linux磁盘爆满排查故障:mycat2与navicat不兼容导致日志暴增

昨天遇到了一个比较奇怪的问题&#xff0c;就是在挂起虚拟机的时候&#xff0c;虚拟机提示我XX脚本正在运行&#xff0c;很奇怪&#xff0c;我没有运行脚本&#xff0c;为什么会提示我这个呢。今天恢复虚拟机&#xff0c;也提示了一下脚本的问题&#xff0c;而且发现Linux明显异…

HCIA-HarmonyOS设备开发认证V2.0-习题

目录 习题一习题二&#xff08;待续...&#xff09;坚持就有收获 习题一 # HarmonyOS简介 1. 以下哪几项属于OpenHarmony的技术特性&#xff1f;&#xff08;&#xff09;A. 统一OS&#xff0c;弹性部署B. 一次开发&#xff0c;多端部署C. 硬件互助&#xff0c;资源共享2. Ope…

靶机渗透之sar

Name: Sar: 1Date release: 15 Feb 2020Author: LoveSeries: Sar Download: https://drive.google.com/open?id1AFAmM21AwiAEiVFUA0cSr_GeAYaxd3lQ 对于vulnhub中的靶机&#xff0c;我们都需先下载镜像&#xff0c;然后导入VM&#xff0c;并将网络连接改为NAT模式。首先我们…

使用Python,maplotlib绘制树型有向层级结构图

使用Python&#xff0c;maplotlib绘制树型有向层级结构图 1. 效果图2. 源码2.1 plotTree.py绘制层级结构及不同样式2.2 plotArrow.py 支持的所有箭头样式 参考 前俩篇博客介绍了 1. 使用Python&#xff0c;networkx对卡勒德胡赛尼三部曲之《群山回唱》人物关系图谱绘制 2. 使用…

C# 学习第四弹——字符串

一、char类型的使用 字符使用单引号&#xff0c;单个字符 转义字符是一种特殊的字符变量&#xff0c;以反斜线开头&#xff0c;后跟一个或多个字符。 输出多级目录可以使用 二、字符串的声明和初始化 1、引用字符串常量 引用字符串常量初始化——字符使用单引号&#xff0…

阿里云轻量服务器,ubuntu20.04安装Redis

第一步&#xff1a;下载xshell7,连接阿里云服务器 就是下图这个ip 第二步&#xff1a;输入用户名和密码 上面那一步完成之后&#xff0c;就会弹出来下面这个图片 用户名是root 密码是你的阿里云服务器密码 如果你要是忘了&#xff0c;如下图&#xff0c;重置密码&#xff0…

【Redis:事务】

1 &#x1f351;事务概念&#x1f351; Redis 的事务和 MySQL 的事务概念上是类似的&#xff0c;都是把⼀系列操作绑定成⼀组&#xff0c;让这⼀组能够批量执⾏。 但是注意体会 Redis 的事务和 MySQL 事务的区别: 弱化的原⼦性: redis 没有 “回滚机制”. 只能做到这些操作 “…

unity后期

unity|后处理篇 前言一、Post-Processing 1、 Post-Processing的使用2、Post-Processing后处理效果 抗锯齿①、Ambient Occlusion 环境光遮蔽②、Auto Exposure 自动曝光③、Bloom 辉光/泛光④、Chromatic Aberration | 色差⑤、Color Grading 色调/颜色分级⑥、Depth Of Fiel…

数据卷dockerfile

目录 一、数据卷 1. 简介 2. 数据卷和数据卷容器 1. 数据卷&#xff1a; 2. 数据卷容器&#xff1a; 二、自定义镜像 1. 作用 2. 自定义centos 3. 自定义tomcat8 一、数据卷 1. 简介 数据卷是一个可供一个或多个容器使用的特殊目录&#xff0c;它将主机操作系统目录直…

【Python笔记-设计模式】状态模式

一、说明 状态模式是一种行为设计模式&#xff0c;用于解决对象在不同状态下具有不同行为 (一) 解决问题 在对象行为根据对象状态而改变时&#xff0c;规避使用大量的条件语句来判断对象的状态&#xff0c;提高系统可维护性 (二) 使用场景 当对象的行为取决于其状态&#…

List集合的Stream流式操作实现数据类型转换

问题现象&#xff1a; 最近在项目中&#xff0c;有一些逻辑想用List集合的Stream流式操作来快速实现&#xff0c;但由于之前没做好学习笔记和总结&#xff0c;导致一时间想不起来&#xff0c;只能用本方法来解决&#xff0c;如下&#xff1a; 可以看出来代码量是比较冗长的&…

智能驾驶规划控制理论学习-基于采样的规划方法

目录 一、基于采样的规划方法概述 二、概率路图&#xff08;PRM&#xff09; 1、核心思想 2、实现流程 3、算法描述 4、节点连接处理 5、总结 三、快速搜索随机树&#xff08;RRT&#xff09; 1、核心思想 2、实现流程 3、总结 4、改进RRT算法 ①快速搜索随机图&a…