共用方式為


省電的感測器數據批處理

本主題涵蓋感測器類別延伸模組和感測器驅動程式之間所需的介面,以在 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 個以上的樣本的硬體緩衝區。 數據速率是以毫秒表示,而這是傳輸一個數據樣本所需的時間長度。 感測器硬體必須儲存在批次中的樣本數目與數據速率相反。 數據速率越小,儲存指定批次延遲值之批次樣本所需的樣本緩衝區愈大。 在上述公式中,批次延遲是以 BatchLatencyM 表示,而數據速率則以 DataRateMs 表示。 而且如果 BatchLatencyMsDataRateMs 的組合會產生大於 SensorBatching_MaxSize_Bytes的緩衝區大小,則 EvtSensorSetBatchLatencyEvtSensorSetDataInterval 會將批次延遲設定為上述公式所示的值。

如果呼叫端指定小於 DataRateMsBatchLatencyMs 值,則會在不緩衝的情況下傳遞數據。

使用數據臨界值進行批處理

實作數據批處理的感測器驅動程式可以使用 EvtSensorSetDataThresholds 來設定非零數據閾值。 在此情況下,當目前讀數與最後一個讀數之間的數據值差異超過使用 EvtSensorSetDataThresholds 設定的數據閾值時,就會叫用數據收集、批處理和傳遞程式。 因此,搭配數據臨界值使用數據批處理,可讓感測器驅動程序節省更多電源。

當感測器類別延伸模組設定非零數據臨界值以及數據批處理時,驅動程式預期也會傳遞具有精確時間戳的批次樣本,以及接受數據臨界值。 如果感測器硬體本身無法保留精確的時間戳,同時強制執行數據閾值,則可以收集樣本而不強制執行數據臨界值。 不過,在這種情況下,驅動程式應該先篩選出不符合目前數據閾值設定的樣本,再將它們傳遞至感測器類別延伸模組。

時序圖範例

以下是顯示選擇性數據批處理 DDSI 函式使用方式的序列圖表,這些函式是 用於數據批處理的選擇性 DDSI 函式。 我們可以視需要新增更多順序圖表,以根據合作夥伴意見反應釐清案例。

案例 1

在此案例中,感測器類別延伸模組會先設定批次延遲和數據間隔,再啟動感測器。 感測器啟動時,它會定期傳遞批次,同時遵守 set 屬性。

序列圖顯示類別延伸模組在啟動感測器之前,設定批次延遲和數據間隔的案例。

案例 2

在此案例中,感測器類別延伸模組會在啟動感測器之前,先設定批次延遲、數據間隔和數據臨界值。 感測器啟動時,它會定期傳遞批次,同時遵守 set 屬性。 請注意,除非有符合數據閾值的範例,否則驅動程式不應該傳遞批次,這些值必須在指定的批次延遲內傳送。

序列圖顯示類別延伸模組在啟動感測器之前設定批次延遲、數據間隔和數據閾值的案例。

案例 3

在此案例中,感測器類別延伸模組會先設定批次延遲和數據間隔,再啟動感測器。 感測器啟動時,它會定期傳遞批次,同時遵守 set 屬性。 感測器類別延伸模組會在感測器執行時變更批次延遲和數據間隔,而驅動程式會根據新的值立即開始傳遞樣本,而不會在執行時遺失任何數據樣本。

序列圖顯示類別延伸模組在啟動感測器之前設定批次延遲、數據間隔的案例。圖表也會顯示感測器如何繼續回應設定中的變更,同時處理數據傳輸。

數據批處理硬體設定

感測器數據必須在感測器硬體中批處理,而不需要應用程式處理器介入。 這可讓處理器在批處理數據時睡眠以節省電源。 下圖顯示感測器硬體型數據批處理的可能設定。

  • 組態 1:FIFO 緩衝區是在感測器元件中實作,而該元件會直接連線到應用程式處理器。

  • 組態 2:FIFO 緩衝區會實作在低電源感測器硬體核心中,而感測器元件會連線到其中。 在此情況下,FIFO 緩衝區可能會跨多個感測器共用,或甚至視感測器核心設計而與非感測器元件共用。 低電源感測器核心接著會連線到應用程式處理器,而且可以整合到SoC中。 或者,它可能是外部元件。

  • 設定 3:FIFO 緩衝區會在感測器元件上實作。 感測器元件會聯機到低電源感測器核心,而該核心會連線到應用程序處理器。 感測器元件可以整合到SoC中,或者可能是外部元件。

  • 設定 4:FIFO 緩衝區會在感測器元件和低電源感測器核心上實作。 感測器元件會連線到低電源感測器核心,接著會連線到應用程式處理器。 感測器元件可以整合到SoC中,或者可能是外部元件。 值得注意的是,感測器核心可用來擴充太淺的 FIFO。

要注意的重點是,FIFO 可以在感測器核心硬體或感測器硬體或兩者上實作。 驅動程式會抽象化操作系統的這個,並透過 DDSI 呈現統一介面。

下圖說明上述清單中所述的不同組態。

此圖顯示裝載批次感測器數據的可能硬體組態。

硬體中的緩衝區完整行為

在正常情況下,驅動程式應該在每次等於 BatchLatencyMs 的時間間隔至少讀取硬體緩衝區一次,以確保不會卸除或遺失任何數據。 當硬體 FIFO 緩衝區填滿時,它應該包裝起來並像循環緩衝區一樣,覆寫較舊的事件。