为了节能而对传感器数据进行批处理

本主题介绍在Windows 10中实现传感器数据批处理所需的传感器类扩展和传感器驱动程序之间的接口。

简介

实现数据批处理的传感器驱动程序允许应用程序处理器节省电量,因为处理器接收和处理传感器数据的频率较低。 在这种情况下,传感器驱动程序在传感器硬件中缓冲传感器数据样本,然后将其分批传输到传感器类扩展。 若要支持批处理,必须提供实现所需接口的 UMDF 2.0 通用传感器驱动程序。

批处理延迟

Batch 延迟定义为传感器在收集数据样本后,在将数据传送到传感器类扩展之前可以缓冲数据样本的最长时间。 传感器数据批处理“计划”在驱动程序传递传感器事件时启动,具体取决于下图所示的批处理延迟值。

显示使用正常数据传送的 n 个数据样本的收集和发送序列的示意图。

对于不实现数据批处理的驱动程序,驱动程序只是在传感器数据可用时收集并发送数据。 因此,例如,若要发送 N 个数据样本,驱动程序将启动数据样本的收集和发送,即 N 次。

显示 n 个数据样本的收集和发送序列的示意图,在批处理数据传送中使用 2 个批次。

对于实现数据批处理的驱动程序,将分批执行数据收集和传递序列,如上图中所示。 批延迟值由传感器类扩展指定。 因此,例如,当传感器硬件必须收集和传输 N 个数据样本时,传感器驱动程序可以将该过程拆分为两批。 N 数据样本的前半部分将在等于批处理延迟期的时间间隔后发送。 然后,在另一个批延迟时间间隔之后,将发送后半部分数据样本,与正常传递方法所需的 N 个传输相比,总共进行两次传输。

传感器属性

除了必需的常见传感器属性和枚举属性外,支持数据批处理的驱动程序还必须报告以下属性:

  • PKEY_Sensor_FifoReservedSize_Samples
  • PKEY_Sensor_FifoMaxSize_Samples
  • PKEY_Sensor_WakeCapable

有关详细信息,请参阅 常见传感器属性枚举属性

如果传感器硬件子系统支持唤醒,则应确保提前启动唤醒,以避免缓冲区溢出。

用于数据批处理的可选 DDSI 函数

设备驱动程序软件接口 (DDSI) 函数是驱动程序和类扩展之间的接口。 若要支持数据批处理,驱动程序必须实现以下 DDSI 函数,以便传感器类扩展可以设置批处理延迟。

  • EvtSensorSetBatchLatency

    这是一个回调函数,用于设置指定传感器的批延迟。 驱动程序应将 Batch 延迟设置为小于或等于 BatchLatencyMs 参数的值,具体取决于缓冲区可用性。

驱动程序还必须实现所有必需的 DDSI 函数。 有关详细信息,请参阅 _SENSOR_CONTROLLER_CONFIG结构

传感器类扩展可以选择指定批延迟。 所有传感器的默认批处理延迟为零 (0) ,用于指示不会对样本进行批处理。 仅当类扩展调用 EvtSensorSetBatchLatency 来设置批延迟值时,才会分批交付传感器示例。 否则,将按定期数据间隔速率正常传送样本。

传感器类扩展可以随时调用 EvtSensorSetBatchLatency 来更改批延迟值。 具体而言,当指定的传感器已处于活动状态且正在运行时,可以调用此函数,这不应导致事件丢失。 传感器驱动程序应立即收集并开始交付最新批次的样本, (尽最大努力) 。 驱动程序不应超过类扩展指定的批延迟。

请务必注意,由于数据批处理,传感器数据传送方法和事件没有隐含更改。 当批处理延迟过期时,驱动程序会重复调用 SensorsCxSensorDataReady,以一次一个提供所有缓冲的数据样本。 数据样本附带时间戳 (包含在其关联的PKEY_SensorData_Timestamp数据字段中,) 指示每次采样的时间。 有关PKEY_SensorData_Timestamp的详细信息,请参阅 通用数据字段

批处理延迟和数据速率关系

批延迟和数据速率相关如下:

批处理延迟值的公式(以毫秒为单位)。

其中 ,SensorBatching_MaxSize_Bytes 是批处理传感器数据的最大缓冲区大小。 如果传感器是加速计,则建议使用足够大的硬件缓冲区来容纳 250 个或更多样本。 数据速率以毫秒为单位表示,它是传输一个数据样本所需的时间长度。 传感器硬件在一批中必须存储的样本数与数据速率成反比。 数据速率越小,存储给定批延迟值的批处理样本所需的样本缓冲区就越大。 在前面的公式中,批处理延迟由 BatchLatencyMs 表示,数据速率由 DataRateMs 表示。 如果 BatchLatencyMsDataRateMs 的组合导致缓冲区大小大于 SensorBatching_MaxSize_Bytes,则 EvtSensorSetBatchLatencyEvtSensorSetDataInterval 会将批延迟设置为上述公式所示的值。

