전력 절약을 위한 센서 데이터 일괄 처리
이 항목에서는 Windows 10 센서 데이터 일괄 처리를 구현하기 위해 센서 클래스 확장과 센서 드라이버 간에 필요한 인터페이스에 대해 설명합니다.
소개
데이터 일괄 처리를 구현하는 센서 드라이버를 사용하면 프로세서가 센서 데이터를 덜 자주 수신하고 처리하므로 애플리케이션 프로세서가 전원을 절약할 수 있습니다. 이 경우 센서 드라이버는 센서 하드웨어의 센서 데이터 샘플을 버퍼링한 다음, 일괄 처리로 센서 클래스 확장으로 함께 전송합니다. 일괄 처리를 지원하려면 필요한 인터페이스를 구현하는 UMDF 2.0 유니버설 센서 드라이버를 제공해야 합니다.
일괄 처리 대기 시간
Batch 대기 시간은 센서가 수집된 후 센서 클래스 확장에 전달하기 전에 데이터 샘플을 버퍼링할 수 있는 최대 시간으로 정의됩니다. 센서 데이터 일괄 처리 "일정"은 다음 다이어그램과 같이 배치 대기 시간 값을 기반으로 드라이버에서 센서 이벤트를 전달할 때 시작됩니다.
데이터 일괄 처리를 구현하지 않는 드라이버의 경우 드라이버는 센서 데이터를 수집하여 사용할 수 있게 되면 전송합니다. 예를 들어 N 데이터 샘플을 보내려면 드라이버가 N번 데이터 샘플의 수집 및 전송을 시작합니다.
데이터 일괄 처리를 구현하는 드라이버의 경우 앞의 다이어그램과 같이 데이터 수집 및 배달 시퀀스가 일괄 처리로 수행됩니다. 일괄 처리 대기 시간 값은 센서 클래스 확장에 의해 지정됩니다. 따라서 센서 하드웨어가 N 데이터 샘플을 수집하고 전송해야 하는 경우 센서 드라이버는 프로세스를 두 개의 일괄 처리로 분할할 수 있습니다. N 데이터 샘플의 처음 절반은 일괄 처리 대기 시간 기간과 동일한 시간 간격 후에 전송됩니다. 그런 다음 또 다른 일괄 처리 대기 시간 간격 후에 데이터 샘플의 후반부가 전송되어 일반 배달 방법에 필요한 N 전송과 비교하여 총 2개의 전송을 수행합니다.
센서 속성
필요한 일반적인 센서 속성 및 열거형 속성 외에도 데이터 일괄 처리를 지원하는 드라이버도 다음 속성을 보고해야 합니다.
- PKEY_Sensor_FifoReservedSize_Samples
- PKEY_Sensor_FifoMaxSize_Samples
- PKEY_Sensor_WakeCapable
자세한 내용은 공통 센서 속성 및 열거형 속성을 참조하세요.
센서 하드웨어 하위 시스템이 절전 모드 해제 가능인 경우 버퍼 오버런을 방지하기 위해 충분히 일찍 절전 모드 해제를 시작해야 합니다.
데이터 일괄 처리를 위한 선택적 DDSI 함수
DDSI(디바이스 드라이버 소프트웨어 인터페이스) 함수는 드라이버와 클래스 확장 간의 인터페이스입니다. 데이터 일괄 처리를 지원하려면 센서 클래스 확장에서 일괄 처리 대기 시간을 설정할 수 있도록 드라이버가 다음 DDSI 함수를 구현해야 합니다.
-
지정된 센서의 일괄 처리 대기 시간을 설정하는 콜백 함수입니다. 드라이버는 버퍼 가용성에 따라 Batch 대기 시간을 BatchLatencyMs 매개 변수보다 작거나 같은 값으로 설정해야 합니다.
또한 드라이버는 필요한 모든 DDSI 함수를 구현해야 합니다. 자세한 내용은 _SENSOR_CONTROLLER_CONFIG 구조를 참조하세요.
센서 클래스 확장에서 일괄 처리 대기 시간을 지정하는 것은 선택 사항입니다. 모든 센서의 기본 일괄 처리 대기 시간은 0이며 샘플이 일괄 처리되지 않음을 나타내는 데 사용됩니다. 센서 샘플은 클래스 확장이 EvtSensorSetBatchLatency 를 호출하여 일괄 처리 대기 시간 값을 설정하는 경우에만 일괄 처리로 제공됩니다. 그렇지 않으면 샘플이 정기적으로 데이터 간격 속도로 정상적으로 전달됩니다.
센서 클래스 확장은 EvtSensorSetBatchLatency 를 호출하여 언제든지 일괄 처리 대기 시간 값을 변경할 수 있습니다. 특히 지정된 센서가 이미 활성 상태이고 실행 중인 동안 이 함수를 호출할 수 있으며 이로 인해 이벤트가 손실되지 않아야 합니다. 센서 드라이버는 최신 일괄 처리의 샘플을 즉시 수집하고 제공하기 시작할 것으로 예상됩니다(최선의 노력 기준). 드라이버는 클래스 확장에 지정된 일괄 처리 대기 시간을 초과해서는 안 됩니다.
데이터 일괄 처리로 인해 센서 데이터 배달 방법 및 이벤트에 암시된 변경 내용은 없다는 점에 유의해야 합니다. 일괄 처리 대기 시간이 만료되면 드라이버는 SensorsCxSensorDataReady를 반복적으로 호출하여 버퍼링된 모든 데이터 샘플을 한 번에 하나씩 제공합니다. 데이터 샘플에는 샘플링된 각 시점을 나타내는 타임스탬프를 동반합니다(연결된 PKEY_SensorData_Timestamp 데이터 필드에 포함됨). PKEY_SensorData_Timestamp 대한 자세한 내용은 공통 데이터 필드를 참조하세요.
일괄 처리 대기 시간 및 데이터 속도 관계
일괄 처리 대기 시간 및 데이터 속도는 다음과 같습니다.
여기서 SensorBatching_MaxSize_Bytes 일괄 처리된 센서 데이터에 대한 버퍼의 최대 크기입니다. 센서가 가속도계인 경우 250개 이상의 샘플을 보관할 수 있을 만큼 큰 하드웨어 버퍼를 사용하는 것이 좋습니다. 데이터 속도는 밀리초 단위로 표현되며 하나의 데이터 샘플을 전송하는 데 걸리는 시간입니다. 센서 하드웨어가 일괄 처리에 저장해야 하는 샘플 수는 데이터 속도에 반비례합니다. 데이터 속도가 작을수록 지정된 일괄 처리 대기 시간 값에 대한 일괄 처리된 샘플을 저장하는 데 필요한 샘플 버퍼가 커집니다. 앞의 수식에서 일괄 처리 대기 시간은 BatchLatencyMs 로 표시되고 데이터 속도는 DataRateMs로 표시됩니다. BatchLatencyMs와 DataRateM의 조합으로 인해 버퍼 크기가 SensorBatching_MaxSize_Bytes보다 큰 경우 EvtSensorSetBatchLatency 및 EvtSensorSetDataInterval은 일괄 처리 대기 시간을 앞의 수식에 표시된 값으로 설정합니다.
호출자가 DataRateMs보다 작은 BatchLatencyMs 값을 지정하는 경우 데이터는 버퍼링 없이 전달됩니다.
데이터 임계값을 사용하여 일괄 처리
데이터 일괄 처리를 구현하는 센서 드라이버는 EvtSensorSetDataThresholds 를 사용하여 0이 아닌 데이터 임계값을 설정할 수 있습니다. 이 경우 현재 판독값과 마지막 판독값 간의 데이터 값 차이가 EvtSensorSetDataThresholds를 사용하여 설정된 데이터 임계값을 초과하면 데이터 수집, 일괄 처리 및 배달 프로세스가 호출됩니다. 따라서 데이터 임계값과 함께 데이터 일괄 처리를 사용하면 센서 드라이버가 더 많은 전력을 절약할 수 있습니다.
0이 아닌 데이터 임계값이 데이터 일괄 처리와 함께 센서 클래스 확장에 의해 설정되면 드라이버는 정확한 타임스탬프를 사용하여 일괄 처리된 샘플을 제공하고 데이터 임계값도 준수해야 합니다. 센서 하드웨어 자체가 데이터 임계값을 적용하는 동안 정확한 타임스탬프를 유지할 수 없는 경우 데이터 임계값을 적용하지 않고 샘플을 수집할 수 있습니다. 그러나 이러한 경우 드라이버는 센서 클래스 확장에 전달하기 전에 현재 데이터 임계값 설정을 충족하지 않는 샘플을 필터링해야 합니다.
시퀀스 다이어그램 예제
다음은 데이터 일괄 처리에 대한 선택적 DDSI 함수에 언급된 선택적 데이터 일괄 처리 DDSI 함수의 사용을 보여 주는 시퀀스 다이어그램입니다. 필요에 따라 더 많은 시퀀스 다이어그램을 추가하여 파트너 피드백에 따라 시나리오를 명확히 할 수 있습니다.
시나리오 1
이 시나리오에서 센서 클래스 확장은 센서를 시작하기 전에 일괄 처리 대기 시간 및 데이터 간격을 설정합니다. 센서가 시작되면 집합 속성을 준수하면서 주기적으로 일괄 처리를 제공합니다.
시나리오 2
이 시나리오에서 센서 클래스 확장은 센서를 시작하기 전에 일괄 처리 대기 시간, 데이터 간격 및 데이터 임계값을 설정합니다. 센서가 시작되면 집합 속성을 준수하면서 주기적으로 일괄 처리를 제공합니다. 지정된 일괄 처리 대기 시간 내에 전송해야 하는 데이터 임계값을 충족하는 샘플이 없는 한 드라이버는 일괄 처리를 제공하지 않아야 합니다.
시나리오 3
이 시나리오에서 센서 클래스 확장은 센서를 시작하기 전에 일괄 처리 대기 시간 및 데이터 간격을 설정합니다. 센서가 시작되면 집합 속성을 준수하면서 주기적으로 일괄 처리를 제공합니다. 센서 클래스 확장은 센서가 실행되는 동안 일괄 처리 대기 시간 및 데이터 간격을 변경하고, 드라이버는 실행하는 동안 데이터 샘플을 잃지 않고 새 값에 따라 샘플을 즉시 제공하기 시작합니다.
데이터 일괄 처리 하드웨어 구성
센서 데이터는 애플리케이션 프로세서의 개입 없이 센서 하드웨어에서 일괄 처리되어야 합니다. 그러면 데이터를 일괄 처리하는 동안 프로세서가 절전 모드로 이동하여 전원을 절약할 수 있습니다. 다음 다이어그램에서는 센서 하드웨어 기반 데이터 일괄 처리에 사용할 수 있는 구성을 보여 줍니다.
구성 1: FIFO 버퍼는 애플리케이션 프로세서에 직접 연결된 센서 구성 요소에서 구현됩니다.
구성 2: FIFO 버퍼는 센서 구성 요소가 연결된 저전력 센서 하드웨어 코어에서 구현됩니다. 이 경우 FIFO 버퍼는 센서 코어 디자인에 따라 여러 센서에서 공유되거나 센서가 아닌 구성 요소와 공유할 수도 있습니다. 저전력 센서 코어는 차례로 애플리케이션 프로세서에 연결되며 SoC에 통합될 수 있습니다. 또는 외부 구성 요소일 수 있습니다.
구성 3: FIFO 버퍼는 센서 구성 요소에 구현됩니다. 센서 구성 요소는 애플리케이션 프로세서에 연결된 저전력 센서 코어에 연결됩니다. 센서 구성 요소는 SoC에 통합되거나 외부 구성 요소일 수 있습니다.
구성 4: FIFO 버퍼는 센서 구성 요소 및 저전력 센서 코어에 구현됩니다. 센서 구성 요소는 저전력 센서 코어에 연결되며, 이 코어는 애플리케이션 프로세서에 연결됩니다. 센서 구성 요소는 SoC에 통합되거나 외부 구성 요소일 수 있습니다. 센서 코어를 사용하여 너무 얕은 FIFO를 확장할 수 있습니다.
주의해야 할 중요한 점은 FIFO가 센서 코어 하드웨어 또는 센서 하드웨어 또는 둘 다에서 구현될 수 있다는 것입니다. 드라이버는 운영 체제에 대해 이를 추상화하고 DDSI를 통해 균일한 인터페이스를 제공합니다.
다음 다이어그램에서는 앞의 목록에 설명된 다양한 구성을 보여 줍니다.
하드웨어의 버퍼 전체 동작
정상적인 상황에서 드라이버는 데이터가 삭제되거나 손실되지 않도록 BatchLatencyMs와 같은 간격마다 한 번 이상 하드웨어 버퍼를 읽어야 합니다. 하드웨어 FIFO 버퍼가 채워지면 래핑되고 원형 버퍼처럼 동작하여 이전 이벤트를 덮어씁니다.