Întreruperi și excepții: Tipuri de întreruperi. Gestionarea întreruperilor, vectori de întrerupere, întreruperi software, vector de întrerupere IRQ

Sistemul de operare este controlat în mare măsură de sistemul de întrerupere. În modul real, există 2 tipuri de întreruperi: hardware și software. Întreruperile software sunt inițializate cu comanda int. Hardware - evenimente externe care sunt asincrone cu programul care rulează. De obicei, întreruperile hardware sunt inițiate de hardware-ul I/O după finalizarea operațiunii curente.

Pentru a gestiona întreruperile în modul real, procesorul folosește un tabel vectorial de întreruperi. Adresele de segment utilizate pentru a localiza rutinele de întrerupere se numesc vectori de întrerupere.

Tabelul vector de întrerupere este situat chiar la începutul OP, adică. adresa sa fizică = 0. Tabelul vector de întrerupere este format din 256 de elemente a câte 4 octeți. Vectorii constau dintr-o adresă de segment de 16 biți și un offset de 16 biți (mai întâi vine decalajul, apoi segmentul). Fiecare vector de întrerupere are propriul său număr, numit număr de întrerupere, care indică locul său în tabel. Acest număr, înmulțit cu 4, dă adresa absolută a vectorului de memorie.

Vectorii de întrerupere își primesc valorile atunci când sistemul pornește. În primul rând, BIOS-ul, atunci când efectuează proceduri de inițializare, stabilește valorile anumitor vectori de întrerupere. Când DOS pornește, valorile sunt atribuite vectorilor de întrerupere DOS.

DOS poate realoca unii dintre vectorii BIOS rutinelor sale. De asemenea, utilizatorul poate modifica valorile vectorului de întrerupere. Când are loc o întrerupere software sau hardware, starea actuală Registrele CS:IP, precum și valorile registrului de steaguri, sunt scrise în stiva de programe. Apoi, noile valori CS:IP sunt selectate din tabelul de vectori de întrerupere. În acest caz, controlul este transferat către procedura de gestionare a întreruperilor.

Înainte de a intra în procedura de gestionare a întreruperilor, indicatorul de urmărire TF și indicatorul de activare a întreruperii IF sunt șterse forțat. După finalizarea procesării întreruperii, procedura trebuie să emită comanda IRET, care va scoate din stivă valorile registrelor CS:IP și ale registrului de steaguri. Apoi, execuția programului întrerupt continuă.

Procedura de gestionare a întreruperilor trebuie să se încheie cu procedura IRET, după care se citesc valorile steagurilor, CS, IP.

Întrerupere - un eveniment care necesită un răspuns imediat din partea procesorului. Răspunsul este că procesorul întrerupe procesarea programului curent ( program întrerupt) și continuă să execute alt program ( întreruperea programului), special conceput pentru acest eveniment. La finalizarea acestui program, procesorul revine la executarea programului întrerupt.

Fiecare eveniment care necesită o întrerupere este însoțit de semnal de întrerupere, informând computerul despre acest lucru și sunat cerere de întrerupere.

Starea programului reprezintă un set de stări ale tuturor elementelor de stocare în momentul corespunzător din timp (de exemplu, după ce ultima comandă a fost executată). Când are loc o întrerupere, microcontrolerul stochează conținutul contorului programului pe stivă și încarcă în el adresa vectorului de întrerupere corespunzător. Ultima comandă a rutinei de serviciu de întrerupere trebuie să fie o comandă care revine la programul principal și restabilește contorul de program stocat anterior. În timp ce gestionarea întreruperilor se execută, unele informații se pot schimba. Prin urmare, atunci când treceți la manipulatorul de întreruperi, este necesar să salvați elementele care sunt modificate. Setul de astfel de elemente este vector de stare a programului. În acest caz, alte informații despre starea celulelor de memorie nu sunt semnificative sau pot fi restaurate programatic.

Vector de stare inițială conține toate informațiile necesare pentru lansarea inițială a programului. În multe cazuri, vectorul de stare inițială conține un singur element - adresa de pornire a programului care este lansat.

Vector de întrerupere este vectorul stării inițiale a programului de întrerupere (handler) și conține toate informațiile necesare trecerii la handler, inclusiv adresa de pornire a acestuia. Fiecare tip de întrerupere are propriul său vector de întrerupere, care inițiază execuția handler-ului corespunzător. De obicei, vectorii de întrerupere sunt stocați în locații de memorie fixă ​​special alocate cu adrese scurte, care reprezintă tabel de vectori de întrerupere. Pentru a trece la programul de întrerupere adecvat, procesorul trebuie să aibă un vector de întrerupere și adresa acestui vector. La această adresă, de regulă, există o comandă de salt necondiționat la subrutina de gestionare a întreruperilor.

De regulă, controlul stocării și returnării este atribuit operatorului de întrerupere. În acest caz, handlerul este format din trei părți - pregătitoare (prolog) și finală (epilog), care asigură comutarea programului, și programul de întrerupere propriu-zis, care efectuează operațiunile solicitate de cerere. Timpul de răspuns este definit ca intervalul de timp din momentul în care este primită o solicitare de întrerupere până când programul de întrerupere începe execuția.


tp– timpul de răspuns al sistemului la întrerupere;
t z– timpul de memorare a stării programului întrerupt;
t ppr– ora programului efectiv de întrerupere;
t in– timpul pentru a restabili starea programului întrerupt

Dacă există mai multe surse de solicitări, trebuie stabilită o anumită ordine de deservire a cererilor primite, apelată relații prioritare sau disciplina de serviciu. Setul de toate tipurile posibile de întreruperi ale procesorului este sistem de întrerupere microcontroler. Disciplina de serviciu determină care dintre mai multe solicitări primite simultan este procesată prima și dacă acest sau acel operator de întrerupere are dreptul de a întrerupe această solicitare.
Dacă, în timpul procesării întreruperii, sosește o cerere de întrerupere cu mai multe nivel înalt cu prioritate, controlul este transferat la manipulatorul de întreruperi cu prioritate mai mare, în timp ce manipulatorul de întreruperi cu prioritate inferioară este suspendat. Apare întrerupe cuibărirea. Este apelat numărul maxim de programe care se pot suspenda reciproc profunzimea întreruperilor.

Dacă cererea de întrerupere nu este deservită în momentul în care sosește o nouă solicitare din aceeași sursă (aceeași prioritate), atunci întrerupe saturația sistemului. În acest caz, unele solicitări de întrerupere se vor pierde, ceea ce este inacceptabil pentru funcționarea normală a microcontrolerului.

