K U R S
Mikrokontrolery z rdzeniem ARM,
część 14
System przerwań
Bieżący stan układu ARM7TDMI, zapoznamy się z budową krokontrolerów ARM7TDMI S sprawa
kontrolera przerwań VIC (Vectorized jest prostsza, ponieważ wywołanie
peryferyjnego mikrokontrolera
Interrupt Controller) oraz sposobem przerwania programowego (instrukcja
można określić poprzez
obsługi przerwań zewnętrznych. Za- SWI) powoduje wygenerowanie wy-
odczytanie odpowiedniego
poznamy się także z mechanizmem jątku software interrupt i skok pod
rejestru SFR (tą metodą
generowania przerwań programowych niezmienny adres 0x00000008. Dodat-
posługiwaliśmy się w poprzednio z wykorzystaniem instrukcji SWI. kowo w momencie zgłoszenia wyjątku
zmieniany jest tryb ochrony z bieżą-
opisywanych przez nas
Przerwania programowe cego na supervisor. W związku z tym,
przykładach). Taka metoda jest
W systemach mikroprocesorowych podczas normalnego wykonania pro-
dobra tylko wtedy, gdy nie
idea przerwań programowych polega gramu mikroprocesor może pracować
zależy nam na szybkiej reakcji
na przerwaniu wykonania bieżącego w bezpiecznym trybie użytkownika,
na zdarzenie. W przypadku,
programu w momencie napotkania spe- a w momencie potrzeby wykonania
cjalnej instrukcji i skok pod odpowied- jakiejś funkcji systemowej procedura
gdy wymagana jest szybka
ni wektor przerwania, tak jakby było przerwania systemowego ma dostęp
odpowiedz, mikrokontroler
to przerwanie generowane sprzętowo. do wszystkich zasobów. Wywołanie
musiałby cały czas cyklicznie
Czytelnikom może się wydać bezcelo- instrukcji przerwania programowego
badać stan rejestru SFR w celu
we wprowadzanie specjalnej instrukcji jest jedynym możliwym sposobem
wykrycia zdarzenia i nie mógłby
przerywającej, ponieważ do złudzenia na przejście z trybu użytkownika do
przypomina ona zwykłe wywołanie trybu uprzywilejowanego. Na rys. 30
w tym czasie robić nic innego.
CALL, czyli skok do podprogramu. przedstawiono sposób interpretacji in-
Z tych właśnie względów
Działanie to polega na zapamiętaniu strukcji SWI przez rdzeń ARM7.
wszystkie mikrokontrolery są
na stosie lub w odpowiednim rejestrze Bity 31...28 jak zwykle za-
wyposażone w mechanizm
adresu bieżącej instrukcji, a następnie wierają kod warunkowy instrukcji,
przerwań.
kontynuację wykonywania programu bity 27...24 zawierają właściwy kod
od adresu będącego argumentem in- instrukcji SWI (1111b), natomiast po-
W momencie, gdy nastąpi ja- strukcji. Jest to zasadnicza wada tego zostałe bity (23& 0) mogą być wy-
kieś zdarzenie (np. odebranie znaku mechanizmu, ponieważ musimy znać korzystane przez procedurę obsługi
poprzez port szeregowy), wówczas dokładny adres skoku. Na przykład, wyjątku do określenia podprogramu,
zgłaszane jest przerwanie informu- chcąc wywołać jakąś funkcję systemu jaki ma zostać wykonany w zależno-
jące o tym mikrokontroler. W wyni- operacyjnego musielibyśmy dokładnie ści od tego, jaką liczbę zawierają bity
ku, tego przerywane jest wykonanie wiedzieć, że znajduje się ona pod (23...0). Na przykład wpisanie instruk-
bieżącego programu i następuje skok konkretnym adresem w pamięci. Wia- cji SWI #8 spowoduje umieszczenie
do podprogramu obsługi zdarzenia. domo, że z czasem oprogramowanie w bitach (23.0) rozkazu wartości 8.
Po zakończeniu mikrokontroler wraca takie jak system operacyjny ewoluuje, Aby program obsługi wyjątku mógł
do wykonania programu w miejscu, w efekcie czego nie da się zagwaran- określić numer przerwania, musi od-
w którym został on przerwany. W pro- tować, że konkretna procedura będzie czytać z pamięci programu instrukcję
stych mikrokontrolerach 8 bitowych znajdować się pod tym samym adre- SWI, a następnie wyciągnąć z niej ar-
na przykład 8051 działanie przerwań sem, gdyż prowadziłoby to do dużego gument znajdujący się w bitach 23...0.
było bardzo proste, mianowicie wystą- marnotrawstwa pamięci. Aby zapobiec W momencie wystąpienia wyjątku,
pienie jakiegoś zdarzenia powodowało bałaganowi w tej kwestii, w systemach do licznika rozkazów wpisywany jest
skok pod konkretny adres w pamięci. mikroprocesorowych wprowadzono in- wektor przerwania SWI (0x00000008)
System przerwań mikrokontrolerów strukcję przerwań programowych, któ- oraz do rejestru LR wpisywana jest
LPC213x/214x jest zdecydowanie bar- rej wywołanie z danym argumentem zawartość licznika rozkazów, tak więc
dziej skomplikowany z uwagi na to, gwarantuje przekazanie sterowania odejmując od licznika rozkazów licz-
że sam rdzeń mikrokontrolera posiada programu zawsze pod ten sam adres bę 4 otrzymamy adres instrukcji SWI.
tylko dwie linie wejść przerywających w pamięci. W efekcie tego, niezależnie W wyniku odczytania danych spod
(IRQ oraz FIQ), dlatego konieczne sta- od wersji systemu operacyjnego oraz tego adresu otrzymamy kod instruk-
ło się wprowadzenie kontrolera prze- zmian w mapie pamięci, będziemy cji SWI, a w wyniku zamaskowania 8
rwań, podobnie jak ma to miejsce mogli zagwarantować jednolity inter- najstarszych bitów otrzymamy numer
w komputerach klasy PC. fejs wywołań systemowych. W mi- przerwania SWI. Niektóre kompilatory
W bieżącym odcinku zapoznamy kroprocesorach x86 przerwanie pro- wspierają bezpośrednio obsługę me-
się z działaniem systemu przerwań gramowe jest generowane instrukcją
w mikrokontrolerach LPC213x. Przypo- INT, której wywołanie powoduje skok
mnimy podstawowe wiadomości doty- pod adres, znajdujący się w tablicy
czące obsługi przerwań poprzez rdzeń wektorów przerwań. W przypadku mi- Rys 30. Budowa instrukcji SWI
Elektronika Praktyczna 1/2007
107
K U R S
chanizmu przerwań programowych, List. 3.
#include lpc213x.h
natomiast w przypadku używanego
przez nas kompilatora GCC cała ob- //Definicja LEDOW
#define LEDS (0xFF<<16)
sługa spoczywa na programiście. Je-
#define LEDDIR IO1DIR
żeli chcemy przekazywać dodatkowe #define LEDSET IO1SET
#define LEDCLR IO1CLR
parametry do procedury obsługi dane-
go wątku, możemy to zrobić za po- //Deklaracja funkcji przerwania SWI
extern C void SwiIntHandler(void) __attribute__ ((interrupt( SWI )));
średnictwem wartości przekazywanych
//Funkcja przerwania SWI
void SwiIntHandler(void)
do dowolnych rejestrów, a następ-
{
nie w procedurze obsługi przerwania
//Rejestr R14 4 zawiera adres instrukcji SWI
register unsigned int* link_ptr asm ( r14 );
programowego możemy odczytać ich
//Rejestr R0 zawiera parametr przekazany do SWI
zawartość. Aby poznać sposób reali- register unsigned int param asm ( r0 );
param &= 0xff;
zacji przerwań programowych, napi-
param <<= 16;
szemy prosty program (plik ep6a.zip switch(*(link_ptr 1) & 0x00FFFFFF)
{
na CD EP1/2007B), który za pomocą
//Zalacz Ledy (SWI #1)
case 0x01:
przerwania SWI będzie włączał oraz
LEDSET = param;
wyłączał diody LED znajdujące się na
break;
//Wylacz Ledy (SWI #2)
płytce ZL6ARM. Do działania progra-
case 0x02:
mu musimy zmodyfikować zawartość
LEDCLR = param;
break;
pliku startowego boot.s Pierwsza mo-
}
dyfikacja polega na przydzieleniu kil- }
kudziesięciu bajtów na obszar stosu
//Funkcja wlaczajaca LEDY poprzez SWI
dla trybu supervisor: static inline void SwiLedOn(unsigned int LedSt)
{
.equ SVC_Stack_Size,
asm volatile
(
0x00000020
mov r0,%[ledon]\n
Kolejną zmianą, jakiej musimy do-
swi #1\n
::[ledon] r (LedSt): r0
konać, to ustawienie adresu funkcji
);
obsługi wyjątku przerwania programo- }
wego:
//Funkcja wylaczajaca LEDY poprzez SWI
SWI_Addr: .word static inline void SwiLedOff(unsigned int LedSt)
{
SwiIntHandler
asm volatile
Program przestawiono na list. 3. (
mov r0,%[ledon]\n
Procedura obsługi wyjątku ma
swi #2\n
::[ledon] r (LedSt): r0
taką samą nazwę jak ta, która jest
);
przypisana w pliku boot.s. Została ona
}
zadeklarowana jako extern C przez
co kompilator C++ nie zmienia na- /* Funkcja glowna main */
int main(void)
zwy tej funkcji oraz z modyfikato-
{
rem __attribute__ ((interrupt( SWI ))), //Ledy jako wyjscie
LEDDIR |= LEDS;
co informuje kompilator, że jest to
//Petla nieskonczona
while(1)
funkcja obsługi wyjątku przerwania
{
programowego. W przypadku, gdyby
//Wlacz D7,D4,D1,D0
SwiLedOn(0x93);
została ona zadeklarowana jako zwy-
//Czekaj
kła funkcja, mikroprocesor zwyczaj-
for(int i=0;i<2000000;i++);
//Wylacz D7,D4,D1,D0
nie by się zawiesił, ponieważ inna
SwiLedOff(0x93);
jest funkcja wyjścia kończąca obsługę
//Czekaj
for(int i=0;i<2000000;i++);
wyjątku SWI, o czym była mowa we
}
wcześniejszej części kursu. W proce- return 0;
}
durze obsługi wyjątku posłużono się
bardzo ciekawą właściwością kom-
pilatora, umożliwiającą przypisanie w którym przekazujemy maskę bito- Zapalanie i gaszenie diod LED za
zmiennej lokalnej do określonego re- wą diod, miało na celu pokazanie pośrednictwem przerwań programo-
jestru. W naszym przypadku zmien- sposobu przekazywania dodatkowych wych jest oczywiście lekką przesadą,
nej link_ptr przypisano rejestr LR parametrów do procedur przerwań ponieważ powinny być one wykorzy-
(R14), tak więc wykonując instrukcję programowych. Działanie funkcji stywane jako funkcję obsługi systemu
switch (*(link_ptr 1) & 0x00FFFFFF) SwiLedOn/SwiLedOff polega na prze- operacyjnego, ale przykład ten ma
możemy określić numer przerwania pisaniu do rejestru R0 maski bito- pokazać sposób, w jaki można z nich
programowego, jakie spowodowało wej diod oraz wywołania przerwa- korzystać we własnych aplikacjach.
wyjątek. W naszym przypadku prze- nia programowego SWI #1/SWI #2. Jako ciekawe zastosowanie nasuwa
rwanie SWI #1 włącza LED y, któ- Działanie programu głównego opie- mi się tutaj wykorzystanie przerwań
rych maska bitowa przekazana jest ra się na cyklicznym wywoływaniu SWI do konfiguracji systemu prze-
w rejestrze R0, natomiast przerwanie funkcji SwiLedOn/SwiLedOff, co po- rwań zewnętrznych mikrokontrolera
programowe SWI #2 wyłącza je. woduje błyskanie diod D7, D4, D1, LPC21xx. W pliku startowym boot.s
Użycie dodatkowego rejestru (R0), D0 na płytce uruchomieniowej. należy ustawić procesor w tryb użyt-
Elektronika Praktyczna 1/2007
108
K U R S
Tab. 19. Podłączenie poszczególnych kanałów
w uprzywilejowanym trybie podłączenie więcej niż jednego kana-
kontrolera VIC do układów peryferyjnych
ochrony. łu do linii FIQ. Wówczas jakiekol-
Nr Urządze-
wiek przerwanie na jednej z tych linii
Zgłaszane przerwania
kanału nie
Przerwania sprzętowe spowoduje zgłoszenie przerwania FIQ.
#0 WDT Przerwanie WATCHDOG
kontroler przerwań Określenie, który kanał zgłosił prze-
Zarezerwowane dla przerwań progra-
VIC rwanie jest możliwe poprzez zbadanie
#1 -
mowych
Jak wiemy z poprzednich zawartości rejestru VICFIQStatus
Rdzeń
#2 Embedded ICE (RX) odcinków kursu, rdzeń AR- (0xFFFFF004). Jeżeli dana linia prze-
ARM
M7TDMI S posiada tylko rwania została zakwalifikowana jako
Rdzeń
#3 Embedded ICE (TX)
dwa wejścia przerwań ze- FIQ i przerwanie od tej linii zostało
ARM
wnętrznych FIQ oraz IRQ. zgłoszone, wówczas ustawiany jest bit
Match (0& 3)
#4 TIMER0
Przerwanie FIQ jest przerwa- odpowiadający numerowi kanału prze-
Capture (0& 3)
niem szybkim o najwyższym rwania. Jak wiadomo określenie kana-
Match (0& 3)
#5 TIMER1
Capture (0& 3)
priorytecie i najkrótszym łu zgłaszającego przerwanie i podję-
Status linii (RLS)
czasie reakcji, powinno być cie stosownej reakcji zajmuje pewien
Rejestr nadajnika pusty (THRE)
one wykorzystywane do pi- czas, dlatego generalnie nie powinni-
#6 UART0
Odebrane dane są dostępne (RDA)
sania czasowo krytycznych śmy przypisywać do linii FIQ więcej
Przeterminowanie odebrania znaku (CTI)
procedur obsługi przerwań. niż jednego przerwania. Jeżeli oczywi-
Status linii (RLS)
Natomiast przerwanie IRQ ście chcemy, aby przerwanie to było
Rejestr nadajnika pusty (THRE)
powinniśmy wykorzystywać wykorzystywane zgodnie z przeznacze-
#7 UART1 Odebrane dane są dostępne (RDA)
Przeterminowanie odebrania znaku (CTI)
do obsługi przerwań, które niem, czyli jako przerwanie szybkie.
Przerwanie status modemu (MSI)
nie wymagają czasowo kry- Aby przerwanie FIQ zostało zgłoszone,
#8 PWM0 Match (0& 6)
tycznej reakcji. Przerwania musimy w rejestrze VICIntEnable
obsługi są jednopoziomo- (0xFFFFF010) ustawić bit odpo-
#9 I2C Zmiana stanu (SI)
we i w momencie wejścia wiadający numerowi kanału prze-
Przerwanie SPI (SPIF)
#10 SPI0
Mode Fault (MODF) do procedury obsługi nie rwania. Zapis 1 na odpowiednim
FIFO nadajnika w połowie puste może być zgłoszone kolejne bicie danego rejestru spowoduje, że
(TXRIS)
przerwanie tej samej katego- dane przerwanie będzie zgłaszane,
SPI1 FIFO odbiornika w połowie pełne
#11 rii. Przerwanie szybkie FIQ natomiast wpisanie 0 nie przynosi
(SSP) (RXRIS)
może natomiast przerwać żadnego efektu. Do kasowania ze-
Przeterminowanie odbioru (RTRIS)
działanie procedury obsługi zwolenia na przerwanie danego ka-
Nadpisany bufor odbiornika (RORRIS)
przerwania IRQ. Ponieważ nału służy rejestr VICIntEnClear
#12 PLL PLL Lock (PLOCK)
dwie linie obsługi przerwań (0xFFFFF014). Wpisanie do niego
Zwiększenie licznika (RTCCIF)
#13 RTC
Alarm (RTCALF) to zdecydowanie za mało jedynki na odpowiednim bicie spo-
#14 System Przerwanie zewnętrzne 0 (EINT0) mikrokontrolery LPC21xx zo- woduje wyłączenie danej linii prze-
#15 System Przerwanie zewnętrzne 1 (EINT1) stały wyposażone w wektory- rwania, natomiast wpisanie zera nie
#16 System Przerwanie zewnętrzne 2 (EINT2) zowany kontroler przerwań przynosi żadnego efektu. Ponadto
#17 System Przerwanie zewnętrzne 3 (EINT3) VIC. Sposób połączenia kon- musimy pamiętać, że aby przerwa-
trolera przerwań z rdzeniem nie FIQ zostało w ogóle zgłoszone,
#18 ADC0 Zakończona konwersja przetwornika
ARM7 przedstawiono na musi być ono odblokowane w jedno-
#19 I2C1 Zmiana stanu (SI)
rys. 31. stce centralnej. W momencie wystą-
#20 BOD Wykryto zanik napięcia zasilającego
W tab. 19 przedstawiono pienia przerwania FIQ, mikrokontroler
Zakończona konwersja przetwornika
#21 ADC1
ADC1
podłączenie poszczególnych skacze pod adres 0x0000001C, pod
kanałów kontrolera VIC do który musimy wpisać skok do odpo-
kownika, wówczas tylko wywołanie układów peryferyjnych. wiedniej procedury obsługi przerwa-
SWI z odpowiednim parametrem bę- nia FIQ. Przed zakończeniem obsługi
dzie umożliwiało zmianę ustawień Przerwania FIQ przerwania, którego epilog jest wypeł-
systemu przerwań, co w istotny spo- Kontroler przerwań umożliwia niany przez kompilator C/C++ mu-
sób może podnieść bezpieczeństwo skonfigurowanie każdej z 32 linii tak, simy pamiętać, aby wyzerować flagę
działania systemu. Wektoryzowany aby sygnał aktywny na danej linii zgłoszenia przerwania w zgłaszającym
kontroler przerwań (VIC) można skon- generował przerwanie szybkie FIQ. urządzeniu peryferyjnym. Gdy o tym
figurować tak, aby odwołanie do re- Można tego dokonać poprzez usta- zapomnimy, wówczas dane przerwa-
jestrów kontrolera było możliwe tylko wienie bitu odpowiadającego numero- nie będzie zgłaszane bez przerwy. Ge-
wi kanału w rejestrze VICIntSelect neralnie w mikrokontrolerach LPC21xx
(0xFFFFF00C). Ustawienie odpo- kasowanie flag przerwań odbywa się
wiedniego bitu spowoduje, że dane poprzez wpisanie jedynki w rejestrze
przerwanie będzie zgłaszane jako FIQ, przerwań wybranego urządzenia pery-
natomiast jego wyzerowanie spowo- feryjnego, a nie jak w innych mikro-
duje, że wybrane przerwanie będzie kontrolerach gdzie wpisanie 0 kaso-
zgłaszane jako IRQ. Na przykład, je- wało wybraną flagę zgłoszenia prze-
żeli chcemy, aby przerwanie od portu rwania.
UART0 (kanał #6) było zgłaszane jako Lucjan Bryndza, EP
Rys. 31. Dołączenie kontrolera prze- FIQ, musimy ustawić bit 6 w rejestrze lucjan.bryndza@ep.com.pl
rwań do rdzenia ARM7 VICIntSelect. Kontroler VIC umożliwia
Elektronika Praktyczna 1/2007
109
Wyszukiwarka
Podobne podstrony:
Mikrokontrolery ARM cz1Mikrokontrolery ARM cz10Mikrokontrolery ARM cz8Mikrokontrolery ARM cz12Mikrokontrolery ARM cz15Mikrokontrolery 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