Component-Level Energieverwaltung

Ab Windows 8 ermöglicht das Power Management Framework (PoFx) einem Treiber die Verwaltung der Energiezustä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.

Auf dieser Seite wird die PoFx-API für Component-Level Power Management beschrieben.

Um ein Gerät zu registrieren, das von PoFx verwaltet werden soll, ruft der Treiber die PoFxRegisterDevice-Routine auf. Der Treiber übergibt diese Routine eine PO_FX_DEVICE Struktur, die neben anderen Daten ein Array von PO_FX_COMPONENT-Strukturen enthält. Jedes Element in diesem Array beschreibt die Fx-Leistungszustände einer Komponente im Gerät und die Attribute jedes Fx-Zustands. (Mindestens implementiert eine Komponente, die die Energieverwaltung auf Komponentenebene nicht unterstützt, nur den Zustand F0.) 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, d. h. die Zeit, die erforderlich ist, um einen Übergang von diesem Fx-Zustand in den Zustand F0 (vollständig ein) zu machen.
  • Die Wohnsitzanforderung, die die Zeit ist, die eine Komponente in diesem Fx-Zustand aufwenden muss, um einen Übergang in den Staat lohnend zu machen.
  • 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-Energiezustand sich eine Komponente zu einem bestimmten Zeitpunkt befinden sollte. PoFx muss zwei konkurrierende Ziele ausgleichen. Zunächst sollte eine Komponente, die sich im Leerlauf befindet, so konfiguriert werden, dass sie so wenig Strom wie möglich verbraucht. Zweitens muss eine Komponente bereit sein, schnell genug von einem Fx-Zustand mit geringer Leistung auf F0 umzuschalten, um das Aussehen eines Geräts zu erhalten, das immer eingeschaltet und immer verbunden ist.

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

Während sich ein Gerät im D0-Energiezustand befindet, folgt der Treiber einem einfachen Protokoll, um die Energieverwaltung auf Komponentenebene zu ermöglichen. 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 bei diesem Aufruf in einem Fx-Zustand mit geringer Leistung befindet, initiiert PoFx einen Übergang in den 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 möglicherweise in einen Fx-Zustand mit geringer Leistung umschalten.

Eine Komponente, auf die zugegriffen werden kann, befindet sich in der aktiven Bedingung. Eine Komponente, auf die nicht zugegriffen werden kann, befindet sich im Leerlauf. Um die Barrierefreiheit der Komponenten in einem Gerät nachzuverfolgen, verwaltet PoFx eine Aktivierungsreferenzanzahl für jede Komponente. 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 0 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 auftritt, wenn sich die Komponente bereits in der aktiven Bedingung befindet, bleibt die Komponente in der aktiven Bedingung, 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 verringert, die Anzahl jedoch nicht zero bleibt, bleibt die Komponente in der aktiven Bedingung, und der Treiber erhält keine Benachrichtigung.

Die Anzahl der Aktivierungsreferenzen behandelt 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 Beibehaltung dieser Anzahl ermöglicht PoFx den verschiedenen Komponenten des Treibers, den Zugriff auf die Komponente unabhängig zu verwalten, ohne dass der Treiber den Zugriff auf die Komponente zentral verwalten muss.

Die Aktiv-/Leerlaufbedingung einer Komponente ist das einzige zuverlässige Mittel für einen Treiber, um zu bestimmen, ob auf eine Komponente zugegriffen werden kann. Eine Komponente, die sich im Energiezustand F0 befindet, sich aber im Leerlauf befindet, kann in den Fx-Zustand mit geringer Leistung wechseln.

Eine Komponente, die sich in der aktiven Bedingung befindet, befindet sich immer im F0-Zustand. Die Komponente kann F0 erst verlassen, wenn sie in die Leerlaufbedingung wechselt. Eine Komponente, die sich im Leerlauf befindet, kann sich in F0 oder im Fx-Zustand mit niedriger Leistung befinden. Wenn sich eine Komponente in einem Fx-Zustand mit geringem Stromverbrauch 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äteenergieverwaltung