K U R S
Mikrokontrolery z rdzeniem ARM,
część 15
System przerwań c.d.
Bieżący stan układu
peryferyjnego mikrokontrolera
można określić poprzez
odczytanie odpowiedniego
rejestru SFR (tą metodą
posługiwaliśmy się w poprzednio
opisywanych przez nas
przykładach). Taka metoda jest
dobra tylko wtedy, gdy nie
zależy nam na szybkiej reakcji
na zdarzenie. W przypadku,
gdy wymagana jest szybka
odpowiedz, mikrokontroler
musiałby cały czas cyklicznie
badać stan rejestru SFR w celu Rys. 32. Zasada działania przerwań wektorowych
wykrycia zdarzenia i nie mógłby
trolny VICVectCntl0...VICVectCntl15 wpisuje adres procedury obsługi ak-
w tym czasie robić nic innego.
umożliwiający przypisanie wybrane- tywnego przerwania o najwyższym
Z tych właśnie względów
go kanału do slotu. Slot 0 posiada priorytecie, co fizycznie odbywa się
najwyższy priorytet, natomiast slot poprzez skopiowanie odpowiednie-
wszystkie mikrokontrolery są
o numerze 15 charakteryzuje się go rejestru VICVectAdr0...VICVec-
wyposażone w mechanizm
najniższym priorytetem. W tab. 20 tAdr15, natomiast rdzeń ARM7TD-
przerwań.
przedstawiono znaczenie poszczegól- MI S wykonuje skok pod adres
nych bitów dowolnego rejestru kon- wektora wyjątku IRQ (0x00000018),
Wektoryzowane przerwania trolnego slotu VICVectCntrl0& 15. gdzie znajduje się instrukcja: LDR
IRQ Jak więc widzimy, do wybranego PC,[PC,# 0xFF0]. Jej wykonanie po-
Wcześniej pisaliśmy, że do li- slotu możemy przypisać dowolny woduje odczytanie i skok pod adres
nii FIQ generalnie powinno być kanał (0& 31). W dobrym zwyczaju wektora procedury obsługi przerwa-
podłączone tylko jedno przerwanie, jest, aby nie przypisywać tego sa- nia umieszczonego w rejestrze VI-
stąd nasuwa się prosty wniosek, że mego kanału więcej niż do jedne- CVectAddr. Instrukcja ta wykonuje
pozostałe kanały muszą być podłą- go slotu. Jeżeli jednak taka sytuacja się w jednym cyklu maszynowym.
czone do linii IRQ. Jak wiadomo będzie miała miejsce, wybrany zo- Zasadę działania przerwań wektoro-
programowe określenie zródła prze- stanie slot o najniższym numerze. wych zilustrowano na rys. 32.
rwania zajmuje pewien czas. Dlate- Do rejestru VICVectAdr0& 15 musi- W efekcie tych czynności każ-
go w kontrolerze VIC wprowadzo- my wpisać adres procedury obsługi da linia (kanał) obsługi przerwania
no efektywny mechanizm przerwań przerwania, która zostanie wywoła- posiada swoją własną procedurę
wektorowych. Działanie jego polega na w momencie wystąpienia prze- obsługi, wywoływaną w momencie
na tym, że w momencie wystąpie- rwania z danego kanału. Obsługa wystąpienia przerwania, przez co
nia przerwania nie musimy spraw- wektoryzowanego przerwania IRQ odpada konieczność programowego
dzać znaczników przerwań w sposób odbywa się następująco: Kontro- sprawdzania zródła przerwania. Tak
programowy, ponieważ każde prze- ler VIC określa numer kanału, od samo jak w przypadku przerwania
rwanie ma swoją własną procedu- którego pochodzi przerwanie i do FIQ, aby przerwanie było zgłoszo-
rę obsługi, wywoływaną w momen- rejestru VICVectAddr (0xFFFFF030), ne, oprócz przypisania i włączenia
cie jego zgłoszenia. Kontroler VIC
Tab. 20. Znaczenie bitów dowolnego rejestru kontrolnego slotu VICVectCntr-
posiada 16 slotów (wektorów), do
l0& 15
których może być przypisany do-
Bit Nazwa Opis Wartość pocz.
wolny kanał przerwania. Każdy slot
[4:0] INT_REQ Numer kanału, który będzie przypisany do tego slotu IRQ 0
(0...15) posiada własny rejestr, do
0 wybrany slot IRQ jest nieaktywny
którego wpisywany jest adres proce-
[5] IRQ_EN 0
1 wybrany slot IRQ jest aktywny
dury obsługi przerwania VICVectA-
[31:6] Zarezerwowane
dr0...VICVectAdr15 oraz rejestr kon-
Elektronika Praktyczna 1/2007
106
K U R S
określonego slotu musi być ono
List. 4. Przykładowe procedury umożliwiające włączanie oraz wyłączanie
odblokowane w rejestrze VICIntEna-
przerwań FIQ oraz IRQ
ble. Zakończenie obsługi przerwania
#include "armint.h"
powinno się odbyć poprzez wyze-
#define IRQ_MASK 0x00000080
rowanie flagi zgłoszenia przerwania #define FIQ_MASK 0x00000040
#define INT_MASK (IRQ_MASK|FIQ_MASK)
w wybranym urządzeniu peryferyj-
nym, a ponadto wpisaniu do reje- //Odczytuje słowo stanu procesora
static inline cpu_t get_cpsr(void)
stru VICVectAddr dowolnej warto-
{
cpu_t val;
ści, co jest sygnałem dla kontrolera
asm volatile ("mrs %[val], cpsr\n":[val]"=r"(val):);
przerwań VIC, że procedura obsługi
return val;
}
przerwania dobiegła końca.
//Zapisuje słowo stanu procesora
static inline void set_cpsr(cpu_t val)
Przerwania niewektoryzowane
{
W przypadku, gdy istnieje koniecz- asm volatile ("msr cpsr, %[val]\n" ::[val]"r"(val) );
}
ność użycia większej liczby przerwań
//Wyłącza przerwania IRQ
(IRQ=16+FIQ=1 > 17) pozostałe
cpu_t disable_irq(void)
przerwania mogą być zgłoszone jako
{
cpu_t cpsr;
przerwania niewektoryzowane. Są one
cpsr = get_cpsr();
obsługiwane przez jedną wspólną pro-
set_cpsr(cpsr | IRQ_MASK);
return cpsr;
cedurę obsługi przerwań, której adres
}
powinien być umieszczony w reje-
//Włącza przerwania IRQ
strze VICDefVectAddr (0xFFFFF034) .
cpu_t enable_irq(void)
W momencie, gdy zostanie odbloko- {
cpu_t cpsr;
wany kanał przerwania i nie jest on
cpsr = get_cpsr();
przypisany do żadnego slotu, wów- set_cpsr(cpsr & ~IRQ_MASK);
return cpsr;
czas do rejestru VICVectAddr zostanie
}
załadowana zawartość rejestru VICDe-
//Odtwarza stan przerwania IRQ
fVectAddr, w wyniku czego procesor
cpu_t restore_irq(cpu_t old_cpsr)
{
skoczy do procedury obsługi przerwa-
cpu_t cpsr;
nia niewektoryzowanego. Procedura na cpsr = get_cpsr();
set_cpsr( (cpsr & ~IRQ_MASK) | (old_cpsr & IRQ_MASK) );
początku musi sprawdzić zawartość
return cpsr;
rejestru VICIRQStatus (0xFFFFF000), }
w celu określenia, który kanał zgłosił
//Wyłącza przerwania FIQ
cpu_t disable_fiq(void)
przerwanie. Jeżeli bit o danym nume-
{
rze jest ustawiony, oznacza to, że zró-
cpu_t cpsr;
cpsr = get_cpsr();
dłem przerwania był kanał o tym nu-
set_cpsr(cpsr | FIQ_MASK);
merze. Przerwanie niewektoryzowane
return cpsr;
}
są najwolniejszym rodzajem przerwań,
ponieważ procedura ich obsługi musi //Włącza przerwania FIQ
cpu_t enable_fiq(void)
określić na podstawie zawartości re-
{
cpu_t cpsr;
jestru statusu, zródło przerwania. Jest
cpsr = get_cpsr();
to jednak jedyny sposób na obsługę
set_cpsr(cpsr & ~FIQ_MASK);
return cpsr;
większej liczby przerwań. W praktyce
}
bardzo rzadko będziemy potrzebowali
//Odtwarza stan przerwania FIQ
więcej niż 17 przerwań, dlatego ten
cpu_t restore_fiq(cpu_t old_cpsr)
sposób obsługi nie będzie zbyt czę- {
cpu_t cpsr;
sto wykorzystywany. Zakończenie ob-
cpsr = get_cpsr();
sługi przerwania niewektoryzowanego set_cpsr( (cpsr & ~FIQ_MASK) | (old_cpsr & FIQ_MASK) );
return cpsr;
odbywa się w taki sam sposób jak
}
przerwania wektoryzowanego, czyli
oprócz wyzerowania flagi zgłaszającej
przerwanie w urządzeniu peryferyjnym strów kontrolera przerwań VIC dobrą czają przerwania IRQ oraz FIQ. Ich
musimy zapisać jakąś wartość do re- praktyką jest chwilowe zablokowanie działanie polega na odczytaniu słowa
jestru VICVectAddr. przerwań, dlatego napiszemy bardzo stanu procesora (CPSR), ustawieniu
proste procedury umożliwiające włą- odpowiednio bitu I lub F oraz ponow-
Blokowanie oraz czanie oraz wyłączanie przerwań FIQ nym zapisaniu rejestru CPSR. Funkcje
odblokowywanie przerwań oraz IRQ, które przedstawiono na enable_irq oraz enable_fiq dokonują
w jednostce centralnej list. 4. natomiast poprzez wyzerowanie bitu
Przerwania IRQ oraz FIQ są zgła- Funkcje get_cpsr oraz set_cpsr za- I lub F odblokowania zgłaszania
szane tylko wtedy, jeżeli flagi I oraz deklarowane jako inline, zawierają przerwań IRQ lub FIQ. Wszystkie te
F w słowie stanu procesora (CPSR) są bardzo krótką wstawkę asemblerową, funkcje zwracają stan rejestru CPSR
wyzerowane, natomiast w przeciwnym która zapisuje lub odczytuje zawartość przed modyfikacją, umożliwiając jego
przypadku przerwania są zablokowa- rejestru słowa stanu procesora CPSR. ponowne otworzenie za pomocą funk-
ne. Podczas zmiany zawartości reje- Funkcje disable_irq,disable_fiq wyłą- cji restore_irq oraz restore_fiq, których
Elektronika Praktyczna 1/2007
107
K U R S
są cztery rejestry, przy czym każdy
bit w każdym z tych rejestrów od-
powiada za odpowiednie przerwanie
(bit 0 odpowiada za przerwanie
EINT1, bit 1 odpowiada za prze-
rwanie EINT2 itd.)
EXTMODE (0xE01FC148) umoż-
liwia określenie sposobu zgłaszania
przerwania. Jeżeli bit odpowiedzialny
za wybrane przerwanie przyjmie war-
tość 0, wówczas jest ono zgłaszane
poziomem, natomiast gdy przyjmie
wartość 1, przerwanie aktywowane
Rys. 33. Budowa systemu przerwań zewnętrznych w mikrokontrolerze LPC213x jest zboczem.
E XT P O L A R ( 0 x 0 E 0 1 F C 1 4 C )
działanie polega na odczytaniu reje- wacji wybranej linii dokonujemy po- umożliwia określenie polaryzacji
stru CPSR, zamaskowaniu flagi prze- przez włączenie odpowiedniej funkcji zbocza lub poziomu aktywującego
rwania oraz ponownym jej ustawie- alternatywnej portu, modyfikując reje- przerwanie. Skasowanie wybranego
niu zgodnie ze stanem zapamiętanym stry PINSEL0 oraz PINSEL1, co było bitu spowoduje, że przerwanie bę-
poprzednio. Nazwa zmiennej cpu_t omówione w poprzedniej części kur- dzie aktywowane zboczem opadają-
jest po prostu synonimem zmiennej su. Przerwania zewnętrzne mogą być cym lub stanem niskim, natomiast
unsigned int, która jest równa długo- zgłaszane zboczem narastającym lub jego ustawienie spowoduje, że prze-
ści słowa stanu maszyny. Należy tutaj opadającym oraz poziomem niskim rwanie będzie aktywowane zboczem
podkreślić, że funkcje operujące na lub wysokim. W przypadku, gdy dane narastającym lub stanem wysokim.
flagach przerwań działają tylko w try- przerwanie jest wybrane jako funkcja INTWAKE (0x0E01FC144)
bach uprzywilejowanych. Aby skorzy- alternatywna przez więcej niż jedną umożliwia aktywowanie budzenia
stać z zestawu tych funkcji procesor linię portu oraz jest ono skonfiguro- mikrokontrolera przerwaniem ze-
wykonując program powinien praco- wane jako zgłaszane poziomem, wów- wnętrznym ze stanu uśpienia.
wać w trybie System. Jeśli chcemy, czas wykonywana jest operacja sumy EXTINT (0x0E01FC140) za-
aby procesor działał w bezpieczniej- logicznej, w efekcie, czego odpowiedni wiera flagi zgłoszeń przerwań ze-
szym trybie User, zestaw funkcji ob- poziom na dowolnym z wejść przery- wnętrznych.
sługujący blokowanie i odblokowywa- wających powoduje zgłoszenie danego Ustawienie danego bitu ozna-
nie przerwań powinien być napisany przerwania. Nie jest natomiast do- cza, że odpowiadające mu przerwa-
z wykorzystaniem interfejsu przerwań puszczalne ustawienie więcej niż jed- nie zostało aktywowane. Flagę tę
programowych (SWI). nego wejścia przerywającego, gdy wy- musimy skasować przed wyjściem
brana linia jest skonfigurowana jako z procedury obsługi przerwania po-
Przerwania zewnętrzne wyzwalana zboczem. Istnieje również przez zapis 1 na odpowiadającym
EINT0...EINT3 możliwość ustawienia mikrokontrolera bicie. W przypadku, gdy przerwanie
Mikrokontrolery LPC213x/214x po- tak, aby stan aktywny na odpowied- było ustawione jako wyzwalane po-
siadają 4 zewnętrzne wejścia przery- nim wejściu przerywającym powodo- ziomem a pin wejściowy znajduje
wające EINT0...EINT3, przy czym są wał wyjście mikrokontrolera ze stanu się w stanie aktywnym, wówczas
one wprowadzone jako funkcje alter- uśpienia. skasowanie bitu zgłoszenia odpo-
natywne kilku portów. Na przykład Budowę systemu przerwań ze- wiadającego przerwania nie będzie
przerwanie zewnętrzne EINT3 dla mi- wnętrznych przedstawiono na rys. 33. możliwe.
krokontrolera LPC2138 jest dostępne Za konfigurację systemu prze- Lucjan Bryndza, EP
na linii P0.9, P0.20 oraz P0.30. Akty- rwań zewnętrznych odpowiedzialne lucjan.bryndza@ep.com.pl
Elektronika Praktyczna 1/2007
108
Wyszukiwarka
Podobne podstrony:
Mikrokontrolery ARM cz1Mikrokontrolery ARM cz10Mikrokontrolery ARM cz14Mikrokontrolery ARM cz8Mikrokontrolery ARM cz12Mikrokontrolery ARM cz21Mikrokontrolery ARM cz19Mikrokontrolery ARM cz3Mikrokontrolery ARM cz6Mikrokontrolery ARM cz22Mikrokontrolery ARM cz18Mikrokontrolery ARM cz18Mikrokontrolery ARM cz11Mikrokontrolery ARM cz13Mikrokontrolery ARM cz17Mikrokontrolery ARM cz5Mikrokontrolery ARM cz20Mikrokontrolery ARM cz7Mikrokontrolery ARM cz9więcej podobnych podstron