Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Skorzystaj z poniższych ogólnych wskazówek dotyczących projektowania i pisania procedur SynchCritSection , które utrzymują stan:
Aby uzyskać dostęp do danych, do których uzyskuje również dostęp ISR, procedura sterownika musi wywołać procedurę SynchCritSection. Kod sekcji niekrytycznej może zostać przerwany. Należy pamiętać, że samo uzyskanie blokady spinlock nie wystarcza do ochrony danych, do których również uzyskują dostęp ISR, ponieważ ISR są uruchamiane na poziomie DIRQL, a uzyskanie blokady spinlock (KeAcquireSpinLock) jedynie podnosi poziom IRQL do DISPATCH_LEVEL, co pozwala na wywołanie ISR przez przerwanie na bieżącym procesorze.
Nadaj każdej procedurze SynchCritSection, która utrzymuje informacje o stanie, odpowiedzialną za określony zbiór zmiennych stanu. Oznacza to, że unikaj pisania procedur SynchCritSection , które utrzymują nakładające się informacje o stanie.
Zapobiega to konkurencji oraz ewentualnym warunkom wyścigu między procedurami SynchCritSection (i ISR), które próbują jednocześnie uzyskać dostęp do tego samego stanu.
Gwarantuje to również, że każda rutyna SynchCritSection zwraca kontrolę tak szybko, jak to możliwe, ponieważ jedna rutyna SynchCritSection nigdy nie musi czekać na inną, która aktualizuje niektóre z tych samych informacji o stanie, aby zwrócić kontrolę.
Unikaj pisania pojedynczej, dużej, ogólnego przeznaczenia procedury SynchCritSection, która wykonuje więcej testów warunków, aby określić, co należy zrobić, niż faktycznie wykona przydatną pracę. Z drugiej strony należy unikać wielu procedur SynchCritSection , które nigdy nie wykonują instrukcji warunkowej, ponieważ każda z nich aktualizuje tylko jeden bajt informacji o stanie.
Każda procedura SynchCritSection musi zwracać kontrolę tak szybko, jak to możliwe, ponieważ uruchomienie dowolnej procedury SynchCritSection uniemożliwia wykonywanie funkcji ISR sterownika.
Poniżej przedstawiono technikę obsługi licznika czasomierza w rozszerzeniu urządzenia. Zakładamy, że sterownik używa licznika, aby określić, czy upłynął limit czasu operacji we/wy. Przyjmujemy również, że sterownik nie wykonuje jednoczesnych operacji we/wy.
Procedura StartIo sterownika inicjuje licznik czasomierza do pewnej wartości początkowej dla każdego żądania we/wy. Następnie sterownik dodaje sekundę do wartości limitu czasu urządzenia, na wypadek, gdy jego procedura IoTimer właśnie zwróciła kontrolę.
IsR sterownika musi ustawić ten licznik czasomierza na minus jeden.
Procedura IoTimer kierowcy jest wywoływana raz na sekundę, aby odczytać licznik czasu i określić, czy ISR już ustawił go na minus jeden. Jeśli tak nie jest, procedura IoTimer dekrementuje licznik za pomocą KeSynchronizeExecution, aby wywołać procedurę SynchCritSection_1.
Jeśli licznik przekroczy zero, wskazując, że upłynął limit czasu żądania, SynchCritSection_1 rutynowe wywołuje procedurę SynchCritSection_2, aby programować operację resetowania urządzenia. Jeśli licznik jest minus jeden, rutyna IoTimer po prostu zwraca.
Jeśli procedura DpcForIsr sterownika musi przeprogramować urządzenie, aby rozpocząć operację częściowego transferu, musi ponownie zainicjować licznik czasomierza, tak jak zrobiła to procedura StartIo.
Procedury DpcForIsr również muszą używać KeSynchronizeExecution , aby wywołać procedurę SynchCritSection_2 lub ewentualnie procedurę SynchCritSection_3, aby zaprogramować urządzenie do innej operacji transferu.
W tym scenariuszu sterownik ma więcej niż jedną procedurę SynchCritSection , z których każdy ma odrębne, określone obowiązki; jeden, aby zachować licznik czasomierza i co najmniej jeden do zaprogramowania urządzenia. Każda rutyna SynchCritSection może szybko zwrócić kontrolę, ponieważ wykonuje pojedyncze, dyskretne zadanie.
Należy pamiętać, że sterownik ma jedną procedurę SynchCritSection_1, która wraz z ISR kierowcy utrzymuje stan licznika czasomierza. W związku z tym nie ma rywalizacji o dostęp do licznika czasomierza wśród kilku procedur SynchCritSection i ISR.