Freigeben über


Component-Level Energiemanagement

Ab Windows 8 ermöglicht das Power Management Framework (PoFx) einem Treiber die Verwaltung der Leistungszustände der einzelnen Komponenten in einem Gerät. Die Energieverwaltung auf Komponentenebene ist parallel zur Energieverwaltung auf Geräteebene vorhanden. Eine Einführung finden Sie unter Übersicht über das Power Management Framework.

Diese Seite beschreibt die PoFx-API für Component-Level Power Management.

Um ein Gerät zu registrieren, das von PoFx verwaltet werden soll, ruft der Treiber die PoFxRegisterDevice-Routine auf. Der Treiber übergibt der Routine eine PO_FX_DEVICE-Struktur, die unter anderem ein Array von PO_FX_COMPONENT-Strukturen enthält. Jedes Element in diesem Array beschreibt die Fx-Energiezustände einer Komponente im Gerät und die Attribute jedes Fx-Zustands. (Mindestens eine Komponente, die die Energieverwaltung auf Komponentenebene nicht unterstützt, implementiert nur den F0-Zustand.) Die Attribute eines bestimmten Fx-Energiezustands in einer bestimmten Komponente werden durch eine PO_FX_COMPONENT_IDLE_STATE Struktur beschrieben, die die folgenden Werte enthält:

  • Die Übergangslatenz, die die Zeit ist, die erforderlich ist, um einen Übergang von diesem Fx-Zustand zum F0-Zustand (vollständig aktiviert) zu machen.
  • Die Aufenthaltsanforderung, die die Zeit beschreibt, die eine Komponente in diesem Fx-Zustand verbringen muss, damit ein Übergang in den Zustand lohnenswert ist.
  • Die Nominalleistung, die von der Komponente in diesem Fx-Zustand verbraucht wird.

PoFx verwendet diese Informationen (zusätzlich zu anderen systemweiten Eingaben und Abhängigkeiten), um intelligente Entscheidungen darüber zu treffen, in welchem Fx-Stromzustand eine Komponente zu einem bestimmten Zeitpunkt sein sollte. PoFx muss zwei konkurrierende Ziele ausgleichen. Zunächst sollte eine Komponente, die im Leerlauf ist, so konfiguriert werden, dass so wenig Energie wie möglich verbraucht wird. Zweitens muss eine Komponente bereit sein, von einem Fx-Zustand mit niedriger Leistung zu F0 schnell genug zu wechseln, um das Erscheinungsbild eines Geräts aufrechtzuerhalten, das immer eingeschaltet und immer verbunden ist.

Die Energieverwaltung auf Komponentenebene kann nur ausgeführt werden, wenn sich ein Gerät im Energiezustand D0 (vollständig eingeschaltet) befindet. Wenn sich ein Gerät im D1-Zustand (fast eingeschaltet), D2-Zustand (fast ausgeschaltet) oder D3-Zustand befindet, ist das Gerät nicht zugänglich. Wenn sich das Gerät im D0-Zustand befindet, müssen nur Komponenten, die der Treiber aktiv verwendet, im F0-Zustand verbleiben. Leerlaufkomponenten können potenziell zu Fx-Zuständen mit niedriger Leistung wechseln, um den Stromverbrauch zu reduzieren.

Während sich ein Gerät im D0-Energiezustand befindet, folgt der Treiber einem einfachen Protokoll, um die Energieverwaltung auf Komponentenebene zu aktivieren. Wenn der Treiber auf eine Komponente zugreifen muss, ruft der Treiber die PoFxActivateComponent-Routine auf, um den Zugriff auf die Komponente anzufordern. Wenn sich die Komponente in einem Fx-Zustand mit niedriger Leistung befindet, wenn dieser Aufruf auftritt, initiiert PoFx einen Übergang zum F0-Zustand und benachrichtigt den Treiber, wenn dieser Übergang abgeschlossen ist. Der Treiber kann dann auf die Komponente zugreifen. Wenn der Treiber nicht mehr auf die Komponente zugreifen muss, ruft der Treiber die PoFxIdleComponent-Routine auf, um PoFx zu benachrichtigen. Als Reaktion auf diesen Aufruf kann PoFx die Komponente potenziell in einen Fx-Zustand mit niedriger Leistung wechseln.

Eine Komponente, auf die zugegriffen werden kann, befindet sich in der aktiven Bedingung. Eine Komponente, auf die nicht zugegriffen werden kann, befindet sich in der Leerlaufbedingung. Um die Barrierefreiheit der Komponenten in einem Gerät nachzuverfolgen, verwaltet PoFx für jede Komponente eine Aktivierungsreferenzanzahl. Ein PoFxActivateComponent-Aufruf erhöht die Anzahl der angegebenen Komponente um eins, und ein PoFxIdleComponent-Aufruf verringert die Anzahl um eins.

Wenn ein PoFxActivateComponent-Aufruf die Anzahl von Null auf 1 erhöht, initiiert PoFx einen Übergang von der Leerlaufbedingung zur aktiven Bedingung und benachrichtigt den Treiber, wenn dieser Übergang abgeschlossen ist. Wenn ein PoFxActivateComponent ausgeführt wird, während die Komponente bereits im aktiven Zustand ist, bleibt die Komponente im aktiven Zustand und der Treiber erhält keine Benachrichtigung.

Wenn ein PoFxIdleComponent-Aufruf die Anzahl von 1 auf Null erhöht, initiiert PoFx einen Übergang von der aktiven Bedingung zur Leerlaufbedingung und benachrichtigt den Treiber, wenn dieser Übergang abgeschlossen ist. Wenn ein PoFxIdleComponent-Aufruf die Anzahl dekrementiert, die Anzahl aber nicht null bleibt, bleibt die Komponente in der aktiven Bedingung, und der Treiber erhält keine Benachrichtigung.

Die Anzahl der Aktivierungsreferenzen behandelt bequem Situationen, in denen zwei oder mehr Codepfade im selben Treiber möglicherweise gleichzeitig auf dieselbe Komponente in einem Gerät zugreifen müssen. Durch die Aufrechterhaltung dieser Anzahl ermöglicht PoFx den verschiedenen Komponenten des Treibers unabhängigen Zugriff auf die Komponente, ohne dass der Treiber den Zugriff auf die Komponente zentral verwalten muss.

Die aktive/Leerlaufbedingung einer Komponente ist die einzige zuverlässige Möglichkeit für einen Treiber, um festzustellen, ob auf eine Komponente zugegriffen werden kann. Eine Komponente, die sich im F0-Energiezustand befindet, sich aber im Leerlauf befindet, ist möglicherweise dabei, in einen Fx-Zustand mit niedriger Leistung zu wechseln.

Eine Komponente, die sich in der aktiven Bedingung befindet, befindet sich immer im F0-Zustand. Die Komponente kann F0 erst verlassen, wenn sie den Leerlaufzustand erreicht. Eine Komponente, die sich im Leerlauf befindet, kann sich in F0 oder in einem Fx-Zustand mit niedriger Leistung befinden. Wenn sich eine Komponente in einem Fx-Zustand mit niedriger Leistung befindet, wenn ein PoFxActivateComponent-Aufruf einen Übergang von der Leerlaufbedingung zur aktiven Bedingung initiiert, muss PoFx zuerst die Komponente auf F0 umstellen, bevor die Komponente in die aktive Bedingung gelangen kann.

Referenz zur Geräte-Energieverwaltung