Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
[Gäller endast KMDF]
En KMDF-drivrutin för en enhet med flera komponenter får endast skicka begäranden till komponenter som är i ett aktivt tillstånd. Vanligtvis tilldelar drivrutinen I/O-köer till komponenter eller uppsättningar med komponenter.
Överväg först en kö som har tilldelats till en enskild komponent. Drivrutinen startar kön när komponenten blir aktiv och stoppar kön när komponenten blir inaktiv. När KMDF anropar en begäranhanterare för kön är enheten i sitt fullt aktiva tillstånd (D0) och den nödvändiga komponenten är aktiv. Begärandehanteraren kan på ett säkert sätt komma åt komponentmaskinvaran.
Samma begrepp gäller för en kö som har tilldelats till en uppsättning komponenter. I det här fallet startar drivrutinen kön när alla komponenter i uppsättningen är aktiva. Föraren stoppar kön när någon av komponenterna blir överflödig.
Det här avsnittet beskriver hur en KMDF-drivrutin för en enhet med flera komponenter kan implementera sådant stöd i en situation med flera typer av begäranden som kräver olika kombinationer av komponenter.
Exempel
Identifiera nödvändiga komponenter för varje typ av begäran som stöds av drivrutinen. Tänk dig till exempel en enhet som har tre komponenter: 0, 1 och 2, för vilka drivrutinen tar emot tre typer av begäranden: A, B och C. Komponentkraven för begäranden är följande:
| Typ av begäran | Komponenter som behövs |
|---|---|
| A | 0,2 |
| B | 1 |
| C | 0,1,2 |
I det här exemplet finns det tre olika uppsättningar komponenter, en för varje typ av begäran. Drivrutinen tillhandahåller en standardinställd, energihanterad I/O-kö för enheten samt en ytterligare energihanterad kö som motsvarar varje uppsättning komponenter. I exemplet ovan skapar drivrutinen en primär kö och tre sekundära köer, en som motsvarar varje komponentuppsättning. Den här kökonfigurationen visas i följande diagram:
Diagram som visar implementering av kö för en flerkomponentsenhet med begärandetyperna A, B och C.
Drivrutinen hanterar en bitmask för varje komponentuppsättning. Varje bit i bitmasken representerar det aktiva/inaktiva tillståndet för en av komponenterna. Om biten har angetts är komponenten aktiv. Om biten rensas är komponenten inaktiv.
När en begäran anländer avgör en förfrågningshanterare för den översta könivån vilka komponenter som begäran behöver och anropar PoFxActivateComponent för var och en. Begärandehanteraren vidarebefordrar sedan begäran till den sekundära I/O-kön som motsvarar komponentens uppsättning.
När en komponent blir aktiv anropar kraftförvaltningsramverket (PoFx) drivrutinens `ComponentActiveConditionCallback`-rutin. I det här återanropet anger drivrutinen den bit som motsvarar den angivna komponenten i varje bitmask där komponenten representeras. Om alla bitar i en viss bitmask har angetts är alla komponenter i motsvarande uppsättning aktiva. För varje komponentgrupp som är helt aktiv anropar drivrutinen WdfIoQueueStart för att starta motsvarande sekundära I/O-kö.
Tänk till exempel på den hypotetiska enheten ovan. Anta att komponent 0 är aktiv medan komponenterna 1 och 2 är inaktiva. När komponent 2 blir aktiv, kallar PoFx på den komponentens ComponentActiveConditionCallback-rutin. Begärandetyperna A och C använder komponent 2, så drivrutinen ändrar bitmaskerna för dessa två typer av begäranden. Eftersom alla bitar i bitmasken för begärandetyp A nu har angetts startar drivrutinen kön för begärandetyp A. Alla bitar har dock inte angetts för begärandetyp C (komponent 1 är fortfarande inaktiv). Drivrutinen startar inte kön för begärandetyp C.
När en sekundär I/O-kö startas börjar ramverket leverera de begäranden som lagras i kön. I begärandehanteraren för den sekundära I/O-kön kan drivrutinen bearbeta begäranden på ett säkert sätt eftersom komponenten är aktiv och en strömmareferens har tagits på komponenten för varje begäran.
När drivrutinen har slutfört bearbetningen av en begäran anropar den PoFxIdleComponent för varje komponent som användes av begäran och slutför sedan begäran. När det inte finns fler begäranden som använder en komponent anropar kraftsystemet drivrutinens ComponentIdleConditionCallback rutin.
I det här återanropet rensar drivrutinen den bit som motsvarar den angivna komponenten i varje bitmask där komponenten representeras. Om en viss bitmask anger att komponenten är den första i motsvarande uppsättning att övergå till ett inaktivt tillstånd, anropar drivrutinen WdfIoQueueStop för att stoppa motsvarande sekundära I/O-kö. På så sätt ser drivrutinen till att kön inte skickar begäranden om inte alla komponenter i motsvarande uppsättning är aktiva.
Överväg igen exemplet ovan. Anta att alla komponenter är aktiva och därför startas alla köer. När komponent 1 blir inaktiv anropar PoFx rutinen för ComponentIdleConditionCallback för komponent 1. I det här återanropet ändrar drivrutinen bitmaskerna för begärandetyperna B och C eftersom de använder komponent 1. Eftersom komponent 1 är den första komponenten som blir inaktiv för båda dessa begärandetyper stoppar drivrutinen köerna för begärandetyperna B och C.
Anta att komponent 0 nu blir inaktiv. I ComponentIdleConditionCallback för komponent 0 manipulerar drivrutinen bitmaskerna för begärandetyperna A och C. Eftersom komponent 0 är den första komponenten som blir inaktiv för begärandetyp A (komponent 2 är fortfarande aktiv), stoppar drivrutinen kön för begärandetyp A. För begärandetyp C är dock komponent 0 inte den första komponenten som blir inaktiv. Drivrutinen stoppar inte kön för begärandetyp C (det gjorde den tidigare).
Om du vill använda den teknik som beskrivs i det här exemplet, måste drivrutinen också registrera en EvtIoCanceledOnQueue återanropsfunktion för var och en av dess sekundära köer. Om en begäran skulle avbrytas medan den befinner sig i den sekundära kön kan drivrutinen använda callback-funktionen för att anropa PoFxIdleComponent för varje motsvarande komponent. På så sätt frigörs den energireferens som begärandehanteraren tog när den anropade PoFxActivateComponent innan begäran vidarebefordrades till den sekundära kön.