如果调用方指定的 BatchLatencyMs 值小于 DataRateMs,则无需缓冲即可传送数据。

使用数据阈值进行批处理

实现数据批处理的传感器驱动程序可以使用 EvtSensorSetDataThresholds 设置非零数据阈值。 在这种情况下,当当前读数与上次读取之间的数据值差超过使用 EvtSensorSetDataThresholds 设置的数据阈值时,将调用数据收集、批处理和传递过程。 因此,将数据批处理与数据阈值结合使用,使传感器驱动程序可以节省更多电量。

当传感器类扩展与数据批处理一起设置非零数据阈值时,驱动程序应提供具有准确时间戳的批处理样本,并遵守数据阈值。 如果传感器硬件本身在强制实施数据阈值时无法保持准确的时间戳,则可以在不强制实施数据阈值的情况下收集样本。 但是,在这种情况下,驱动程序应先筛选出不符合当前数据阈值设置的样本,然后再将其传送到传感器类扩展。

序列图示例

下面的序列图显示了用于数据批处理的可选 DDSI 函数中提到的 可选数据批处理 DDSI 函数的用法。 我们可以根据需要添加更多序列图,以根据合作伙伴反馈阐明方案。

方案 1

在此方案中,传感器类扩展在启动传感器之前设置批延迟和数据间隔。 传感器启动后,它会定期交付批,同时遵循设置的属性。

显示类扩展在启动传感器之前设置批延迟和数据间隔的序列图。

方案 2

在此方案中,传感器类扩展在启动传感器之前设置批延迟、数据间隔和数据阈值。 传感器启动后,它会定期交付批,同时遵循设置的属性。 请注意,驱动程序不应传递批处理,除非有满足数据阈值的样本,需要在指定的批处理延迟内发送该示例。

显示类扩展在启动传感器之前设置批延迟、数据间隔和数据阈值的序列图。

方案 3

在此方案中,传感器类扩展在启动传感器之前设置批延迟和数据间隔。 传感器启动后,它会定期交付批,同时遵循设置的属性。 传感器类扩展在传感器运行时更改批处理延迟和数据间隔,驱动程序会立即开始根据新值传送样本,而不会在运行时丢失任何数据样本。

显示类扩展在启动传感器之前设置批延迟、数据间隔的序列图。该图还显示了传感器在处理数据传输的同时如何继续响应设置中的更改。

数据批处理硬件配置

传感器数据必须在传感器硬件中批处理,而无需应用程序处理器的参与。 这将允许处理器在批处理数据时进入睡眠状态,以节省电源。 下图显示了基于传感器硬件的数据批处理的可能配置。

  • 配置 1:FIFO 缓冲区在传感器组件中实现,该组件直接连接到应用程序处理器。

  • 配置 2:FIFO 缓冲区在传感器组件连接到的低功耗传感器硬件核心中实现。 在这种情况下,FIFO 缓冲区可以在多个传感器之间共享,甚至与非传感器组件共享,具体取决于传感器核心设计。 低功耗传感器核心反过来连接到应用程序处理器,并可以集成到 SoC 中。 或者,它可能是外部组件。

  • 配置 3:FIFO 缓冲区在传感器组件上实现。 传感器组件连接到连接到应用程序处理器的低功耗传感器核心。 传感器组件可以集成到 SoC 中,也可以是外部组件。

  • 配置 4:FIFO 缓冲区在传感器组件和低功率传感器核心上实现。 传感器组件连接到低功耗传感器核心,后者又连接到应用程序处理器。 传感器组件可以集成到 SoC 中,也可以是外部组件。 值得注意的是,传感器核心可用于扩展太浅的 FIFO。

需要注意的关键是,FIFO 可以在传感器核心硬件或传感器硬件上实现,也可以同时在两者上实现。 驱动程序对此操作系统进行抽象化,并通过 DDSI 提供统一接口。

下图演示了上述列表中描述的不同配置。

显示托管批处理传感器数据的可能硬件配置的示意图。

硬件中的缓冲区已满行为

在正常情况下,驱动程序应至少每次时间间隔等于 BatchLatencyMs 读取硬件缓冲区一次,以确保不会删除或丢失任何数据。 当硬件 FIFO 缓冲区填满时,它应环绕并像循环缓冲区一样运行,覆盖较旧的事件。