Caracteristicile sistemului de întrerupere sunt:

  • numărul total de cereri de întrerupere numărul de surse de solicitări de întrerupere;
  • tip reprezentare întrerupere - de regulă, o solicitare de întrerupere este reprezentată de un nivel de semnal logic;
  • prioritatea întreruperii – determină ordinea în care este procesată fiecare cerere de întrerupere cu cât este mai mare prioritatea, cu atât mai scurtă este întârzierea în execuția programului de întrerupere a acesteia;
  • timp de răspuns – intervalul de timp dintre apariția cererii de întrerupere și începerea execuției programului de întrerupere;
  • întârziere întrerupere – determinată de timpul total pentru stocarea și restabilirea programului;
  • adâncimea, de obicei coincide cu numărul de niveluri de prioritate din sistemul de întrerupere;
  • întreruperea saturației sistemului;
  • momentele permise de întrerupere a programului (de obicei, sfârșitul execuției următoarei comenzi).

Întrerupeți mascarea folosit pentru a spune microcontrolerului să răspundă la fiecare tip de întrerupere sau să o ignore. O mască de întrerupere reprezintă un cod binar ai cărui biți sunt mapați la sursele de solicitare de întrerupere. Un bit din codul binar îi spune microcontrolerului să gestioneze acest tip de întrerupere. Un bit zero, dimpotrivă, nu permite microcontrolerului să treacă la procesarea întreruperilor de tipul specificat.
De regulă, pe lângă mascarea întreruperilor, există și un bit de activare a întreruperilor globale, a cărui valoare zero dezactivează toți gestionatorii de întreruperi (cu excepția resetarii hardware și a saltului la începutul programului de execuție).
Pe lângă codul binar al măștii de întrerupere, există și un cod binar steaguri de întrerupere, care permite gestionarului de întrerupere să seteze sursa întreruperii dacă există mai multe surse cu cererea specificată în microcontroler.

Pentru a gestiona evenimentele care apar asincron în ceea ce privește execuția programului, mecanismul de întrerupere este cel mai potrivit. O întrerupere poate fi considerată ca un eveniment special din sistem care necesită un răspuns imediat.

Aproape toate sistemele de intrare/ieșire dintr-un computer funcționează folosind întreruperi. Mai exact, atunci când apăsați taste sau faceți clic pe mouse, hardware-ul generează întreruperi. Ca răspuns la acestea, sistemul, în consecință, citește codul tastei apăsate sau își amintește coordonatele cursorului mouse-ului. Întreruperile sunt generate de controlerul de disc, adaptorul retea locala, porturi seriale, adaptor audio și alte dispozitive.

Pare clar că o mare varietate de întreruperi sunt posibile din mai multe motive. Prin urmare, un număr este asociat cu o întrerupere - așa-numitul număr de întrerupere.

Acest număr corespunde în mod unic unui anumit eveniment. Sistemul poate recunoaște întreruperile și, atunci când acestea apar, lansează o procedură corespunzătoare numărului de întreruperi.

Unele întreruperi (primele cinci în ordine numerică) sunt rezervate pentru utilizare de către CPU în cazul oricăror evenimente speciale, cum ar fi o încercare de împărțire la zero, depășire etc.

Programele pot provoca ele însele întreruperi cu un anumit număr. Pentru a face acest lucru, ei folosesc comanda INT. Acestea sunt așa-numitele întreruperi software. Întreruperile software nu sunt asincrone deoarece sunt apelate din cadrul programului.

Întreruperile software sunt convenabile de utilizat pentru a organiza accesul la funcțiile individuale comune tuturor programelor. De exemplu, funcțiile sistemului de operare sunt accesibile programelor de aplicație prin întreruperi. Când apelați aceste module, nu este nevoie să cunoașteți adresa lor curentă în memorie.

Programele de aplicație și driverele își pot instala propriile lor gestionare de întreruperi pentru a fi utilizate ulterioară de către alte programe. Pentru a face acest lucru, gestionatorii de întreruperi încorporați trebuie să fie rezidenți în memorie.

Întreruperile hardware sunt cauzate de dispozitive fizice și, prin urmare, ajung asincron în ceea ce privește execuția oricăror programe. Aceste întreruperi informează sistemul despre evenimente legate de funcționarea dispozitivului. De exemplu, că imprimanta a terminat în sfârșit de imprimat un caracter și ar fi bine să tipăriți următorul caracter, sau că sectorul de disc a fost deja citit și conținutul său este disponibil pentru program.

Utilizarea întreruperilor atunci când lucrați cu dispozitive externe lente vă permite să combinați I/O cu procesarea datelor în procesorul central. Acest lucru are ca rezultat îmbunătățirea performanței generale a sistemului.

Uneori este de dorit ca sistemul să fie insensibil la toate întreruperile hardware sau individuale. Pentru a face acest lucru, ei folosesc așa-numita mascare a întreruperii, despre care vom vorbi mai târziu. Există însă și o întrerupere nemascabilă (care, de altfel, poate fi totuși mascata, sau, mai exact, blocată).

Rețineți că gestionatorii de întreruperi pot apela ei înșiși întreruperi software, de exemplu, pentru a obține acces la un serviciu BIOS sau MS-DOS.

Compilare programe proprii gestionarea întreruperilor și înlocuirea gestionarilor standard MS-DOS și BIOS este o sarcină destul de complexă. Este necesar să se țină seama de toate subtilitățile funcționării echipamentului, precum și de interacțiunea dintre software și hardware. La depanare, este posibil să distrugi sistemul de operare cu consecințe imprevizibile, așa că trebuie să fii foarte atent la ceea ce face programul tău.

4.1. Întreruperea tabelului vectorial

Pentru a asocia adresa handler-ului de întrerupere cu numărul de întrerupere se utilizează un tabel de vectori de întrerupere, care ocupă primul kilobyte de RAM. Acest tabel se află în intervalul de adrese de la 0000:0000 la 0000:03FFh și constă din 256 de elemente - adrese departe ale manipulatorilor de întreruperi.

Intrările din tabelul vector de întrerupere se numesc vectori de întrerupere. Primul cuvânt al elementului de tabel conține componenta offset, iar al doilea cuvânt conține componenta de segment a adresei de gestionare a întreruperilor.

Vectorul de întrerupere numărul 0 este situat la adresa 0000:0000, vectorul de întrerupere numărul 1 este la adresa 0000:0004 etc.

Pentru un programator care utilizează limbajul C, tabelul vector de întrerupere poate fi descris după cum urmează:

void (departe* tabel_întreruperi)();

Inițializarea tabelului este efectuată parțial de sistemul de intrare/ieșire BIOS după testarea hardware-ului și înainte ca sistemul de operare să înceapă să se încarce și parțial la încărcarea MS-DOS. Sistemul de operare MS-DOS poate modifica unii vectori de întrerupere setați de BIOS.

Să vorbim despre scopul celor mai importanți vectori de întrerupere.

