Przerwanie to mechanizm pozwalający mikroprocesorowi tymczasowo przerwać wykonywanie bieżącego programu w reakcji na zewnętrzne lub wewnętrzne sygnały. Przerwanie informuje procesor o zdarzeniu, które wymaga natychmiastowego obsłużenia i spowoduje przejście do specjalnego kodu obsługi.
Podstawowe pojęcia
- Sygnał przerwania — informacja wysyłana do procesora (np. elektronika urządzenia) o potrzebie obsługi; na poziomie sprzętowym to zwykle impuls lub komunikat (zobacz sygnał).
- Kod obsługi przerwania (ISR) — procedura wykonywana po przyjęciu przerwania, której zadaniem jest zdiagnozowanie i usunięcie przyczyny oraz przywrócenie stanu programu.
- Wejście/wyjście przerwań — przerwania mogą pochodzić od urządzeń zewnętrznych (sprzętu) lub być generowane przez system i aplikacje (oprogramowanie).
Rodzaje przerwań
- Sprzętowe — inicjowane przez urządzenia zewnętrzne, np. sygnał z kontrolera klawiatury lub karty sieciowej.
- Programowe (software) — generowane przez instrukcje w kodzie (np. wywołanie systemowe) lub przez system operacyjny.
- Synchroniczne — związane z aktualną instrukcją (np. wyjątki dzielenia przez zero).
- Asynchroniczne — niezsynchronizowane z wykonywanym kodem, pojawiają się w dowolnym momencie (np. przerwania sprzętowe).
Typowe przyczyny i przykłady
Przerwania pojawiają się w różnych sytuacjach. Do najczęstszych należą:
- Wejście z urządzeń użytkownika, np. naciśnięcie klawisza na klawiaturze.
- Upłynięcie czasu z wbudowanego zegara lub timera (timer), wykorzystywane np. do wywołań okresowych.
- Transfer danych realizowany przez kontroler DMA (koniec transferu lub błąd).
- Inne zewnętrzne zdarzenia wymagające natychmiastowego działania procesora.
- Sytuacje w programie wskazujące na błąd lub specyficzny stan — przerwanie może nastąpić niezależnie od miejsca w kodzie źródłowym programu.
Jak działa obsługa przerwania
- Procesor odbiera sygnał przerwania i sprawdza, czy przerwania są aktualnie dopuszczone.
- Jeśli przerwania są obsługiwane, procesor zapisuje kontekst (rejestry, licznik programu), aby móc wznowić pracę.
- Wykonywany jest kod obsługi przerwania (ISR), który rozwiązuje przyczynę lub przekazuje zadanie systemowi.
- Po zakończeniu ISR przywracany jest zapisany kontekst i następuje powrót do przerwanego programu.
Mechanizmy organizacyjne
- Priorytety — przerwaniom można przypisywać różne ważności, aby ważniejsze zdarzenia mogły przerwać obsługę mniej istotnych.
- Maska przerwań — możliwość blokowania (wyłączania) wybranych przerwań na czas krytycznych sekcji kodu.
- Wejście do tablicy wektorów — wiele systemów korzysta z tablic adresów ISR, tzw. wektorów przerwań, by wskazać właściwy handler.
Zalety i ograniczenia
- Zalety:
- Efektywne reagowanie na zdarzenia w czasie rzeczywistym.
- Oszczędność zasobów — brak konieczności ciągłego sprawdzania stanu urządzeń (polling).
- Ograniczenia:
- Opóźnienie (latency) — czas od wystąpienia zdarzenia do rozpoczęcia jego obsługi może być krytyczny w systemach czasu rzeczywistego.
- Złożoność programowania — kontekstowe zapisy/odczyty i współbieżność mogą prowadzić do błędów, np. wyścigów.
- Możliwość zjawiska priorytetowego blokowania (priority inversion).
Przerwania vs. polling
- Polling polega na cyklicznym sprawdzaniu stanu urządzeń przez program — proste, ale nieefektywne przy rzadkich zdarzeniach.
- Przerwania są bardziej responsywne i oszczędne zasobowo, ale wymagają dodatkowej warstwy obsługi i synchronizacji.
Praktyczne zastosowania
- Sterowanie wejściami użytkownika (np. klawiatura), gdzie istnieje potrzeba natychmiastowej reakcji.
- Zegar systemowy i okresowe zadania realizowane przez timery.
- Obsługa transferów danych (np. DMA) oraz sygnalizacja zakończenia operacji przez urządzenia.
- Reagowanie na zewnętrzne zdarzenia krytyczne dla aplikacji lub systemu.
Mechanizm przerwań jest fundamentem współczesnych systemów operacyjnych i układów embedded — umożliwia efektywną obsługę wielu niezależnych źródeł zdarzeń bez ciągłego zajmowania procesora i bez konieczności, aby cały program był świadomy szczegółów działania sprzętu.
