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

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

简介

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

批处理延迟

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

diagram showing the collection and sending sequence of n data samples, using normal data delivery.

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

diagram showing the collection and sending sequence of n data samples, using 2 batches in batched data delivery.

对于实现数据批处理的驱动程序,数据收集和传递顺序以批处理方式执行,如下图所示。 批延迟值由传感器类扩展指定。 因此,当传感器硬件必须收集和传输 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的详细信息,请参阅 “常见数据”字段

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

批处理延迟和数据速率相关,如下所示:

formula for the batch latency value in milliseconds.

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

如果调用方指定小于 DataRateMsBatchLatencyMs 值,则不会缓冲传递数据。

使用数据阈值进行批处理

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

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

序列图示例

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

方案 1

在此方案中,传感器类扩展在启动传感器之前设置批处理延迟和数据间隔。 传感器启动后,它会定期传递批,同时尊重集属性。

sequence diagram showing scenario where the class extension sets the batch latency and data interval, before starting the sensor.

方案 2

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

sequence diagram showing scenario where the class extension sets the batch latency, data interval, and data thresholds before starting the sensor.

方案 3

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

sequence diagram showing scenario where the class extension sets the batch latency, data interval before starting the sensor. diagram also shows how the sensor continues to respond to changes in settings, while taking care of data transfers.

数据批处理硬件配置

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

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

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

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

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

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

下图演示了前面列表中介绍的不同配置。

diagram showing the possible hardware configurations for hosting batched sensor data.

硬件中的缓冲区完全行为

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