Număr Descriere
0 Eroare de divizare: Aparită automat după executarea unei comenzi DIV sau IDIV dacă diviziunea are ca rezultat un depășire (de exemplu, împărțirea cu 0). De obicei, atunci când gestionează această întrerupere, MS-DOS afișează un mesaj de eroare și oprește execuția programului. În acest caz, pentru procesorul i8086 adresa de retur indică către comanda care urmează comenzii de divizare, iar pentru procesorul i80286 și modelele mai vechi - către primul octet al comenzii care a provocat întreruperea
1 Întreruperea modului pas cu pas este generată după executarea fiecărei instrucțiuni de mașină dacă bitul de urmărire pas cu pas TF este setat în cuvântul flag. Folosit pentru programe de depanare. Această întrerupere nu este generată după ce datele sunt trimise la registrele de segment folosind instrucțiunile MOV și POP.
2 Întreruperea hardware nemascabilă. Această întrerupere poate fi utilizată diferit în diferite mașini. De obicei, este generat atunci când există o eroare de paritate în RAM și când este solicitată o întrerupere de la coprocesor
3 Întreruperea de urmărire Generată la executarea unei instrucțiuni de mașină de un octet cu codul CCh și este folosită în mod obișnuit de depanatori pentru a seta un punct de întrerupere.
4 Debordare. Generat de instrucțiunea mașină INTO dacă este setat pavilionul de overflow OF. Dacă flag-ul nu este setat, instrucțiunea INTO este executată ca NOP. Această întrerupere este folosită pentru a gestiona erorile la efectuarea operațiilor aritmetice
5 Imprimați o copie a ecranului. Generat dacă utilizatorul a apăsat o tastă În programele MS-DOS este de obicei folosit pentru a imprima o imagine de ecran. Pentru procesorul i80286 și modelele mai vechi, acesta este generat la executarea comenzii mașinii BOUND dacă valoarea verificată este în afara intervalului specificat
6 Opcode nedefinit sau lungime de comandă mai mare de 10 octeți
7 Caz special lipsa coprocesorului aritmetic
8
9 IRQ1 - întrerupere de la tastatură.
Generat atunci când utilizatorul apasă și eliberează tastele. Folosit pentru a citi date de la tastatură
O
B
C D
IRQ5 - întrerupere de la controlerul de hard disk (numai pentru computerele IBM PC/XT) E
IRQ6 - întrerupere generată de controlerul HDD după finalizarea operațiunii I/O F
10 IRQ7 - întrerupere de la adaptorul paralel. Generat atunci când imprimanta conectată la adaptor este pregătită pentru a efectua o altă operație. Nu este folosit de obicei
11 Întreținere adaptor video
12 Definirea configurației dispozitivelor din sistem
13 Determinarea dimensiunii RAM
14 Întreținerea sistemului de discuri
15 Lucrul cu un adaptor serial asincron
16 Serviciu extins
17 Întreținerea tastaturii
18 Întreținere imprimante
Rulează BASIC în ROM, dacă este disponibil 1A
Serviciu de ceasuri 1B
Gestionarea întreruperii care apare dacă utilizatorul apasă o combinație de taste 1C
Întreruperea software, apelată de 18,2 ori pe secundă de către handlerul de întrerupere a temporizatorului hardware 1D
Adresa tabelului video pentru controlerul adaptorului video 6845 1E
Indicator către tabelul de parametri de dischetă 1F
Indicator către un tabel grafic pentru caractere cu coduri ASCII 128-255 Folosit de MS-DOS sau rezervat pentru MS-DOS
60-67 Întreruperi rezervate programelor utilizator
68-6F Nu este folosit
70
71
72 IRQ10 - rezervat
73 IRQ11 - rezervat
74 IRQ12 - rezervat
75
76
77 IRQ15 - rezervat
78 - 7F Nu este folosit
80-85 Rezervat pentru BASIC
86-F0 Folosit de interpretul BASIC
F1-FF Nu este folosit

Întreruperile etichetate IRQ0 - IRQ15 sunt întreruperi hardware.

4.2. Întrerupeți mascarea

Adesea, la executarea secțiunilor critice ale programelor, este necesară dezactivarea întreruperilor pentru a asigura executarea neîntreruptă a unei anumite secvențe de instrucțiuni. Acest lucru se poate face folosind comanda CLI. Trebuie plasat la începutul secvenței critice de instrucțiuni, iar la sfârșit trebuie să existe o instrucțiune STI care să permită procesorului să accepte întreruperi. Comanda CLI dezactivează numai întreruperile mascate; această comandă nu are efect asupra procesării întreruperilor care nu se mască.

Dacă utilizați dezactivarea întreruperilor folosind o comandă CLI, aveți grijă să nu dezactivați întreruperile pentru o perioadă lungă de timp, deoarece acest lucru poate avea consecințe nedorite. De exemplu, la un ceas de sistem întârziat sau o defecțiune a dispozitivelor periferice ale computerului.

Dacă trebuie să dezactivați nu toate întreruperile, ci doar unele, de exemplu, de la tastatură, atunci pentru aceasta trebuie să utilizați serviciile unui controler de întreruperi. Prin scrierea anumitor informații de control la acest controler, întreruperile de la dispozitive individuale pot fi mascate.

4.3. Modificarea tabelului vector de întrerupere

Este posibil ca programul dumneavoastră să aibă nevoie să gestioneze unele întreruperi. Pentru a face acest lucru, programul trebuie să instaleze vectorii întreruperilor necesare pe handlerul său. Acest lucru se poate face prin modificarea conținutului elementului corespunzător tabelului vector de întrerupere.

Este foarte important să nu uitați să restaurați conținutul vectorilor modificați în tabelul de întreruperi înainte de a opri.

Faptul este că memoria care a fost alocată programului este eliberată după ieșirea programului. Poate fi folosit, de exemplu, pentru a descărca un alt program. Dacă uitați să restaurați vectorul și are loc o întrerupere, sistemul se poate prăbuși - vectorul indică acum o zonă care poate conține orice.

Prin urmare, succesiunea de acțiuni pentru programele nerezidente care doresc să gestioneze întreruperi ar trebui să fie următoarea:

  • citiți conținutul elementului tabel vector de întrerupere pentru vectorul cu numărul de care aveți nevoie;
  • amintiți-vă acest conținut (adresa vechiului handler de întrerupere) în zona de date a programului;
  • setați o nouă adresă în tabelul vector de întrerupere, astfel încât să indice începutul rutinei dvs. de întrerupere;
  • Înainte de a ieși din program, citiți adresa vechiului handler de întreruperi din zona de date și scrieți-o în tabelul vector de întreruperi.

In plus, operatia de schimbare a vectorului de intrerupere trebuie sa fie continua in sensul ca nu trebuie sa apara nicio intrerupere in timpul schimbarii. Dacă, de exemplu, scrieți o nouă valoare de offset, dar nu aveți timp să actualizați adresa segmentului, atunci la ce adresă va fi transferat controlul în cazul unei întreruperi și ce se va întâmpla? Se poate doar ghici despre asta.

Funcții MS-DOS pentru lucrul cu tabelul de întreruperi

