Dela via


Component-Level Effekthantering

Från och med Windows 8 gör Power Management Framework (PoFx) det möjligt för en drivrutin att hantera energitillstånden för de enskilda komponenterna på en enhet. Energisparfunktioner på komponentnivå finns sida vid sida med energisparfunktioner på enhetsnivå. En introduktion finns i Översikt över Power Management Framework.

Den här sidan beskriver PoFx API för Component-Level Power Management.

För att registrera en enhet som ska hanteras av PoFx anropar drivrutinen PoFxRegisterDevice-rutinen . Drivrutinen skickar den här rutinen en PO_FX_DEVICE struktur som bland annat innehåller en matris med PO_FX_COMPONENT strukturer. Varje element i den här matrisen beskriver fx-energitillstånden för en komponent i enheten och attributen för varje Fx-tillstånd. (Minst implementerar en komponent som inte stöder energisparfunktioner på komponentnivå endast F0-tillståndet.) Attributen för ett visst fx-energitillstånd i en viss komponent beskrivs av en PO_FX_COMPONENT_IDLE_STATE struktur som innehåller följande värden:

  • Övergångsfördröjningen, vilket är den tid som krävs för att göra en övergång från det här Fx-tillståndet till F0-tillståndet (helt på).
  • Kravet på vistelsetid, vilket är den tid som en komponent måste spendera i detta Fx-tillstånd för att göra en övergång till detta tillstånd värdefull.
  • Den nominella kraften, som är den ström som förbrukas av komponenten i detta Fx-tillstånd.

PoFx använder den här informationen (förutom andra systemomfattande indata och beroenden) för att fatta intelligenta beslut om vilket fx-energitillstånd en komponent ska vara i vid en viss tidpunkt. PoFx måste balansera två konkurrerande mål. För det första bör en komponent som är inaktiv konfigureras för att förbruka så lite ström som möjligt. För det andra måste en komponent vara beredd att växla från ett fx-tillstånd med låg effekt till F0 tillräckligt snabbt för att upprätthålla utseendet på en enhet som alltid är på och alltid ansluten.

Energisparfunktioner på komponentnivå kan endast utföras när en enhet är i strömtillståndet D0 (helt på). När en enhet är i D1 (nästan på), D2 (nästan av) eller D3-strömtillstånd är enheten otillgänglig. När enheten är i D0-tillstånd behöver endast komponenter som drivrutinen aktivt använder förbli i F0-tillståndet. Inaktiva komponenter kan potentiellt växla till lågeffekts-fx-tillstånd för att minska energiförbrukningen.

När en enhet är i energispartillståndet D0 följer drivrutinen ett enkelt protokoll för att aktivera energisparfunktioner på komponentnivå. När drivrutinen behöver komma åt en komponent anropar drivrutinen rutinen PoFxActivateComponent för att begära åtkomst till komponenten. Om komponenten är i ett fx-tillstånd med låg effekt när det här anropet inträffar initierar PoFx en övergång till F0-tillståndet och meddelar drivrutinen när övergången är klar. Drivrutinen kan sedan komma åt komponenten. När drivrutinen inte längre behöver komma åt komponenten anropar drivrutinen PoFxIdleComponent-rutinen för att meddela PoFx. Som svar på det här anropet kan PoFx eventuellt växla komponenten till ett fx-tillstånd med låg effekt.

En komponent som är tillgänglig är i det aktiva tillståndet. En komponent som inte är tillgänglig är i inaktivt tillstånd. För att spåra tillgängligheten för komponenterna i en enhet upprätthåller PoFx ett antal aktiveringsreferenser för varje komponent. Ett PoFxActivateComponent-anrop ökar antalet för den angivna komponenten med en, och ett PoFxIdleComponent-anrop minskar antalet med en.

Om ett PoFxActivateComponent-anrop ökar antalet från noll till ett, påbörjar PoFx en övergång från vilotillstånd till aktivt tillstånd och meddelar drivrutinen när övergången har slutförts. Om en PoFxActivateComponent inträffar när komponenten redan är i det aktiva villkoret förblir komponenten i det aktiva villkoret och drivrutinen får inget meddelande.

Om ett PoFxIdleComponent-anrop minskar antalet från ett till noll, påbörjar PoFx en övergång från det aktiva tillståndet till viloläget, och meddelar drivrutinen när övergången är klar. Om ett PoFxIdleComponent-anrop minskar antalet men antalet förblir inte noll, förblir komponenten i det aktiva tillståndet och drivrutinen får inget meddelande.

Antalet aktiveringsreferenser hanterar praktiskt taget situationer där två eller flera kodsökvägar i samma drivrutin kan behöva komma åt samma komponent samtidigt på en enhet. Genom att upprätthålla det här antalet gör PoFx det möjligt för de olika delarna av drivrutinen att självständigt upprätthålla åtkomsten till komponenten utan att kräva att drivrutinen hanterar åtkomsten till komponenten centralt.

Det aktiva/inaktiva tillståndet för en komponent är det enda tillförlitliga sättet för en drivrutin att avgöra om en komponent är tillgänglig. En komponent som är i F0-strömtillstånd men är i inaktivt tillstånd kan vara på väg att växla till ett fx-tillstånd med låg effekt.

En komponent som är i det aktiva villkoret är alltid i F0-tillståndet. Komponenten kan inte lämna F0 förrän den har angett inaktivt villkor. En komponent som är i inaktivt tillstånd kan vara i F0 eller i ett fx-tillstånd med låg effekt. Om en komponent är i ett fx-tillstånd med låg effekt när ett PoFxActivateComponent-anrop initierar en övergång från inaktivitetsvillkoret till det aktiva villkoret, måste PoFx först växla komponenten till F0 innan komponenten kan ange det aktiva villkoret.

Referens för energisparfunktioner för enhet