本主题介绍在 Windows 10 中实现传感器数据批处理所需的传感器类扩展和传感器驱动程序之间的接口。
介绍
实现数据批处理的传感器驱动程序允许应用程序处理器节省电源,因为处理器接收和处理传感器数据的频率较低。 在这种情况下,传感器驱动程序会缓冲传感器硬件中的传感器数据样本,然后将其分批传输到传感器类扩展。 若要支持批处理,必须提供 UMDF 2.0 通用传感器驱动程序,该驱动程序实现所需的接口。
批处理延迟
Batch 延迟定义为传感器在收集数据样本后可以缓冲数据样本的最长时间,然后再将其传送到传感器类扩展。 驱动程序交付传感器事件时,传感器数据批处理“计划”将开始,具体取决于批处理延迟值,如下图所示。
对于不实现数据批处理的驱动程序,驱动程序只需在可用时收集和发送传感器数据。 例如,若要发送 N 个数据样本,驱动程序将启动数据样本的收集和发送,即 N 次。
对于实现数据批处理的驱动程序,数据收集和传递顺序按批执行,如下图所示。 批延迟值由传感器类扩展指定。 因此,当传感器硬件必须收集和传输 N 个数据样本时,例如,传感器驱动程序可以将该过程拆分成两批。 N 数据样本的前半部分将在等于批处理延迟周期的时间间隔后发送。 然后在第二批处理延迟时间间隔之后,将发送数据样本的后半部分,与正常传递方法所需的 N 次传输相比,总共进行两次传输。
传感器属性
除了所需的常见传感器属性和枚举属性外,支持数据批处理的驱动程序还必须报告以下属性:
- PKEY_Sensor_FifoReservedSize_Samples
- PKEY_Sensor_FifoMaxSize_Samples
- PKEY_Sensor_WakeCapable
如果传感器硬件子系统支持唤醒,则应确保它足够早启动唤醒,以避免缓冲区溢出。
用于数据批处理的可选 DDSI 函数
设备驱动程序软件接口 (DDSI) 函数是驱动程序和类扩展之间的接口。 为了支持数据批处理,驱动程序必须实现以下 DDSI 函数,以便传感器类扩展可以设置批延迟。
-
这是一个回调函数,用于设置指定传感器的批处理延迟。 驱动程序应根据缓冲区可用性将 Batch Latency 设置为小于或等于 BatchLatencyMs 参数的值。
驱动程序还必须实现所有必需的 DDSI 函数。 有关详细信息,请参阅 _SENSOR_CONTROLLER_CONFIG 结构。
传感器类扩展可以选择是否指定批处理延迟。 所有传感器的默认批处理延迟为零(0),用于指示不会对样本进行批处理。 仅当类扩展调用 EvtSensorSetBatchLatency 设置批处理延迟值时,传感器示例才会成批交付。 否则,样本将以定期数据间隔速率正常传递。
传感器类扩展可以调用 EvtSensorSetBatchLatency 来随时更改批延迟值。 具体而言,当指定的传感器已处于活动状态且正在运行时,可以调用此函数,这不应导致事件丢失。 传感器驱动程序预计将立即收集和开始交付最新批次的样本(尽最大努力)。 驱动程序不应超过类扩展指定的批处理延迟。
请务必注意,由于数据批处理,传感器数据传递方法和事件没有隐含的更改。 当批处理延迟过期时,驱动程序会反复调用 SensorsCxSensorDataReady,以一次传递所有缓冲的数据样本。 数据样本附带时间戳(包含在关联的PKEY_SensorData_Timestamp数据字段),指示每次采样的时间。 有关PKEY_SensorData_Timestamp的详细信息,请参阅 “通用数据”字段。
批处理延迟和数据速率关系
批处理延迟和数据速率相关,如下所示:
其中 SensorBatching_MaxSize_Bytes 是批处理传感器数据缓冲区的最大大小。 如果传感器是加速计,则我们建议使用足够大的硬件缓冲区来容纳 250 个或多个样本。 数据速率以毫秒为单位表示,它是传输一个数据样本所需的时间长度。 传感器硬件必须存储在批处理中的样本数与数据速率成反比。 数据速率越小,样本缓冲区越大,用于存储给定批延迟值的批处理样本。 在前面的公式中,批处理延迟由 BatchLatencyMs 表示,数据速率由 DataRateMs 表示。 如果 BatchLatencyMs 和 DataRateMs 的组合导致缓冲区大小大于 SensorBatching_MaxSize_Bytes,则 EvtSensorSetBatchLatency 和 EvtSensorSetDataInterval 会将批处理延迟设置为上一公式显示的值。
如果调用方指定小于 DataRateMs 的 BatchLatencyMs 值,则不会缓冲传递数据。
使用数据阈值进行批处理
实现数据批处理的传感器驱动程序可以使用 EvtSensorSetDataThresholds 设置非零数据阈值。 在这种情况下,当当前读取和上次读取之间的数据值差异超过使用 EvtSensorSetDataThreshold 设置的数据阈值时,将调用数据收集、批处理和传递过程。 因此,将数据批处理与数据阈值结合使用,使传感器驱动程序可以节省更多电源。
当传感器类扩展设置非零数据阈值以及数据批处理时,驱动程序应提供具有准确时间戳的批处理样本,并遵守数据阈值。 如果传感器硬件本身无法在强制实施数据阈值的同时保留准确的时间戳,则可以在不强制实施数据阈值的情况下收集样本。 但是,在这种情况下,驱动程序应先筛选出不符合当前数据阈值设置的示例,然后再将其传送到传感器类扩展。
序列图示例
下面是显示在数据批处理的可选 DDSI 函数中提到的可选数据批处理 DDSI 函数用法的序列图。 我们可以根据需要添加更多序列图,以根据合作伙伴反馈阐明方案。
方案 1
在此方案中,传感器类扩展在启动传感器之前设置批延迟和数据间隔。 传感器启动后,它会定期传输批数据,同时遵循设置的属性。
方案 2
在此方案中,传感器类扩展在启动传感器之前设置批处理延迟、数据间隔和数据阈值。 传感器启动后,它会定期发送数据批次,同时遵循设置的属性。 请注意,驱动程序在没有满足数据阈值值的示例时,不应提供批处理。这些示例需要在指定的批处理延迟内发送。
方案 3
在此方案中,传感器类扩展在启动传感器之前设置批延迟和数据间隔。 传感器启动后,它会定期传送批量数据,同时遵循设置的属性。 传感器类扩展在传感器运行时更改批延迟和数据间隔,驱动程序会根据新值立即开始传送样本,而不会在运行时丢失任何数据样本。
数据批处理硬件配置
传感器数据必须在传感器硬件中批处理,而无需应用程序处理器参与。 这将允许处理器在批处理数据以节省电源时进入睡眠状态。 下图显示了基于传感器硬件的数据批处理的可能配置。
配置 1:FIFO 缓冲区在传感器组件中实现,该组件直接连接到应用程序处理器。
配置 2:FIFO 缓冲区在低功率传感器硬件核心中实现,传感器组件连接到该核心。 在这种情况下,FIFO 缓冲区可以跨多个传感器共享,甚至与非传感器组件共享,具体取决于传感器核心设计。 低功率传感器核心反过来连接到应用程序处理器,并可能集成到 SoC 中。 或者,它可能是外部组件。
配置 3:FIFO 缓冲区在传感器组件上实现。 传感器组件连接到连接到应用程序处理器的低功率传感器核心。 传感器组件可以集成到 SoC 中,也可能是外部组件。
配置 4:FIFO 缓冲区在传感器组件和低功率传感器核心上实现。 传感器组件连接到低功率传感器核心,反过来又连接到应用程序处理器。 传感器组件可以集成到 SoC 中,也可能是外部组件。 值得注意的是,传感器核心可用于扩展太浅的 FIFO。
需要注意的一点是,FIFO 可以在传感器核心硬件或传感器硬件上或同时在两者上实现。 驱动程序为此作系统抽象化,并通过 DDSI 提供统一接口。
下图演示了前面列表中介绍的不同配置。
硬件中的缓冲区满行为
在正常情况下,驱动程序应至少读取一次硬件缓冲区,时间间隔等于 BatchLatencyMs,以确保不会删除或丢失任何数据。 当硬件 FIFO 缓冲区填满时,它应环绕并像循环缓冲区一样,覆盖较旧的事件。