Pentru a facilita munca de înlocuire a vectorilor de întrerupere, MS-DOS vă pune la dispoziție funcții speciale concepute pentru a citi un element din tabelul de vectori de întrerupere și pentru a-i scrie o nouă adresă. Dacă utilizați aceste funcții, MS-DOS se va asigura că operația de înlocuire a vectorului este finalizată corect. Nu trebuie să vă faceți griji cu privire la continuitatea procesului de înlocuire a vectorului de întrerupere.

Pentru a citi vectorul, utilizați funcția de întrerupere INT 21h 35h. Înainte de a-l apela, registrul AL trebuie să conțină numărul vectorului din tabel. După executarea funcției, registrele ES:BX vor conține adresa necesară a operatorului de întrerupere.

Pentru numărul de vector situat în registrul AL, funcția de întrerupere 25h INT 21h instalează un nou handler de întrerupere. Adresa operatorului de întrerupere ar trebui să fie transmisă prin registrele DS:DX.

Desigur, puteți accesa și tabelul vector de întrerupere direct, dar apoi, atunci când scrieți, trebuie să mascați întreruperile cu comanda CLI, amintindu-vă să le activați după ce scrieți cu comanda STI.

Funcțiile _dos_getvect și _dos_setvect sunt disponibile pentru utilizatorii C. Prima funcție primește adresa din tabelul vector de întrerupere, a doua setează o nouă adresă. Ambele funcții accesează funcțiile de întrerupere INT 21h 35h și 25h descrise mai sus.

Care sunt cerințele pentru un program de servicii de întrerupere?

Dacă întreruperile apar frecvent, gestionarea lor poate încetini foarte mult programul de aplicație. Prin urmare, gestionarea întreruperilor ar trebui să fie un program scurt, cu rulare rapidă, care efectuează doar cele mai necesare acțiuni. De exemplu, citirea următorului caracter din portul imprimantei și scrierea acestuia în buffer, creșterea valorii unui contor global de întreruperi etc.

Întrerupeți lanțurile de gestionare

Dacă trebuie să adăugați unele dintre propriile acțiuni la cele efectuate de gestionarea standard de întreruperi, puteți organiza un lanț de întreruperi.

Pentru a organiza un lanț de întreruperi, trebuie să scrieți adresa handler-ului în tabelul vectorial, fără a uita să salvați conținutul anterior al tabelului. Managerul dvs. primește controlul de la întrerupere, efectuează o acțiune, apoi transmite controlul vechiului handler.

O puteți face în alt mod: handlerul dvs. apelează vechiul handler ca subrutină și apoi, după întoarcerea de la vechiul handler, execută acțiuni suplimentare. Cu alte cuvinte, puteți introduce procesări suplimentare atât înainte, cât și după apelarea vechiului handler.

Biblioteca C translator are o funcție pentru organizarea unui lanț de întreruperi numită _chain_intr.

Pentru a descrie o funcție care acționează ca un handler de întrerupere, ar trebui să utilizați cuvântul cheie de întrerupere.

O astfel de funcție se termină cu o revenire de la instrucțiunea de întrerupere IRET. Comenzile pentru salvarea registrelor la intrare și restaurarea lor la ieșirea din gestionarea întreruperilor sunt generate automat pentru acesta. Un exemplu de utilizare a cuvântului cheie de întrerupere pentru a defini o funcție de gestionare a întreruperilor:

void întrerupere far int_funct(...) ( // Întrerupe corp handler )

Funcția de serviciu de întrerupere trebuie să fie o funcție cu rază lungă, deoarece tabelul vector de întrerupere conține adrese complete în format<сегмент:смещение>.

Cuvântul cheie întrerupere este, de asemenea, folosit pentru a descrie variabilele utilizate pentru a stoca vectori de întrerupere:

void (întrerupere (far *oldvect)(...);

Pentru a vă seta propriul handler de întrerupere, utilizați funcția _dos_setvec. Această funcție are doi parametri - numărul de întreruperi și un indicator către noua funcție de gestionare a întreruperilor.

De exemplu:

_dos_setvect(0x16, my_key_intr);

În acest exemplu, un nou handler de întrerupere, my_key_intr, este instalat pentru numărul de întrerupere 16h (o întrerupere software concepută pentru a citi date de la tastatură).

Dacă trebuie să aflați adresa vechiului handler de întrerupere după numărul său, cel mai bine este să utilizați funcția _dos_getvect, care ia numărul de întrerupere ca parametru și returnează un pointer către handler corespunzător acestui număr.

De exemplu:

vector_vechi = _dos_getvect(0x16);

Pentru a organiza un lanț de întreruperi, utilizați funcția _chain_intr. Această funcție ia ca parametru adresa vechiului handler de întrerupere.

program BEEPER

Programul BEEPER (Listarea 4.1) este un exemplu simplu care ilustrează utilizarea tuturor celor trei funcții enumerate mai sus pentru lucrul cu întreruperi.

Lista 4.1. Fișier beeper\beeper.cpp

#include #include #include void main(void); void întrerupere departe timer(...); void întrerupere (far *oldvect)(...); // Variabilă pentru numărarea temporizatorului întrerupe ticuri lungi volatile; void main(void) ( // Resetați contorul ticks = 0L; // Amintiți-vă adresa vechiului handler de întrerupere oldvect = _dos_getvect (0x1c); // Setați un nou handler de întrerupere _dos_setvect (0x1c, timer); printf("\ n Temporizatorul este setat. Apăsați orice tastă " "...\n"); getch(); // Restabiliți vechiul handler de întrerupere _dos_setvect (0x1c,oldvect); ) void întrerupe mult timer(...) ( // Mărește contorul de întreruperi a temporizatorului bifează ++ // Dacă valoarea contorului este multiplu de 20, // emite un semnal către difuzorul computerului if((ticks % 20) == 0) ( asm mov bx,0 asm mov ax, 0E07h asm; int 10h ) // Apelați vechiul handler de întrerupere _chain_intr (oldvect) ;

Acest program încorporează propriul său handler de întrerupere a temporizatorului, care va fi apelat de aproximativ 18,2 ori pe secundă. Managerul de întreruperi încorporat numără întreruperile temporizatorului și, dacă valoarea contorului corespunzător este multiplu de 20, difuzorul computerului emite un bip.

La sfârșitul lucrului program nou Managerul de întrerupere a temporizatorului apelează vechiul handler folosind funcția _chain_intr.

După instalarea unui nou handler de întrerupere a temporizatorului, programul principal așteaptă ca utilizatorul să apese orice tastă. Apoi restaurează vechiul conținut al vectorului de întrerupere.

4.4. Caracteristici ale procesării întreruperilor hardware

Întreruperile hardware sunt generate de dispozitivele computerizate, de obicei atunci când finalizează operațiunile de schimb de date sau când starea lor se schimbă. În funcție de tipul de dispozitiv, operatorul de întrerupere poate îndeplini anumite funcții. De exemplu, atunci când un cronometru este întrerupt, handlerul corespunzător mărește conținutul unui contor situat în RAM. Pe baza conținutului acestui contor, programele pot determina ora curentă.

Spre deosebire de întreruperile software, care sunt numite programate de un program sau driver, întreruperile hardware apar întotdeauna asincron în ceea ce privește programele care rulează. În plus, mai multe întreruperi pot apărea simultan!

Pentru a vă asigura că sistemul nu devine confuz atunci când decideți ce întrerupere să deserviți mai întâi, există o schemă de prioritate specială. Fiecărei întreruperi i se atribuie propria sa prioritate. Dacă apar mai multe întreruperi simultan, sistemul acordă prioritate celei cu cea mai mare prioritate, amânând procesarea întreruperilor rămase pentru un timp.

Sistemul prioritar este implementat pe două cipuri Intel 8259 (sau similare). Fiecare cip este un controler de întrerupere și servește până la opt priorități. Cipurile pot fi combinate (în cascadă) pentru a crește numărul de niveluri de prioritate din sistem.

Nivelurile de prioritate sunt abreviate IRQ0 - IRQ15.

Computerul IBM PC/XT avea instalat un singur cip de control de întrerupere. Prioritățile depindeau liniar de numărul nivelului de întrerupere. Întreruperea IRQ0 a avut cea mai mare prioritate, urmată de întreruperile IRQ1, IRQ2, IRQ3 și așa mai departe.

Întreruperea IRQ2 pe computerele IBM PC/XT a fost rezervată pentru extinderea viitoare a sistemului. În calculatoarele IBM PC/AT, întreruperea IRQ2 a fost folosită pentru a pune în cascadă două controlere de întrerupere 8259. Nivelurile de întrerupere prioritare adăugate IRQ8 - IRQ15 din aceste computere sunt prioritizate între întreruperile IRQ1 și IRQ3.

Iată o listă de întreruperi hardware, aranjate în ordinea descrescătoare a priorității:

Număr Descriere
8 IRQ0 - întreruperea temporizatorului de interval, are loc de 18,2 ori pe secundă
9 IRQ1 - întrerupere de la tastatură
Generat atunci când utilizatorul apasă și eliberează tastele. Folosit pentru a citi date de la tastatură IRQ2 - folosit pentru întreruperi hardware în cascadă
70 IRQ8 - întrerupere a ceasului în timp real
71 IRQ9 - întrerupere de la controlerul EGA
72 IRQ10 - rezervat
73 IRQ11 - rezervat
74 IRQ12 - rezervat
75 IRQ13 - întrerupere de la coprocesorul aritmetic
76 IRQ14 - întrerupere de la controlerul de hard disk
77 IRQ15 - rezervat
O IRQ3 - întrerupe portul asincron COM2
B IRQ4 - întreruperea portului asincron COM1
C IRQ5 - întrerupere de la controlerul de hard disk (numai pe computerele IBM PC/XT)
IRQ5 - întrerupere de la controlerul de hard disk (numai pentru computerele IBM PC/XT) IRQ6 - întrerupere generată de controlerul HDD
IRQ6 - întrerupere generată de controlerul HDD după finalizarea operațiunii I/O IRQ7 - întrerupere a imprimantei

Din această listă puteți vedea că întreruperile temporizatorului de interval au cea mai mare prioritate, urmate de întreruperea de la tastatură. Întreruperea imprimantei are cea mai mică prioritate.

Pentru a gestiona scheme prioritare trebuie să știți structura internă 8259 controler de întrerupere.

Întreruperile primite sunt stocate în Registrul de cereri de întrerupere IRR. Fiecare dintre cei opt biți din acest registru corespunde propriei întreruperi.

Înainte de a emite o cerere de întrerupere către procesor, conținutul registrului de masca de întrerupere IMR de opt biți este verificat. Dacă întreruperea acestui nivel nu este mascată, atunci este emisă o cerere de întrerupere.

Cele mai interesante din punct de vedere al programării controlerului de întrerupere sunt registrele masca de întrerupere IMR și registrul de control al întreruperii.

Pe computerele IBM PC/XT, registrul masca de întrerupere are adresa 21h, iar registrul de control al întreruperii are adresa 20h. În calculatoarele IBM PC/AT, primul controler 8259 are aceleași adrese ca în IBM PC/XT. Registrul masca de întrerupere al celui de-al doilea controler are adresa A1h, registrul de control al întreruperii are adresa A0h.

Biții de registru al măștii de întrerupere corespund numerelor IRQ. Pentru a masca o întrerupere hardware la orice nivel, trebuie să scrieți octetul de mască în registrul de mască. În acest octet, acei biți care corespund întreruperilor mascate ar trebui să fie setați la 1. De exemplu, pentru a masca întreruperile de pe HDD, numărul binar 01000000 trebuie să fie scris pe portul 21h.

Iată o linie de program care maschează o întrerupere de pe o dischetă:

outp(0x21, 0x40);

Pentru a „reanima” întreruperile de pe HDD, utilizați următoarea linie (care va demasca toate întreruperile):

outp(0x21, 0);

Vă rugăm să rețineți că în exemplul de mai sus am mascat întreruperea de pe HDD, toate celelalte dispozitive au continuat să funcționeze normal. Dacă lansăm o comandă de mașină CLI, toate întreruperile hardware ar fi dezactivate. Acest lucru ar duce, de exemplu, la blocarea tastaturii.

Încă o notă privind gestionarea întreruperilor hardware.

Dacă înlocuiți complet handlerul standard de întrerupere hardware, nu uitați să scrieți octetul 20h la adresa portului 20h (A0h pentru al doilea controler 8259) la sfârșitul programului. Acești pași sunt necesari pentru a șterge Registrul de servicii de întrerupere ISR. În acest caz, este permisă procesarea întreruperilor cu o prioritate mai mică decât cea care tocmai a fost procesată.

Dacă gestionați întreruperea 1Ch, atunci adăugarea de mai sus la sfârșitul rutinei de întrerupere nu este necesară, deoarece această întrerupere este software și este apelată de la manipulatorul de întreruperi a temporizatorului hardware.

Înainte de a termina de studiat întreruperile, să ne punem întrebarea: este posibil să mascam o întrerupere nemascabilă? Se dovedește că este posibil!

Desigur, dacă semnalul de întrerupere ajunge la intrarea de întrerupere nemascabilă a procesorului, nu se poate face nimic - întreruperea va avea loc inevitabil. Dar computerul are circuite care blochează intrarea de întrerupere nemascabilă a procesorului NMI.

Pentru un computer IBM PC/XT, mascarea întreruperilor nemascabilă este controlată de portul cu adresa 0A0h. Dacă îi scrieți 0, întreruperea nemascabilă va fi dezactivată, dacă este activată 80h.

În mod similar, pentru IBM PC/AT, mascarea întreruperilor nemascabilă este controlată de bitul 7 al portului 70h. Scrierea octetului 0ADh pe portul 70h va dezactiva întreruperea nemascabilă, iar scrierea octetului 2Dh va activa întreruperea.

Rețineți că nu dezactivăm întreruperile nemascabile „în interiorul” procesorului - acest lucru este imposibil prin definiție „nu permitem” semnalului de întrerupere să intre în intrarea NMI;

Prelegerea nr. 12

Sistem de întrerupere a microprocesoarelor pe 32 de biți i80 x86.

Funcționarea sistemului de întrerupere în mod real

Întrebări

1. Conceptul de întrerupere

2. Clasificarea întreruperii

3. Sistem de întrerupere.

· Hardware

· Întreruperea software-ului sistemului

· Întreruperea tabelului vectorial

4. Gestionarea întreruperii în modul real

Întreruperea înseamnă oprirea temporară a procesului principal de calcul pentru a efectua unele acțiuni planificate sau neplanificate cauzate de funcționarea hardware sau software.

Aceste. Acesta este un proces care comută temporar microprocesorul pentru a executa un alt program și apoi revine la programul întrerupt.

Apăsând o tastă de pe tastatură, inițiem un apel imediat către un program care recunoaște tasta, își scrie codul în bufferul tastaturii, din care este citită de un alt program. Aceste. de ceva timp microprocesorul întrerupe execuția programului curent și trece la programul de procesare a întreruperilor, așa-numitul. O handler de întrerupere. După ce handler-ul de întrerupere își încheie munca, programul întrerupt va continua execuția din punctul în care a fost suspendat.

Adresa programului de gestionare a întreruperilor este calculată din tabelul de vectori de întreruperi.

Mecanismul de întrerupere este suportat la nivel hardware.

Clasificarea întreruperii

În funcție de sursă, întreruperile sunt împărțite în

· hardware- apar ca o reacție a microprocesorului la un semnal fizic de la un dispozitiv (tastatură, ceas de sistem, tastatură, hard disk etc.), timpul de apariție a acestor întreruperi este asincron, adică. apar în momente aleatorii;

· software- sunt apelate artificial folosind comanda corespunzătoare din program ( int ), sunt concepute pentru a efectua unele acțiuni ale sistemului de operare, sunt sincrone;

· exceptii- sunt reactia microprocesorului la o situatie nestandard care a aparut in interiorul microprocesorului in timpul executarii unei comenzi de program (diviziunea la zero, intreruperea prin flag TF (urmă)).

Clasificarea generală a întreruperilor

· extern- cauzate de evenimente externe microprocesorului

(în esență un grup de întreruperi hardware) Nu există întreruperi imbricate!

· intern- apar în interiorul microprocesorului în timpul procesului de calcul (în esență, acestea sunt situații de excepție și întreruperi software).

întreruperi externe rezultă dintr-un semnal de la un dispozitiv extern.

Întreruperile externe sunt împărțite în demascat şi camuflat.

Datorită faptului că printre semnalele de intrare ale procesorului există două semnale externe speciale, cu ajutorul cărora puteți întrerupe execuția programului curent și, prin aceasta, puteți comuta funcționarea procesorului central. Acestea sunt semnalele NMI (fără întrerupere de mască, întrerupere nemascabilă) și INTR (cerere de întrerupere, cerere de întrerupere).

Întreruperi mascate sunt generate de controlerul de întrerupere la solicitarea anumitor dispozitive periferice. Controler de întrerupere (realizat sub forma unui cip special i8259A) acceptă opt niveluri de prioritate (linii); Un dispozitiv periferic este „atașat” la fiecare nivel. Întreruperile mascate sunt adesea numite întreruperi hardware..

În PC-uri, începând cu IBM PC AT, construit pe microprocesorul i80286, sunt utilizate două controlere de întrerupere i8259A; acestea sunt conectate în serie în cascadă, ceea ce crește numărul de surse externe de întrerupere la 15 (fiecare 8).

Vă rugăm să rețineți . Cipul i 8259A este programabil.

Întreruperi nemascabile (se spune că este unul, pentru că este alimentat la ieșirea microprocesorului NMI ) initiaza surse care necesita interventie imediata din partea microprocesorului.

!

În modurile reale și protejate de funcționare a microprocesorului, procesarea întreruperilor se realizează folosind metode fundamental diferite.

Sistem de întrerupere. Întrerupeți hardware-ul și software-ul sistemului

Un sistem de întrerupere este un set de software și hardware care implementează mecanismul de întrerupere.

LA hardware sistemele de întrerupere includ:

· pinii microprocesorului- pe ele sunt generate semnale, notificând microprocesorul fie că un dispozitiv extern „va acorda atenție” ( INTR) , fie că un eveniment necesită procesare imediată, fie o eroare catastrofală(NMI)

INTR - iesire pentru intrare semnal de cerere de întrerupere,

NMI - iesire pentru intrare semnal de întrerupere nemascabil

INTA - iesire pentru zi liberă un semnal de confirmare pentru primirea unui semnal de întrerupere de către microprocesor (acest semnal este trimis la aceeași intrare a cipul de control 8259A;

· controler de întrerupere programabil 8259A (conceput pentru a capta semnale de întrerupere de la opt dispozitive externe diferite;este realizat sub forma unui microcircuit; de obicei folosesc două microcircuite conectate în serie, astfel încât numărul de surse posibile de întreruperi externe este de până la 15 plus o întrerupere nemascabilă; el este cel care generează numărul vectorului de întrerupere și emite magistrala de date a acestuia);

· dispozitive externe (temporizator, tastatură, discuri magnetice etc.)

LA software sisteme de întrerupere Modul real include:

· tabel de vectori de întrerupere .

Ocupă primul kilobyte al OP (adresele 00000 h-003FFh).

Conține adrese (vectori - „vectori”, deoarece două valori pentru specificarea adresei) gestionarilor de întrerupere și constă din 256 (0..255) elemente a câte 4 octeți fiecare:

2 octeți - valoare nouă pentru registru IP

2 octeți - valoare nouă pentru registru CS.

Locația tabelului vector de întrerupere în procesoare i80286 iar mai vechi este determinat de valoarea registrului IDTR.

Tabelul vector de întrerupere este inițializat la pornirea sistemului, dar în principiu poate fi schimbat și mutat.

Fiecare vector are propriul său număr și se numește număr de întrerupere.

· două steaguriîn registrul steagului steaguri/esteaguri:

IF (steagul de întrerupere) - steag de întrerupere. Proiectat pentru a masca (dezactiva) întreruperile hardware. Dacă IF=1 , microprocesorul procesează întreruperile externe, dacă = 0, atunci le ignoră;

TF (Trace Flag) - urmă steag. Dacă este = 1, atunci microprocesorul trece în modul instrucțiuni prin comandă. În acest mod, în microprocesor este generată o întrerupere internă cu numărul 1;

· instrucțiuni ale mașinii cu microprocesor: int, în(întreruperea depășirii), iret, cli, sti

Gestionarea întreruperii în modul real

se realizează în trei etape:

1) încetarea programului curent;

Trebuie să se întâmple în așa fel încât apoi să vă puteți întoarce și să continuați să lucrați. Pentru a face acest lucru, este necesar să salvați conținutul registrelor, deoarece acestea sunt resurse partajate între programe.

Registrele trebuie să fie salvate cs, ip, steaguri (CS:IP pereche conține adresa comenzii cu care să înceapă execuția după returnare, steaguri - starea steagurilor după executarea ultimei instrucțiuni a programului întrerupt).

!!! Aceste registre sunt salvate automat de microprocesor. Păstrarea altor registre trebuie să fie asigurată de programator!!!

Cel mai convenabil loc pentru stocarea registrelor este stiva.

După stocarea registrelor pe stivă, microprocesorul resetează bitul de flag DACĂ (adică=0)(!!! În acest caz, registrul este scris pe stivă steaguri cu încă instalat DACĂ !!!)Acest lucru previne posibilitatea de întreruperi externe imbricate și deteriorarea registrelor programului sursă din cauza acțiunilor necontrolate din partea programului - handler-ul de întreruperi imbricat. După ce acțiunile necesare de salvare a contextului au fost finalizate, handlerul de întreruperi hardware poate activa întreruperi imbricate cu comanda sti.

2) trecerea la execuția și execuția programului de serviciu de întrerupere;

Aici se determină sursa întreruperii și este apelat gestionarea întreruperii corespunzător.

În modul real al microprocesorului, sunt permise 256 de surse - în funcție de numărul de elemente din tabelul vector de întrerupere.

Structura elementului:

· 2 octeți - valoarea offset a începutului programului de gestionare a întreruperilor de la începutul segmentului de cod

· 2 octeți - valoarea adresei de bază a segmentului în care se află programul handler.

Cum se determină adresa unde se află numărul vectorului de întrerupere N?

offset al tabelului vector de întrerupere = N*4

Dimensiune completă a mesei?4*256=1024

Deci, la a doua etapă microprocesorul

1. După numărul sursei de întrerupere, determină offset-ul în tabelul de vectori de întrerupere

2. Plasează primii doi octeți într-un registru IP

3. Plasează cei doi doi octeți într-un registru C.S.

4. Transferă controlul către adresă CS:IP

(De asemenea, poate fi întrerupt de o solicitare de la o sursă cu prioritate mai mare. Toate sursele de întrerupere au priorități.)

3) readuce controlul programului întrerupt.

