Sunteți pe pagina 1din 13

MINISTERUL EDUCAȚIEI, CULTURII ȘI CERCETĂRII

AL REPUBLICII MOLDOVA UNIVERSITATEA TEHNICĂ


A MOLDOVEI

Facultatea Calculatoare, Informatică și Microelectronică

REFERAT la Arhitectura Calculatoarelor

Tema: Întreruperi software/hardware

Student CRI-181M: BAIDAUZ Feliciu


Conf.univ., dr. ABABII Victor

Chişinău – 2019
1. Întreruperi hardware
O întrerupere hardware reprezintă un semnal sincron sau asincron de la un
periferic ce semnalizează apariția unui eveniment care trebuie tratat de către
procesor. Tratarea întreruperii are ca efect suspendarea firului normal de execuție
al unui program și lansarea în execuție a unei rutine de tratare a întreruperii
(RTI).

Întreruperile hardware au fost introduse pentru a se elimina buclele pe care


un procesor ar trebui să le facă în așteptarea unui eveniment de la un periferic.
Folosind un sistem de întreruperi, perifericele pot comunica cu procesorul, acesta
din urma fiind liber să-și ruleze programul normal în restul timpului și să își
întrerupă execuția doar atunci când este necesar.

Înainte de a lansa în execuție o RTI, procesorul trebuie sa aibă la dispoziție un


mecanism prin care să salveze starea în care se afla în momentul apariției
întreruperii. Aceasta se face prin salvarea într-o memorie, de cele mai multe ori
organizată sub forma unei stive, a registrului contor de program (Program
Counter), a registrelor de stare precum și a tuturor variabilelor din program care
sunt afectate de execuția RTI. La sfârșitul execuției RTI starea anterioară a
registrelor este refăcută și programul principal este reluat din punctul de unde a
fost întrerupt.

Pentru a asocia o întrerupere cu o anumită rutină din program, procesorul


folosește tabela vectorilor de întrerupere (TVI), ilustrată în figura de mai jos. În
această tabelă, fiecărei întreruperi îi este asociată adresa rutinei sale de tratare, la
care programul va face salt în cazul apariției acesteia. Aceste adrese sunt
predefinite și sunt mapate în memoria de program într-un spatiu contiguu care
alcătuiește TVI. Adresele întreruperilor în TVI sunt setate în funcție de prioritatea
lor: cu cât adresa este mai mică cu atât prioritatea este mai mare.
Fig. 1: Tabela de vectori de întrerupere pentru ATmega324 
După cum se observă din figure 1, pe lângă întreruperile componentelor
interne uC-ului (timer-e, interfețe seriale, convertor analog-digital), există și câteva
linii pentru întreruperi de la periferice externe: INT0-INT2 și PCINT0-PCINT3.
Diferența dintre aceste două tipuri de întreruperi externe este dată de capabilitățile
suportate și de granularitatea lor. Semnalele pentru întreruperile INTn vin pe portul
D pinii 2, 3 respectiv portul B pinul 2 și pot genera o întrerupere la tranziție
(crescătoare, descrescătoare sau ambele) sau pe nivel 0, în funcție de configurarea
întreruperii. Întreruperile PCINTn se declanșează la ambele tranziții (de unde și
numele Pin Change INTerrupt) și câte 8 pini sunt multiplexați pe o singură
întrerupere. Semnalele de întrerupere PCINT se pot activa individual, însă pentru a
afla exact ce semnal a declanșat o anumită întrerupere trebuie verificat registrul
PINn corespunzător. Dacă mai multe semnale se declanșează în același timp, ele
nu vor putea fi deosebite.

