Skąd kontroler wie, kiedy przejść do ISR?


12

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?

Odpowiedzi:


13

Brakuje tylko tego, że rdzeń robi więcej niż tylko wykonywanie kodów pobranych z pamięci. Ma specyficzną logikę do implementacji przerwań.

Kiedy sprzęt wykrywający przerwanie potwierdza sygnał, że nadszedł czas na przerwanie, zwykle w rdzeniu zostaje zablokowana specjalna instrukcja, która nigdy nie została pobrana z pamięci. W większości przypadków jest to instrukcja CALL do adresu wektora przerwania. Wykorzystuje to istniejący mechanizm wykonywania instrukcji, aby zapisać bieżący komputer na stosie wywołań i zmienić go na adres wektora przerwania. Zajmuje się także odrzucaniem wcześniej pobranych instrukcji i tym podobnych.

Specjalna logika przejmująca przerwania musi również wyłączać przerwania w taki sposób, aby ten sam warunek przerwania nie spowodował kolejnego wywołania adresu wektora przerwania w następnym cyklu. Różne procesory mają różne sposoby radzenia sobie z tym. Najprościej jest po prostu wyłączyć glosowanie przerwań, wymagając od oprogramowania ponownego włączenia ich na końcu procedury obsługi przerwań. Inne procesory mają priorytet priorytetu przerwania. Ten poziom jest podbijany, więc tylko warunki przerwania o wyższym priorytecie mogą spowodować nowe przerwanie. Priorytet przerwania jest wówczas czymś, co jest automatycznie zapisywane wraz z adresem zwrotnym CALL i przywracane, gdy kod powróci z przerwania.


1
Często nie jest to zwykła CALLinstrukcja, ponieważ przerwania są przerywane w inny sposób (por. RETW. RETI).
glglgl,

1
Czy mogę bezpiecznie założyć, że kiedy sprzęt wykrywający przerwanie potwierdzi sygnał, zamiast pamięci procesor dostaje instrukcje z innego miejsca, aby skoczyć ... Może jak przełącznik ... Gdy przełącznik jest wyłączony, pobierz instrukcję z pamięci i gdy przełącznik jest włączony , Wykonać tę instrukcję?
Swanand

3

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 0do 1(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ń. CoreCPU 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.


2

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.


2

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ą.)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.