Este necesar să readuceți stiva la starea în care se afla imediat după transferul controlului la această procedură. Pentru a face acest lucru, programatorul trebuie să specifice acțiunile necesare pentru a restabili registrele și a șterge stiva. !! Această secțiune trebuie protejată de posibila corupere a conținutului registrului (ca urmare a unei întreruperi hardware) folosind comanda cli.

Ultimele comenzi din manipulatorul de întreruperi sunt sti, iret

sti - activați întreruperile hardware (setează steag IF=1 , nu are operanzi).

iret - scoateți trei cuvinte secvențial din stivă și plasați-le în registre corespunzător ip, cs, steaguri.

În timp ce computerul execută un program curent în interiorul mașinii și în mediul extern asociat acestuia (de exemplu, într-un proces tehnologic controlat de computer), pot apărea evenimente care necesită un răspuns imediat la acestea din partea mașinii.

Răspunsul este că mașina întrerupe procesarea programului curent și trece la executarea unui alt program special conceput pentru acest eveniment. La finalizarea acestui program, computerul revine la executarea programului întrerupt.

Procesul în cauză se numește întrerupere de program. Este esențial important ca momentele de apariție a evenimentelor care necesită întreruperea programelor să fie necunoscute în prealabil și, prin urmare, să nu poată fi luate în considerare la programare.