Fig. 2: Pini
întreruperi externe pe capsula ATmega324 
Microcontroller-ul oferă posibilitatea mascării întreruperilor prin scrierea pe 0
a bit-ului I din registrul de status (SREG). Valoarea inițială a acestui bit este 0,
deci chiar dacă întreruperile unui periferic sunt activate din unul din registrele
acestuia, ele nu sunt vor fi luate în considerare. Valoarea acestui flag trebuie să fie
1 dacă vrem ca microcontroller-ul sa le trateze. Totodată, la apariția unei
întreruperi, în afară de salvarea stării, procesorul dezactivează întreruperile, iar la
revenirea din rutina de tratare le reactivează. Activarea lor poate fi realizată forțat
și din handler-ul de întrerupere (de exemplu, suntem în handler-ul pt recepția unui
frame pe interfața seriala, și dorim să activăm întreruperile unui timer).
1.1. Tratarea unei întreruperi

Fig. 3: Tratarea unei întreruperi


pentru ATmega324 
Să presupunem că programul nostru primește întreruperea externă INT0 în
timp ce execută instrucțiunea ldi R16,0xFF. După rularea instrucțiunii, registrul
contor program (PC) este automat salvat în stivă și apoi inițializat la valoarea
corespunzătoare adresei lui INT0 ($002). Acest lucru se traduce prin saltul
programului de la adresa curentă ($123) la adresa $002. Aici, programul găsește
instrucțiunea jmp $2FF care-i permite sa sară la rutina efectivă de tratare a
întreruperii. La sfârșitul oricărei RTI trebuie să existe instrucțiunea reti care reface
din stivă registrul PC (programul sare înapoi la adresa de unde rămăsese înainte de
întrerupere).

În timpul execuției unei întreruperi, bitul I din SREG este setat la 0 și resetat la


ieșire, adică orice altă întrerupere care poate apărea în timpul întreruperii curente
nu va fi luată in seamă. Cu toate acestea, utilizatorul poate să reseteze bitul I din
software, permițând astfel execuția unei întreruperi în întrerupere.
1.2. Registre
Descrierea completă a acestor registre o găsiți în datasheet în
capitolele Interrupts, External Interrupts.

Status Register (SREG)

 conține flag-uri setate în urma operațiilor unității aritmetice logice


 conține flag-ul I de activare/dezactivare întreruperi
 nu este salvat la apariția unei întreruperi !!!
 descris în datasheet în capitolul AVR CPU Core

Fig. 4: Registrul SREG 


MCU Control Register (MCUCR)

 bitul IVSEL controlează unde se plasează vectorii de întreruperi (0 -


începutul memoriei Flash, 1 - începutul secțiunii de Boot Loader din Flash)
 bitul IVCE activează scrierea bitului IVSEL

Fig. 5: Registrul MCUCR 


External Interrupt Mask Register (EIMSK)

 biții INT2:0 controlează dacă întreruperile externe sunt activate


 pt oricare bit INT2:0, dacă este 1 și bitul I din SREG este 1 atunci sunt
activate întreruperile externe pe pinul corespunzător.

1.3. Lucrul cu întreruperi în avr-gcc
avr-libc oferă interfața din avr/interrupt.h pentru definirea rutinelor de tratare a
întreruperilor. Tabela de vectori specifică fiecărui microcontroller (în cazul nostru
pentru ATMega324) este declarată în header-ul de IO specific (ex: iom324.h)

Întrerupere Vector Descriere

TIMER1 TIMER1_COMPA_vect Compare Match pragul A pe timer-


COMPA ul 1

TIMER1 TIMER1_COMPB_vect Compare Match pragul B pe timer-


COMPB ul 1

TIMER1 OVF TIMER1_OVF_vect Overflow pe contorul timer-ului 1

PCINT1 PCINT1_vect Eveniment de “pin change” pe


portul B

… … …

Tab. 1:  Exemple de întreruperi


Definirea rutinei de tratare se face cu macro-ul ISR:

#include <avr/interrupt.h>

ISR(INT0_vect)

...

Reguli de programare în context întrerupere:

 Nu există o valoare de return! La închierea execuției handler-ului,


procesorul execută din nou instrucțiuni de unde rămăsese înainte de declanșarea
întreruperii
 Datorită faptului că handler-ul întârzie orice altă activitate din main și inhibă
