Udostępnij przez


Tworzenie obiektu przerwania

Sterownik Windows Driver Frameworks (WDF), który obsługuje przerwania sprzętowe urządzenia, musi utworzyć obiekt przerwania struktury ramowej dla każdego przerwania, jakie dane urządzenie może obsługiwać. W wersjach frameworka 1.11 i nowszych, działających na systemie operacyjnym Windows 8 lub nowszym, sterowniki Kernel-Mode Driver Framework (KMDF) i User-Mode Driver Framework (UMDF) mogą tworzyć obiekty przerwań wymagające obsługi na poziomie pasywnym. Jeśli nie piszesz sterownika dla platformy System on a Chip (SoC), twój sterownik powinien używać obiektów przerwań DIRQL.

Sterownik zwykle tworzy obiekty przerwań struktury frameworka w funkcji callback EvtDriverDeviceAdd. Sterownik może również tworzyć obiekty przerwania w ramach funkcji wywołania zwrotnego EvtDevicePrepareHardware.

Platforma wywołuje funkcję EvtDriverDeviceAdd wywołania zwrotnego sterownika, zanim menedżer Plug and Play (PnP) przydzieli zasoby systemowe, takie jak wektory przerwań, do urządzenia. Po przypisaniu zasobów przez menedżera PnP struktura przechowuje zasoby przerwania w obiekcie przerwania urządzenia. (Sterowniki, które nie obsługują technologii Plug and Play , nie mogą używać obiektów przerwań).

Aby utworzyć obiekt przerwania ramki, sterownik musi zainicjalizować strukturę WDF_INTERRUPT_CONFIG i przekazać ją do metody WdfInterruptCreate.

Funkcja UMDF obsługuje następujące typy przerwań:

  • Wyzwalane na poziomie (udostępnione lub wyłączne)
  • Wyzwalane przez krawędź (tylko wyłączność)
  • MSI (ekskluzywne z definicji)

Uwaga Funkcja UMDF nie obsługuje współdzielonych przerwań wyzwalanych przez krawędź.

Począwszy od UMDF w wersji 2.15, UMDF obsługuje przerwania dla prostych urządzeń, takich jak przyciski sprzętowe, zwykle oparte na pinach GPIO, których nie można jawnie włączać ani wyłączać za pomocą rejestrów sprzętowych. Aby obsługiwać takie urządzenia, sterownik UMDF musi używać wyłącznych przerwań wyzwalanych zboczem.

Począwszy od wersji 1.15, KMDF obsługuje także przerwania dla takich urządzeń, bez konieczności stosowania obejścia opisanego w artykule Obsługa przerwań Active-Both.

Ponadto w WDF_INTERRUPT_CONFIGsterownik dostarcza wskaźniki do następujących funkcji wywołania zwrotnego zdarzeń dostarczonych przez sterownik:

EvtInterruptEnable
Umożliwia przerwanie sprzętowe.

EvtInterruptDisable
Wyłącza przerwanie sprzętowe.

EvtInterruptIsr
Rutyna obsługi przerwania (ISR) dla przerwania.

EvtInterruptDpc
Wywołanie procedury odroczonej (DPC) dla przerwania.

EvtInterruptWorkItem
Element roboczy dla przerwania na poziomie pasywnym.

W przypadku sterowników używających frameworku w wersji 1.11 lub nowszej w systemie operacyjnym Windows 8 lub nowszym sterownik może jawnie ustawić element nadrzędny obiektu przerwania frameworku (DIRQL lub pasywny) na obiekt urządzenia frameworku lub obiekt kolejki frameworku. Jeśli sterownik określa element nadrzędny, sterownik musi ustawić AutomatyczneSerializacja elementu członkowskiego WDF_INTERRUPT_CONFIG obiektu przerwania na wartość TRUE. (Pamiętaj, że jeśli AutomaticSerialization ma wartość TRUE, framework synchronizuje wykonywanie funkcji wywołania zwrotnego obiektu przerwania EvtInterruptDpc lub EvtInterruptWorkItem z funkcjami wywołania zwrotnego innych obiektów znajdujących się pod obiektem nadrzędnym przerwania.)

Na przykład sterownik może określić kolejkę jako rodzica przerwania w celu zsynchronizowania wywołań zwrotnych kolejki z wywołaniami EvtInterruptDpc lub EvtInterruptWorkItem. W tej konfiguracji struktura usuwa obiekt kolejki po usunięciu obiektu urządzenia.

Po wywołaniu WdfInterruptCreatesterownik może opcjonalnie wywołać WdfInterruptSetPolicy lub WdfInterruptSetExtendedPolicy w celu określenia dodatkowych parametrów przerwania. Zazwyczaj sterownik wywołuje te metody z funkcji wywołania zwrotnego EvtDriverDeviceAdd.

Struktura automatycznie usuwa przerwanie przed usunięciem jego elementu nadrzędnego. Opcjonalnie sterownik może wywołać WdfObjectDelete, aby usunąć przerwanie wcześniej.

Obsługa przerwań sygnalizowanych komunikatami

System Windows Vista i nowsze wersje obsługują przerwania sygnalizowane komunikatami (MSI). Aby umożliwić systemowi operacyjnemu obsługę msI dla urządzenia, plik INF sterownika musi ustawić niektóre wartości w rejestrze. Aby uzyskać informacje na temat ustawiania tych wartości, zobacz Włączanie przerwań Message-Signaled w rejestrze.

Sterownik powinien utworzyć obiekt przerwania struktury dla każdego wektora przerwania lub komunikatu MSI obsługiwanego przez urządzenie. Jeśli menedżer PnP nie przydzieli urządzeniu wszystkich zasobów przerwań, które obsługuje, sterownik nie używa dodatkowych obiektów przerwań ani nie wywołuje ich funkcji zwrotnych.

W systemie Windows 7 system operacyjny nie obsługuje żądań zasobów dotyczących ponad 910 komunikatów przerwań przypadających na funkcję urządzenia. W Windows 8 system operacyjny nie obsługuje żądań zasobów dla więcej niż 2048 przerwań na funkcję urządzenia.

Jeśli sterownik urządzenia przekroczy ten limit, uruchomienie urządzenia może zakończyć się niepowodzeniem. Aby działać na komputerze zawierającym wiele procesorów logicznych, sterownik nie powinien żądać więcej niż jednego przerwania na procesor.

Sterownik musi tolerować, bez awarii, ponowne równoważenie systemu zasobów przerwań, gdzie menedżer PnP przypisuje do urządzenia dowolny zestaw alternatywnych zasobów przerwań z listy wymagań zasobów. Na przykład urządzeniu może zostać przypisana mniejsza liczba przerwań komunikatów niż liczba, o którą prosił sterownik. W najgorszym przypadku sterownik musi być przygotowany do obsługi urządzenia przy użyciu tylko jednego przerwania opartego na linii.