Fiecare eveniment care necesită o întrerupere este însoțit de un semnal care anunță computerul - solicitări de întrerupere. Programul solicitat de o cerere de întrerupere se numește program de întrerupere, spre deosebire de programul întrerupt care era executat de mașină înainte de apariția cererii.

Capacitatea de a întrerupe programe este o proprietate arhitecturală importantă a unui computer, care face posibilă utilizarea eficientă a performanței procesorului în prezența mai multor procese care au loc în paralel în timp, necesitând control și întreținere de la procesor în momente arbitrare. În primul rând, acest lucru se aplică organizării funcționării în paralel a procesorului și a dispozitivelor periferice ale mașinii, precum și utilizării computerelor pentru controlul în timp real al proceselor tehnologice.

Pentru ca un computer să poată, fără a necesita prea mult efort din partea programatorului, să implementeze întreruperi de program la viteză mare, mașina trebuie să fie echipată cu hardware și software adecvat, a căror combinație se numește sistem de întrerupere a programului.

Principalele funcții ale sistemului de întrerupere sunt:

    memorarea stării programului întrerupt și trecerea la programul întrerupt

    restabilirea stării unui program întrerupt și revenirea la acesta.

Vectorul de întrerupere este vectorul „starii inițiale a programului de întrerupere”. Vectorul de întrerupere conține toate informațiile necesare pentru a sări la programul de întrerupere, inclusiv adresa de pornire. Fiecare cerere de întrerupere (număr) are propriul său vector de întrerupere, care poate iniția execuția programului de întrerupere corespunzător. Vectorii de întrerupere sunt localizați în celule de memorie fixă ​​special alocate - tabelul de vectori de întrerupere.

Locul principal în procedura de tranziție la un program de întrerupere este ocupat de procedura de transfer din registrul (registrele) corespunzător al procesorului în memorie (în special, în stivă) pentru a salva vectorul de stare curent al programului întrerupt ( astfel încât să puteți reveni la execuția acestuia) și încărcarea în registrul (registrele) procesorului vectorului de întrerupere al programului de întrerupere, căruia i se transferă controlul procesorului.

Clasificarea întreruperii

Solicitările de întrerupere pot apărea în interiorul computerului însuși și al acestuia mediu extern. Primele includ, de exemplu, solicitări când astfel de evenimente apar într-un computer, cum ar fi apariția unei erori în funcționarea echipamentului său, depășirea grilei de biți, o încercare de împărțire la 0, ieșirea din zona de memorie setată pentru un program dat, o solicitare de către un dispozitiv periferic pentru o operație de intrare-ieșire, finalizarea unei operațiuni de intrare/ieșire de către un dispozitiv periferic sau apariția unei situații speciale în timpul acestei operațiuni etc. Deși unele dintre aceste evenimente sunt generate de programul în sine, momentele apariției lor, de regulă, nu pot fi prevăzute. Cererile din mediul extern pot apărea de la alte computere, de la urgențe și alți senzori de proces etc.