execuția altor întreruperi, se dorește ca timpul de execuție să fie cât mai mic!
 La folosirea unor variabile comune în mai multe handler-e de întrerupere
și/sau main trebuie avut în vedere accesul concurent la acestea (în special la
variabilele de 16/32 biți a căror modificare necesită mai mulți cicli de
procesor).
 Variabilele comune trebuiesc marcate ca volatile pentru ca accesele la
acestea să nu fie optimizate de către compilator
Întreruperile pot fi declarate cu anumite flag-uri - Click AICI pentru mai
multe detalii
Alte wrapper-e (în jurul unor instrucțiuni ale core-ului AVR) oferite de interfață
sunt:
 sei() - setează pe 1 bitul I din SREG, activând întreruperile globale.
Apelează instrucțiunea assembler sei
 cli() - setează pe 0 bitul I din SREG, dezactivând întreruperile globale.
Apelează instrucțiunea assembler cli
 reti() - întoarcerea dintr-o rutină de tratare a intreruperii, activează
întreruperile globale. Ar trebui sa fie ultima instrucțiune apelată într-o rutină
care folosește flag-ul ISR_NAKED.
Întreruperile întâlnite care nu au o rutină de tratare vor cauza o întrerupere de reset!

Întreruperi Software
Clasificare
Noţiunea de întrerupere presupune (aşa cum îi arată şi numele) întreruperea
programului în curs de execuţie şi transferul controlului la o anumită rutină
specifică, numită rutină de tratare, dictată de cauza care a generat întreruperea.
Mecanismul prin care se face acest transfer este, în esenţă, de tip apel de
procedură, ceea ce înseamnă revenirea în programul întrerupt, după terminarea
rutinei de tratare.

Întreruperile se pot clasifica după mai multe criterii, rezultând tipurile ilustrate în
figura următoare:

Figura 1. Clasificarea întreruperilor


Diferenţa între întreruperile hardware și software este dată de entitatea care
generează întreruperea. Dacă este provocată de un dispozitiv hardware, atunci este
o întrerupere hardware, iar dacă este provocată de un program, este o întrerupere
software.
Astfel, întreruperile software apar ca urmare a execuţiei unor instrucţiuni,
cum ar fi INT, DIV, IDIV.
Întreruperile hardware sunt interceptate de rutine speciale care se execută în
mod continuu cu scopul de a le detecta și de a efectua acţiunile corespunzătoare.
Ele sunt de 2 tipuri:
- Întreruperile hardware externe sunt provocate de semnale electrice care
se aplică pe intrările de întreruperi INT şi NMI ale procesorului.
- Întreruperile hardware interne apar ca urmare a unor condiţii speciale
de funcţionare a procesorului (cum ar fi execuţia pas cu pas a
programelor, împărțirea la 0);
Tabela de întreruperi
Într-un sistem pot exista maxim 256 de întreruperi (nivele) distincte. Fiecare
din aceste nivele poate avea asociată o procedură de tip far, numită rutină de
tratare. Adresele acestor rutine sunt trecute într-o aşa numită tabelă de întreruperi,
aflată la adresele fizice 00000 - 003FFH, ocupând deci 1024 de octeţi. Fiecare
nivel ocupă 4 octeţi, primii reprezentând offset-ul, iar următorii adresa de segment
a procedurii (Figura 2).
La apariţia unei întreruperi, au loc următoarele acţiuni:
• se salvează în stivă registrele FLAGS, CS şi IP (în această ordine);
• se şterg bistabilii IF (Interrupt Flag) şi TF (Trap Flag – flag de urmarire pas
cu pas);
• se furnizează procesorului un întreg pe 8 biţi (deci în gama 0 - 255), numit
şi vector de întrerupere, care identifică nivelul asociat întreruperii;
• se execută un salt indirect intersegment la adresa de început a rutinei de
tratare, prin intermediul tabelei de întreruperi.
Figura 2 Tabela de
întreruperi
Se observă că, exceptând salvarea flagurilor şi ştergerea bistabililor IF şi TF,
secvenţa de tratare a unei întreruperi se reduce la un apel indirect de procedură far,
prin intermediul tabelei de întreruperi.
Nivelele predefinite de întrerupere sunt:
• 0 - depăşire la împărţire (cauze posibile; instrucţiunile DIV sau IDIV);
• 1 - execuţie pas cu pas (cauză posibilă: bistabilul TF = 1);
• 2 - întrerupere externă nedezactivabilă (cauză posibilă: semnal electric pe
linia de
întrerupere nedezactivabilă NMI);
• 3 - execuţie pana la o anumita linie (cauză posibilă: instrucţiunea INT 3);
• 4 - depăşire (cauză posibilă: instrucţiunea INTO).
Se mai pot cita întreruperile hardware de la ceasul de timp real (nivelul 8) şi de la
tastatură (nivelul 9).
Întreruperile software în gama 20H - 2FH sunt folosite de sistemul de operare
DOS, iar cele în gama 10H - 1AH de către subsistemul de intrări - ieşiri BIOS.
În Tech Help se găsește modul de utilizare:
Tech Topics -> ROM-BIOS Functions -> Interrupts and ROM-BIOS Services
Întreruperi software

