为了优化数据吞吐量,传感器设备必须将筛选条件应用于数据更新事件,以便仅在需要时引发这些事件。 由于传感器吞吐量) 降低, (传感器和 CPU) 的功耗降低,此筛选会导致 CPU 利用率 (降低。
有两个值 (或属性) 支持传感器设备的筛选条件。 第一个是当前报告间隔 (CRI) ,第二个是 CS (更改敏感度,也称为阈值) 。 传感器 Win32 应用程序可以设置这两个属性。
当前报告间隔是发生有意义的更改时客户端希望接收的数据更新之间的最短时间段(以毫秒为单位)。 更改敏感度是用于指定有意义的更改) 值 (或百分比。
因此,气象站应用程序可以指定 60,000 (或 1 分钟) 温度传感器的当前报告间隔 (CRI) 。 而且,温度传感器需要 (变化敏感度值,而不是) 百分比。 例如,如果此温度传感器返回摄氏度,而更改敏感度值为温度 2.0,则此特定传感器只会在温度比请求的报告间隔 (2.0 摄氏度(在本例中为 1 分钟) )提高或降低 2.0 摄氏度时,才会引发数据更新事件。
(ALS) 的环境光传感器是要求将更改敏感度指定为百分比的传感器的一个示例。 例如,如果 Illuminance 的变化敏感度值为 2.0,则此传感器会将该值解释为百分比,并且仅在 LUX 值下降或增加 2% 时引发数据更新事件。
与筛选条件相关的术语
术语 | 含义 |
---|---|
当前报告间隔 (CRI) | 表示为时间段的速率 (频率) 毫秒,当发生有意义的数量级变化时,客户端希望接收数据更新。 如果测量的传感器现象 (发生有意义的更改,则此字段表示为事件之间的最小时间段) 。 根据发生有意义的更改,期间将有所不同,但绝不会短于此期限。 此值是每个传感器的。 |
更改敏感度 (CS) | 构成有意义的变化的测量现象的变化。 这可以表示为线性震级 (例如,对于加速计读数) 为 0.05 G,对于环境光传感器读取 () ,则表示为 0.05 G 或 5% 的非线性震级。 此值是每个传感器数据字段。 |
E-CRI) (有效当前报告间隔 | 在任意给定时间点计算的 RI 值,由设备驱动程序用来根据以下条件筛选数据更新事件传递:
此值是每个传感器的。 |
有效的更改敏感度 (E-CS) | 在任意给定时间点计算的 CS 值,由设备驱动程序根据以下条件来筛选数据更新事件传递:
此值是每个传感器数据字段。 |
更改敏感度
本文档的传感器 阈值 部分介绍了每个传感器可能的更改敏感度值的完整列表。
当前报告间隔建议默认值
下表列出了建议的当前报告间隔 (CRI) 默认值。
传感器类型 | 建议的默认报告间隔 |
---|---|
加速计 | 100 |
活动检测 | 5000 |
环境光传感器 | 1000 |
气压计 | 1000 |
自定义传感器 | N/A |
地磁方向 | 100 |
重力矢量 | 100 |
陀螺测试仪 | 100 |
线性加速计 | 100 |
磁力计 | 100 |
方向 | 50 |
步程计 | 1000 |
邻近帮助 | 100* |
相对方向 | 100 |
简单设备方向 | 200* |
(*) 邻近感应和简单设备方向传感器不得定期报告样本读数。 相反,当读取发生更改时,这些传感器应向类扩展报告数据。 这些传感器的报告间隔值表示传感器报告样本读取所花费的最大时间。
更改建议的敏感度默认值
下表列出了建议的更改敏感度 (CS) 默认值。
传感器类型 | 建议的默认更改敏感度 |
---|---|
加速计 | 0.02 G |
活动检测 | 0 (无活动订阅) |
环境光传感器 | 25% 照度变化 |
气压计 | 0.001 栏 |
自定义传感器 | N/A |
地磁方向 | 10.0 度 |
重力矢量 | 10.0 度 |
陀螺测试仪 | 0.50 度/秒 |
线性加速计 | 0.02 G |
磁力计 | 5.0 microtesla |
方向 | 10.0 度 |
步程计 | 10000 个步骤 |
邻近帮助 | 邻近感应更改 |
相对方向 | 10.0 度 |
简单设备方向 | 方向更改时 |
有效的当前报告间隔 (CRI) 和更改敏感度 (CS)
多个应用程序可以设置给定传感器的当前报告间隔 (CRI) 和更改敏感度 (CS) 属性。 当应用程序配置 ((例如两个应用程序请求不同的更改敏感度值或) 不同的报告间隔)发生冲突时,传感器类扩展将确定要发送到驱动程序的最相关的 CS 和 CRI。 传感器类扩展提供给驱动程序的 CS 和 CRI 值称为有效当前 Report-Interval (E-CRI) 和有效 Change-Sensitivity (E-CS) 。
以下函数由传感器类扩展调用,用于启动/停止传感器、报告样本读取或设置 E-CRI 和 E-CS。
感兴趣的事件 | 事件处理程序活动 |
---|---|
EvtSensorStart | 启动传感器 |
EvtSensorStop | 停止传感器 |
EvtSensorSetDataInterval | 设置当前报告间隔 |
EvtSensorGetDataInterval | 获取当前报告间隔 |
EvtSensorSetDataThresholds | 设置当前更改敏感度 (阈值) 值 |
EvtSensorGetDataThresholds | 获取当前更改敏感度 (阈值) 值 |
SensorsCxSensorDataReady | 驱动程序将示例读取报告给传感器类扩展 |
通过评估有效的 CRI 和 CS 值来筛选数据更新事件, (E-CRI、E-CS)
设置当前 E-CRI 和 E-CS 值后,传感器设备将使用这些值来筛选引发到连接的客户端应用程序的事件。 这些值与) (的“当前”数据值与) (以前的数据值之间的差异进行比较。 如果在等于或大于 E-CRI 的时间段内超过了 E-CS 值,则且仅此时间,才应引发数据事件。 唯一的例外是初始示例读取,本文档稍后部分将对此进行介绍。
使用当前 E-CRI 和当前 E-CS 值作为将引发的事件的筛选条件来筛选事件有一个基本原则。 这些筛选值与当前数据值与以前的数据值之间的差异进行比较,以确定何时应通过调用 SensorsCxSensorDataReady 引发事件。 如果超过 E-CS) (数量级阈值的时间段等于或大于 E-CRI) 的时间阈值 (,则仅此时间才应引发数据事件。 建议在获取初始值后在驱动程序启动时引发数据事件,以便客户端可以接收正确的通知。 此外,此实现不应比请求的报告间隔更频繁地唤醒 CPU,以节省电源。
下图演示了如何评估原始传感器数据的时间筛选,以确定何时应引发数据事件。
在上图中,关系图下半部分中的红色数据表示原始传感器数据。 绿线表示将返回到轮询数据的客户端的数据, (实现此行为的多种方式之一) ,红色 X 值表示触发数据事件的时间。 蓝线是 E-CS 边界 (+/- E-CS 相对于上一个数据事件值) 的阈值。
通过实现此事件筛选逻辑,可以大大减少数据更新事件的数量,并且当传感器数据发生有意义的更改时,应用程序仍可收到通知。
流式处理
流式处理是一种允许传感器驱动程序定期报告样本读数的模式。 应用程序可以使用此模式来接收恒定的数据流。
一般情况
如果类扩展将所有传感器 CS 值设置为 0,则传感器(下面提到的传感器除外)必须在每个 E-CRI 上报告一个样本读数。
例外
- 如果PKEY_SensorData_SubscribedActivityStates设置为 0,活动检测传感器不得报告任何活动更改。 相反,当传感器需要流式传输时,传感器类扩展会将PKEY_SensorData_ActivityStream设置为 TRUE。
- 邻近感应传感器和简单设备方向不得支持流式处理。
- 仅当邻近感应检测状态在检测到与未检测到之间 (更改时,邻近感应传感器必须报告样本读数,反之亦然,) ,但必须遵循的初始样本读数除外。
- 简单设备方向传感器必须仅在设备方向更改象限时报告样本读数,但必须遵循的初始样本读数除外。
初始示例读取
通过调用 EvtSensorStart 启动传感器驱动程序时,一旦传感器硬件准备好发送有效数据,驱动程序必须立即通过调用 SensorsCxSensorDataReady 报告一个传感器示例。 无论报告间隔或更改敏感度设置,初始样本读取都必须发送到类扩展。 应用程序使用初始示例作为示例读取比较的基础。 此规则适用于所有传感器。
用于数据筛选的设备运行时优化
本部分介绍开发传感器驱动程序时应考虑的几个运行时优化。
支持中断
驱动程序应依赖于中断,而不是轮询设备。 这将导致性能和电源管理改进。 这些改进包括以下内容。
- 设备可以根据当前更改敏感度和报告间隔进入较低功率状态。
- 使用中断将减少驱动程序和传感器固件中不必要的代码执行。
- 使用中断会减少总线活动。
注意
如果驱动程序依赖于中断,但驱动程序中存在当前报告间隔和更改敏感度逻辑,则驱动程序可能会在数据更新之间收到大量中断。 因此,驱动程序可能需要禁用 (或屏蔽) 中断,直到当前报告间隔过期。
将更改敏感度支持移动到设备
如果传感器硬件或固件支持阈值检测,则应使用此功能来支持更改敏感度。 通过将支持移动到设备,然后响应相应的中断,可以减少驱动程序中的处理开销。
将报表间隔支持移动到设备
如果传感器硬件或固件支持报告间隔的概念,则应使用此功能。
如果传感器不提供本机报告间隔支持,请考虑对当前报告间隔的子集禁用中断。 然后,经过此时间后,检索当前设备数据。