Familia de microprocesoare Intel 80x86 acceptă 256 de niveluri de întreruperi prioritare declanșate de trei tipuri de evenimente:

    întreruperi hardware interne

    întreruperi hardware externe

    întreruperi software

Întreruperi hardware interne, numite uneori defecțiuni, sunt generate de anumite evenimente care apar în timpul execuției programului, cum ar fi o încercare de împărțire la 0. Atribuirea anumitor numere de întrerupere unor astfel de evenimente este conectată la procesor și nu poate fi modificată.

Întreruperi hardware externe inițiat de controlere periferice sau coprocesoare (de exemplu, 8087/80287). Sursele de întrerupere sunt conectate fie la pinul de întrerupere non-maskable (NMI) al procesorului, fie la pinul de întrerupere mascat (INTR) al procesorului. Linia NMI este de obicei dedicată întreruperilor cauzate de evenimente catastrofale, cum ar fi erorile de paritate a memoriei sau pană de curent.

Software-ul se întrerupe. Orice program poate iniția o întrerupere software sincronă prin executarea unei comenzi int. MS-DOS utilizează întreruperi de la 20H la 3FH pentru a interacționa cu modulele și programele de aplicație (de exemplu, managerul de funcții MS-DOS este accesat prin executarea comenzii int 21h). Programele BIOS stocate în ROM și programele de aplicație IBM PC folosesc diferite întreruperi, cu numere mai mari sau mai mici. Această distribuție a numerelor de întrerupere este condiționată și nu este fixată în hardware în niciun fel.

Întreruperea tabelului vectorial

Pentru a asocia adresa handler-ului de întrerupere cu numărul de întrerupere se utilizează un tabel de vectori de întrerupere, care ocupă primul kilobyte de RAM. Acest tabel se află în intervalul de adrese de la 0000:0000 la 0000:03FFh și constă din 256 de elemente - adrese departe ale manipulatorilor de întreruperi.

Intrările din tabelul vector de întrerupere se numesc vectori de întrerupere. Primul cuvânt al elementului de tabel conține componenta offset, iar al doilea cuvânt conține componenta de segment a adresei de gestionare a întreruperilor.

Vectorul de întrerupere numărul 0 se află la adresa 0000:0000, numărul 1 se află la adresa 0000:0004 etc. În general, adresa vectorului de întrerupere se găsește prin înmulțirea numărului de întrerupere cu 4.

Inițializarea tabelului este efectuată parțial de sistemul de intrare/ieșire BIOS după testarea hardware-ului și înainte ca sistemul de operare să înceapă să se încarce și parțial la încărcarea MS-DOS. Sistemul de operare MS-DOS poate modifica unii vectori de întrerupere setați de BIOS.

Întreruperea tabelului vectorial

Număr

Descriere

Eroare de divizare. Apelat automat după ce comenzile DIV sau IDIV sunt executate dacă diviziunea duce la depășire (de exemplu, împărțirea cu 0). De obicei, atunci când gestionează această întrerupere, MS-DOS afișează un mesaj de eroare și oprește execuția programului. În acest caz, pentru procesorul i8086, adresa de retur indică către comanda care urmează comenzii de divizare, iar pentru procesorul i80286 și modelele ulterioare - către primul octet al comenzii care a provocat întreruperea

Întrerupeți modul pas. Produs după execuția fiecărei instrucțiuni de mașină, dacă bitul de urmărire pas cu pas TF este setat în cuvântul flag. Folosit pentru programe de depanare. Această întrerupere nu este generată după ce datele sunt trimise la registrele de segment folosind instrucțiunile MOV și POP.

Întreruperea hardware nemascabilă. Această întrerupere poate fi utilizată diferit pe diferite mașini. De obicei, este generat atunci când există o eroare de paritate în RAM și când este solicitată o întrerupere de la coprocesor

Întreruperea pentru urmărire. Generat la executarea unei comenzi de mașină de un octet cu codul CCh și este folosit în mod obișnuit de către depanatori pentru a seta un punct de întrerupere

Debordare. Generat de instrucțiunea mașină INTO dacă este setat pavilionul de overflow OF. Dacă flag-ul nu este setat, instrucțiunea INTO este executată ca NOP. Această întrerupere este folosită pentru a gestiona erorile la efectuarea operațiilor aritmetice

Imprimați o copie a ecranului. Generat dacă utilizatorul a apăsat o tastă În programele MS-DOS este de obicei folosit pentru a imprima o imagine de ecran. Pentru procesorul i80286 și modelele mai vechi, acesta este generat la executarea comenzii mașinii BOUND dacă valoarea verificată este în afara intervalului specificat

Opcode nedefinit sau lungime de comandă mai mare de 10 octeți

Caz special de lipsă a coprocesorului aritmetic

IRQ0 – întreruperea temporizatorului de interval, are loc de 18,2 ori pe secundă

IRQ1 – întrerupere de la tastatură. Generat atunci când utilizatorul apasă și eliberează tastele. Folosit pentru a citi date de la tastatură

IRQ2 – folosit pentru întreruperi hardware în cascadă

IRQ3 – întreruperea portului asincron COM2

IRQ4 – întreruperea portului asincron COM1

IRQ5 – întrerupere de la controlerul de hard disk (numai pentru computerele IBM PC/XT)

IRQ6 – întrerupere generată de controlerul HDD după finalizarea operațiunii I/O

IRQ7 – întrerupere de la adaptorul paralel.

Generat atunci când imprimanta conectată la adaptor este pregătită pentru a efectua o altă operație. Nu este folosit de obicei

Întreținere adaptor video

Definirea configurației dispozitivelor din sistem

Determinarea dimensiunii RAM

Întreținerea sistemului de discuri

Lucrul cu un adaptor serial asincron

Serviciu extins

Întreținerea tastaturii

Întreținere imprimante

Rulează BASIC în ROM, dacă este disponibil

Serviciu de ceasuri

Întreruperea software, apelată de 18,2 ori pe secundă de către handlerul de întrerupere a temporizatorului hardware

Adresa tabelului video pentru controlerul adaptorului video 6845

Indicator către tabelul de parametri de dischetă

Indicator către un tabel grafic pentru caractere cu coduri ASCII 128-255

Folosit de MS-DOS sau rezervat pentru MS-DOS

Întreruperi rezervate programelor utilizator

Nu este folosit

IRQ8 – întrerupere a ceasului în timp real

IRQ9 – întrerupere de la controlerul EGA

IRQ10 – rezervat

IRQ11 – rezervat

IRQ12 – rezervat

IRQ13 – întrerupere de la coprocesorul aritmetic

IRQ14 – întrerupere de la controlerul de hard disk

IRQ15 – rezervat

Nu este folosit

Rezervat pentru BASIC

Folosit de interpretul BASIC

Nu este folosit

Întreruperile desemnate ca IRQ0 – IRQ15 sunt hardware extern.

Publicații pe această temă