Sunt rezultatul execuției instrucțiunilor INT dintr-un program în curs de execuție.


Acestea pot fi văzute ca niște evenimente lansate de programator, care opresc
imediat execuția programului și se apelează rutina de tratare a întreruperii. Aceste
rutine sunt, de obicei, incluse în sistemul de operare și vor determina realizarea
acțiunii corespunzătoare. (de exemplu afișarea unui șir pe ecran, sau execuția unui
fișier). Un exemplu este INT 21h care este o întrerupere a serviciului DOS. Când
rutina este apelată, aceasta va citi valoarea stocată în ah, și va lansa rutina
corespunzatoare.

În exemplul următor este invocată întreruperea 21h.


:
mov ax, 4c00h
int 21h
:
Aceste 2 linii cer sistemului de operare să încheie execuția programului.
Numărul întreruperii nu este suficient. Întreruperile se comportă diferit în funcție
de ce număr de serviciu este apelat (de exemplu la întreruperile 10h și 21h). În
acest caz, numărul serviciului este plasat în ah și este egal cu 4ch. (Observație:
AX=4c00h înseamnă AH=4ch și AL=00h).

Aplicații:

1. Blocarea programului până când este apăsat un buton al mouse-ului


(aplic1.asm).
.model small
.code
start:
mov AX,5 ;5 in AX spune intreruperii 33
;sa preia informatiile despre butoanele mouse-ului
int 33h ;apel intrerupere
cmp AX,1b ;in ax este preluata starea butonului de mouse
jl start ;daca nu este nici un buton apasat se intoarce la
;eticheta start
;AX va fi 0 cat timp nu se apasa nici un buton
mov ah,004Ch ;terminare program
int 21h
end
2. Afisarea unui mesaj la o anumită poziție pe ecran (aplic2)
.model small
.data
mesaj db "BUTTON","$"
.code
start:
mov ax, dgroup
mov ds, ax

mov ah,02h ;serviciul pentru setarea pozitiei cursorului


mov dh,0Bh ;linia
mov dl,22h ;coloana

int 10h

; afisare mesaj
mov ah,09h
mov dx,offset mesaj
int 21h

mov ah, 4ch


int 21h
end
3. Realizați o aplicație care să blocheze execuția programului până la apăsarea
unui buton de mouse în zona mesajului BUTTON.

4. Realizați o aplicație care să afișeze mesajul „Ai reușit” numai dacă a fost
apăsat un buton al mouse-ului pe zona ocupată de mesajul BUTTON din
programul aplic2.asm

5. Realizați un meniu cu opțiunile:


Afisare mesaj
Info
Iesire
care să execute acțiunile corespunzătoare la apăsarea unui buton de mouse pe zona
corespunzătoare opțiunii.

S-ar putea să vă placă și