Documente Academic
Documente Profesional
Documente Cultură
Laboratorul nr. 3
- Întreruperile – MCBSTR7x -
I Scopul laboratorului
Scopul acestui laborator este acela de:
a familiariza cititorul cu întreruperile nucleului ARM7TDMI;
a prezenta extensia întreruperilor utilizând EIC (Enhanced Interrupt Controller)
de la familia STR710x;
a prezenta întreruperile externe XTI;
a programa şi utiliza XTI şi EIC în contextul unor aplicaţii date.
II Întreruperi
ARM7 CPU oferă 2 tipuri de întreruperi, FIQ (cererea de întrerupere rapidă)
pentru lucrul rapid, cu întrerupere de latenţă mică şi IRQ (cererea de întrerupere)
pentru mai multe întreruperi generale.
Sistemul de management al întreruperilor pentru STR71x oferă două blocuri
de management al întreruperilor: EIC şi XTI. Urmăriţi Figura II-1:
Figura II-1. Vedere asupra managementului de întreruperi. Cele două controlere pentru
generarea de întreruperi EIC şi XTI.
-1-
MICROCONTROLERE
-2-
MICROCONTROLERE
-3-
MICROCONTROLERE
-4-
MICROCONTROLERE
-5-
MICROCONTROLERE
II.3.3 Stiva
Stiva poate conţine până la 15 evenimente, corespunzând numărului maxim
de întreruperi înlănţuite. Este utilizată pentru a salva şi restaura starea anterioară a
EIC. Datele salvate pe stivă stivă sunt EIC_CICR (Registrul Canalului Curent de
Întreruperi) şi EIC_CIPR (Registrul Priorităţii Întreruperii Curente).
Atunci când FSM se află în starea WAIT, citirea lui EIC_IVR porneşte un
indicator intern. Acesta adaugă EIC_CICR şi EIC_CIPR anterioare la stiva EIC. Acest
eveniment are loc la următorul ciclu de ceas intern, după citirea EIC_IVR. Între timp,
indicatorul (flag-ul) intern este eliberat. EIC_CICR şi EIC_CIPR sunt actualizate cu
valoarea corespunzătoare canalului citit în EIC_IVR.
Dacă EIC_IVR este citit în timp ce FSM se află în starea READY, flag-ul
(indicatorul) intern nu este pornit şi nu se realizează nici o operaţie cu stiva internă a
EIC.
O rutină de tratarea a întreruperii poate fi întreruptă printr-un eveniment de
prioritate mai mare (figura II-3). Corespunzător, numărul maxim de întreruperi
înlănţuite este 15, corespunzătoar celor 15 niveluri de prioritate, de la 1 la 15. O
întrerupere cu nivel de prioritate 0 nu poate fi executată niciodată. Pentru ca stiva să
fie plină, trebuie activate înlănţuit până la 15 întreruperi şi fiecare eveniment de
întrerupere trebuie să apară secvenţial de la nivelul de prioritate 1 până la 15.
Programul principal trebuie să aibă nivelul de prioritate 0.
Având toate sursele de întrerupere cu nivel de prioritate 0, se poate folosi
interogarea selectivă în anumite aplicaţii.
-6-
MICROCONTROLERE
ajunge la acest pas din stivă. Atunci când stiva e golită, EIC_CICR şi EIC_CIPR sunt
stocate cu valori corespunzătoare evenimentului de întrerupere anterior.
-7-
MICROCONTROLERE
în starea low, dar dacă bitul de activare EIC global nu este setat, linia nIRQ din
ARM7TDMI nu va fi activată în starea low.
EIC_IPR este un registru de citire/ştergere, astfel încât scrierea unui „0” nu va
avea efect, în timp ce scrierea unui „1” va reseta bitul corespunzător. Astfel, trebuie
să existe o reţinere în folosirea instrucţiunilor citire-modificare pentru a evita alterarea
stării EIC_IPR. Majoritatea biţilor în aşteptare EIC sun legaţi de un bit în aşteptare de
la nivelul perifericului. Bitul periferic în aşteptare trebuie şters înainte de ştergerea
bitului în aşteptare din EIC. În caz contrar, bitul în aşteptare EIC va fi setat din nou,
iar rutina de întrerupere va fi executată de două ori.
-8-
MICROCONTROLERE
Eliberarea unui bit în aşteptare a unei întreruperi deja în stivă va altera sitva.
În programul principal, dacă întreruperile totale sunt dezactivate, toate sursele
de întrerupere sunt dezactivate şi toţi biţii în aşteptare sunt şterşi. Dacă nIRQ a fost
deja setată low, imediat ce întreruperile totale sunt activate, CPU execută o rutină de
întrerupere. În această situaţie, citirea EIC_IVR va avea o valoare imprevizibilă,
alterând stiva EIC.
Există o singură cale sigură de a elibera biţii în aşteptare, fără executarea
rutinei de întrerupere corespunzătoare. Aceasta ajuta la eliberarea acestora dacă se
realizează dintr-o rutină IRQ ce are un nivel de prioritate mai mare. În acest sens,
linia EIC nIRQ este garantat eliberată.
Toţi biţii în aşteptare EIC pot fi şterşi (eliberaţi), incluzând pe cei pe care
aplicaţia utilizator doreşte să îi folosească ulterior. Codul utilizator trebuie să asigure
faptul că pentru aceste întreruperi, bitul în aşteptare asociat de la periferic nu este
şters/ eliberat. În acest, biţii în aşteptare EIC corespunzători vor fi setaţi din nou.
Deoarece toţi biţii în aşteptare EIC sunt şterşi în acest moment, se garantează că
stiva EIC va fi eliberată corespunzător. O soluţie alternativă constă în asigurarea
faptului că bitul în aşteptare EIC corespunzător citirii EIC_IVR va fi şters.
-9-
MICROCONTROLERE
- 10 -
MICROCONTROLERE
- 11 -
MICROCONTROLERE
- 12 -
MICROCONTROLERE
Menţiune: EIC nu ţine cont de conţinutul IVR: privind din punctul de vedere al
controller-ului, este o simplă concatenare a două câmpuri de 16 biţi.
- 13 -
MICROCONTROLERE
Citirea lui IVR este cunoscută doar atunci când CPU nu este în modul debug
şi codul utilizator este executat în modul ARM IRQ.
- 14 -
MICROCONTROLERE
- 15 -
MICROCONTROLERE
Aceşti biţi sunt de tip: citire/ştergere, de exemplu: scrierea unui „0” nu produce
nici un efect, în timp ce scrierea unui „1” şterge bitul.
0: nici o întrerupere în aşteptare
1: întrerupere în aşteptare.
Menţiune: Înainte de ieşirea din ISR, software-ul trebuie să şteargă bitul din
EIC_IPR0 corespunzător rutinei ISR. Această operaţie de ştergere a bitului va fi
interpretată de către EIC ca o secvenţă de sfârşit a întreruperii (EOI) şi va permite
golirea stivei de întreruperi şi procesarea de noi întreruperi.
Exemplul 1:
Să presupunem că unul sau mai multe canale de întrerupere sunt activate, cu
o prioritate mai mare decât zero. Imediat ce apare o cerere de întrerupere,
EIC FSM procesează noua intrare şi setează semnalul nIRQ. Dacă înainte de
citirea EIC_IVR, din orice motiv, software-ul şterge biţii de aşteptare, semnalul
nIRQ va rămâne setat, chiar dacă nu mai sunt întreruperi în aşteptare.
Singura modalitate de a reseta logica liniei nIRQ constă în citirea registrului
EIC_IVT (0x18) sau de a trimite un reset prin software la EIC.
Exemplul 2
Să presupunem că unul sau mai multe canale de întrerupere sunt active, cu
prioritate mai mare decât zero. Imediat ce apare o cerere de întrerupere, EIC
FSM procesează noua intrare şi setează semnalul nIRQ. Dacă după citirea
EIC_IVR, din orice motiv, software-ul eliberează biţii de aşteptare legaţi de
canalul servit înainte de completarea ISR, EIC va detecta o comandă a
sfârşitului de întrerupere, va trimite o cerere de golire la stiva de prioritate şi
va fi procesată o nouă întrerupere, chiar de prioritate mai mică. Pentru a
închide secţiunea de tratare a întreruperii (EOI), operaţia de eliberare a
întreruperii în aşteptare trebuie să fie realizată la sfârşitului lui ISR
corespunzătoare, cu bitul de aşteptare referitor la canalul servit. Pe de altă
parte, imediat ce bitul de aşteptare a canalului servit este eliberat (chiar din
greşeală) de către software, secvenţa EOI este introdusă de către EIC.
- 16 -
MICROCONTROLERE
- 17 -
MICROCONTROLERE
- 18 -
MICROCONTROLERE
IV Specificaţii de programare
Se prezintă în continuare un scurt ghid despre modul de programare a
regiştrilor EIC pentru a porni şi rula rapid aplicaţii cu întreruperi. În continuare, se
presupune că tratăm întreruperi standard şi că vrem, de exemplu, să detectăm o
întrerupere pe canalul #22, ce are prioritatea 5.
Mai întâi, trebuie să setaţi prioritatea şi adresa de salt pentru canalul de
întrerupere #22, astfel:
Scrieţi o valoare binară „0101” în câmpul SIPL a registrului SIR22, de
exemplu: prioritate 5 (trebuie să nu fie zero pentru a permite IRQ să fie
generat).
Doi regiştri sunt utilizaţi pentru a furniza vectorul de întrerupere a canalului la
controller-ul IVR([31:16])şi SIR22([31:16]):
Scrieţi în SIR22[31:16], de exemplu partea mai înaltă a registrului SIR
legat/referitor la canalul #22, offset-ul adresei de memorie (sau offset-ul de
salt), unde începe rutina serviciului de întrerupere, corespunzătoare canalul
de întrerupere #22.
Introduceţi adresa de salt de bază (sau opcode-ul de salt) în jumătatea cea
mai semnificativă a registrului IVR, de exemplu IVR[31:16].
Notă
- 19 -
MICROCONTROLERE
Menţiune: r5 este un registru generic ales în acest exemplu din regiştrii disponibili r0
până la r12. Nu există posibilitatea salvării SPSR direct în stiva ARM, operaţia fiind
executată în 2 paşi, utilizând r5 ca registru temporar.
- 20 -
MICROCONTROLERE
În cazul în care are loc o cerere IRQ de prioritate mai mare între ultimele 2
instrucţiuni, iar noul ISR apelează altă subrutină, conţinutul LR va fi pierdut; atunci
când ultimul IRQ ia sfârşit, subrutina anterioară întreruptă nu se va întoarce la adresa
corectă.
Pentru a evita acest lucru, instrucţiunile anterioare trebuie înlocuite cu o
singură instrucţiune:
VI Teme
1. Se va studia comportamentul controlerului EIC analizând exemplul pentru XTI
(funcţionarea XTI va fi analizată în detaliu în laboratorul următor).
- 21 -
MICROCONTROLERE
Notă
Se vor pune sub tensiune echipamentele numai cu acordul cadrului didactic
îndrumător
- 22 -