節電のためのセンサー データの一括処理

このトピックでは、Windows 10 でセンサーデータのバッチ処理を実装するために、センサークラス拡張機能とセンサードライバーの間で必要なインターフェイスについて説明します。

はじめに

データのバッチ処理を実装するセンサードライバーを使用すると、プロセッサがセンサーデータを受信して処理する頻度が低くなるため、アプリケーションプロセッサは電力を節約できます。 この場合、センサードライバーは、センサーハードウェア内のセンサーデータサンプルをバッファーし、それらを一括してセンサークラス拡張機能に転送します。 バッチ処理をサポートするには、必要なインターフェイスを実装する UMDF 2.0 ユニバーサルセンサードライバーを提供する必要があります。

バッチの遅延

バッチの遅延は、センサーが収集されたデータサンプルをセンサークラス拡張機能に配信する前にバッファーに格納できる最大時間として定義されます。 センサーデータのバッチ処理の「スケジュール」は、次の図に示すように、バッチ待機時間の値に基づいて、ドライバーによってセンサーイベントが配信されるときに開始されます。

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

    これは、指定したセンサーのバッチ待機時間を設定するコールバック関数です。 ドライバーは、バッファーの可用性に応じて、バッチの遅延を 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 はバッチの遅延を前の数式で示した値に設定します。

呼び出し元が DataRateMs より小さい BatchLatencyMs の値を指定した場合、データはバッファリングなしで配信されます。

データしきい値を使用したバッチ処理

データのバッチ処理を実装するセンサードライバーでは、EvtSensorSetDataThresholds を使用して、0 以外のデータしきい値を設定できます。 この場合、現在の読み取りと最後の読み取りの間のデータ値の差が EvtSensorSetDataThresholds を使用して設定されたデータしきい値を超えると、データ収集、バッチ処理、配信プロセスが呼び出されます。 そのため、データのバッチ処理をデータのしきい値と共に使用することで、センサードライバーはさらに多くの電力を節約できます。

センサークラス拡張機能によってデータのバッチ処理と共に 0 以外のデータしきい値が設定されている場合、ドライバーは正確なタイムスタンプでバッチ処理されたサンプルを提供し、データのしきい値も受け入れると予想されます。 センサーハードウェア自体がデータしきい値を適用しながら正確なタイムスタンプを保持できない場合は、データしきい値を適用せずにサンプルを収集できます。 ただし、このような場合、ドライバーは、センサークラス拡張機能に提供する前に、現在のデータしきい値の設定を満たしていないサンプルを除外する必要があります。

シーケンス図の例

データバッチ処理のオプション DDSI 関数でメンションされたオプションのデータバッチ処理 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 と同じ時間間隔ごとに少なくとも 1 回、ハードウェアバッファーを読み取ることになっています。 ハードウェア FIFO バッファーがいっぱいになると、ラップして循環バッファーのように動作し、古いイベントを上書きする必要があります。