Mówię o rzeczach na poziomie podstawowym.
O ile rozumiem, rdzeń kontrolera po prostu wykonuje instrukcje, które są pobierane z pamięci (Fetch - Decode - Execute). Kiedy nadejdzie Przerwanie, w jaki sposób rdzeń / ALU decyduje się przejść do ISR?
Ponieważ my lub kompilator nie dodajemy żadnych instrukcji w celu sprawdzenia statusu przerwania - to skąd wiadomo, że przerwanie musi zostać obsłużone?
źródło
CALL
instrukcja, ponieważ przerwania są przerywane w inny sposób (por.RET
W.RETI
).Zwykle we współczesnych mikrokontrolerach znajduje się dedykowana jednostka kontrolera przerwań (IC), która odpowiada za zarządzanie przerwaniami. Ponadto każdy element peryferyjny ma wyjście (-a) przerwań, które przechodzą od
0
do1
(lub odwrotnie), jeśli spełniony jest jakiś warunek (na przykład to urządzenie peryferyjne wykonało pewną pracę). To wyjście jest podłączone do kontrolera przerwań.Core
CPU może powiedzieć IC albo ignorować tego konkretnego przerwania (maskowania) lub powiadomić MCU ilekroć zdarza się przez wywołanie konkretnych sygnałów, a następnie MCU decyduje, co z nim zrobić. Częstym sposobem jest poinformowanie MCU o tym, które przerwanie miało miejsce i przejście do odpowiedniego kodu obsługi.źródło
W rdzeniu komputera znajduje się sprzęt, który blokuje nową wartość w liczniku programu, która odpowiada konkretnemu wywołanemu przerwaniu. Aby zapamiętać, do kogo wrócić po zakończeniu procedury przerwania, bieżąca wartość licznika programu jest wpychana na stos, zanim sprzęt zablokuje adres przerwania w liczniku programu. Po zakończeniu procedury przerwania oryginalna wartość licznika programu jest przywracana z powrotem ze stosu.
Wartości, które należy zablokować w liczniku programu w czasie przerwania, są zwykle określane przez jeden z dwóch schematów. Jedno podejście blokuje stały adres dla każdego typu przerwania w liczniku programu, a następnie rdzeń komputera zaczyna wykonywać od tej ustalonej lokalizacji. Przestrzeń w stałej lokalizacji jest często ograniczona, więc często koduje się instrukcję skoku pod ustalonymi adresami, które przechodzą do rzeczywistej lokalizacji usługi przerwań. Drugi schemat wykorzystuje coś, co nazywa się tabelą wektorów przerwań. Tutaj sprzęt generuje ustalone przesunięcie adresu do tablicy wektorów na podstawie typu przerwania. Sprzęt następnie pobiera zawartość w tej lokalizacji tabeli i używa tej wartości jako adresu do zablokowania w liczniku programu.
źródło
Sterownik ma rejestr licznika programu, który śledzi adres, pod którym przechowywana jest instrukcja, która ma zostać wykonana jako następna. (Ten rejestr jest również zapisywany po wykonaniu skoku.)
Kontroler ma wektor przerwań (lub czasami więcej niż jeden, w zależności od rodzaju przerwań), który jest adresem, na którym przechowywany jest ISR. Ten adres jest zawsze taki sam - przypomina wektor resetowania, w którym program się uruchamia.
(Często w tym wektorze jest przechowywana instrukcja skoku, która przeskakuje do właściwego kodu do wykonania, ponieważ przestrzeń w wektorze nie wystarcza do przechowywania całej procedury. Ważne jest jednak to, że ISR zawsze znajduje się w tym samym miejscu pozycja.)
Kiedy pojawia się przerwanie, w kontrolerze znajduje się dedykowany sprzęt, który zapisuje licznik programu za pomocą wektora przerwania. Następnie, gdy sterownik osiągnie następny cykl instrukcji, pobiera instrukcję z adresu wskazanego przez licznik programu (czyli wektor przerwań).
(W jednym cyklu instrukcji kontrolera są różne zadania, które wykonuje: pobiera następną instrukcję z adresu wskazanego przez licznik programu; zwiększa licznik programu; dekoduje instrukcję i wykonuje ją.)
źródło