Sistem de întrerupere

Întrerupere - suspendarea funcționării unui program și transferul controlului către altul atunci când are loc un anumit eveniment independent de acestea. În același timp, este posibilă revenirea controlului asupra programului întrerupt, fără a pierde capacitatea sa operațională.







Lucrul cu sistemul de întrerupere poate fi văzut din două perspective:

Lucrul cu vectori de întrerupere;

NOTĂ: Încă o dată, se subliniază faptul că acesta este în primul rând un mod real. Încercarea de a "încerca" în oricare altul poate avea consecințe imprevizibile.

Tabelul descriptor de întrerupere a modului protejat este disponibil numai de la inelul de protecție zero, îl puteți crea sau schimba dacă treceți la modul protejat!

Când lucrați în modul V86, este posibil să modificați imaginea tabelului de întrerupere, dar consecințele sunt determinate de capacitățile monitorului virtual!

Lucrul cu vectorii de întrerupere.

Necesitatea de a lucra cu tabela de întrerupere poate apărea în următoarele cazuri:

Ca o întrerupere, puteți apela unul dintre rutine. Deși întreruperile de apel subrutina necesită mai mult timp CPU, această abordare este justificată în cazul în care este necesar să se rupă principiul ierarhiei de software într-un singur modul, sau în cazul în care procedura este folosit de multe dintre programele dvs. (puteți lăsa reședința după finalizarea programului de configurare a sistemului).

Al doilea motiv pentru scrierea unei întreruperi poate fi utilizarea unei întreruperi hardware separate. Această întrerupere este declanșată automat când apar anumite condiții.
În mod obișnuit, BIOS inițializează vectorii de întrerupere neutilizate, astfel încât să indice o procedură care nu face deloc nimic (conține un IRET). Puteți să scrieți propria procedură și să modificați vectorul de întrerupere astfel încât să se îndrepte spre el. Apoi, dacă apare o întrerupere hardware, procedura dvs. va fi executată.

Este posibil să înlocuiți o întrerupere existentă cu cea proprie. O astfel de întrerupere este întreruperea timpului de zi, care se numește automat de 18,2 ori pe secundă. De obicei, această întrerupere actualizează numai ceasul, dar îl puteți utiliza pentru a sincroniza evenimentele din programul dvs. Alte posibilități sunt scrierea unei proceduri de procesare Ctrl-Break dacă programul dvs. trebuie să efectueze anumite acțiuni specifice înainte de finalizarea acestuia.

În cele din urmă, poate doriți să scrieți o întrerupere care completează una dintre procedurile sistemului de operare. În acest caz, după efectuarea acțiunilor necesare, este necesar să se transfere controlul la rutina inițială a serviciului de întreruperi (o tranziție "lungă" necondiționată sau o întrerupere suplimentară). Această tehnică poate fi necesară atunci când se scriu programe rezidențiale care primesc control atunci când o anumită comandă este recepționată de la tastatură.

Tabelul de vectori de întrerupere are 1Kbytes de memorie în intervalul 00000h - 00400h. Fiecărui vector îi sunt alocate patru octeți în tabel și li se atribuie un număr de la 00h la FFh. Când sistemul este inițializat, vectorii sunt reglați la subrutinele situate în ROM BIOS sau DOS.

PUSH DS; salvați DS

MOV DX, ROUTE OFFSET; offset pentru procedura din DX

MOV AX, SEG ROUT, segment de procedură

MOV DS, AX, pus în DS

MOV AH, 25H, funcția de setare vectorială

MOV AL, 60H, număr vectorial

INT 21H; modificați întreruperea

POP DS; restaurați DS

Controlerul HDD din AT, XT286, PS50 +

8259 are trei registre de un singur octet care controlează opt linii de întreruperi hardware. Registrul cererii de întrerupere (IRR) stabilește bitul corespunzător atunci când linia de întrerupere semnalează cererea. Apoi, cipul verifică automat dacă este procesată o altă întrerupere. Procedând astfel, solicită informații de la Registry Service (ISR). Un lanț suplimentar este responsabil pentru schema de priorități. În cele din urmă, înainte de a apela întreruperea, se verifică registrul de mască de întrerupere (IMR) pentru a vedea dacă în prezent este permisă întreruperea acestui nivel.

Înainte de operare, controlerul trebuie inițializat. Inițializarea se realizează prin încărcarea cuvintelor de control (până la 4 octeți). După inițializare, controlerul intră în modul de funcționare.







Când controlerul de întrerupere pentru i8085 a fost proiectat în circuitul său, s-au făcut erori, prin urmare, la proiectarea unui controler pentru i8086 (chip 8259A), a fost posibil să se lucreze cu acesta în sistemele bazate pe i8085. Setarea va fi luată în considerare numai pentru sistemele i8086.

Portul 20h este cuvântul de control de inițializare ICW1:

bit 0 1 patru cuvinte de inițializare (cuvântul ICW4 definește relația dintre controalele principale și slave);

bit 1 1, un controler este utilizat în sistem;

bit 2 0 vector 8-byte,

1 vector 4 octeți;

bit 3 0 fixare de întrerupere "în față" (în PC și AT),

1 fixare de întrerupere "la nivel" (în PS / 2);

bitul 4 este 1 - ICW1;

biții 7..5 sunt zero (pentru i8086).

Portul 21h este cuvântul de control de inițializare ICW2:

biții 2..0 sunt zero (pentru i8086);

biți 7..3 cea mai mare parte a numărului vectorului de întrerupere (pentru i8086).

Portul 21h este cuvântul de control pentru inițializarea ICW3 pentru maestru:

biții 7..0 1 marchează liniile la care sunt conectate controlorii slave;

Portul 21h este cuvântul de control de inițializare ICW3 pentru slave:

biți 2..0 numărul liniei controlerului principal la care este conectat acest controler,

biții 7 ... 3 sunt egali cu zero;

Portul 21h este cuvântul de control de inițializare ICW4

bit 0 1 (pentru i8086);

bit 1 0 terminarea comenzii de întrerupere,

1 detectare automată a sfârșitului întreruperii;

biti 3..2 mod buffering:

0 sau 1 tamponare nu este utilizat,

2 modul de tamponare subordonat,

3 modul de tampon de conducere;

bit 4 0 în serie,

1 mod special imbricat complet.

biții 7..5 sunt egali cu zero.

NOTĂ: Cuvintele de control de inițializare sunt încărcate secvențial după transmiterea ICW1.

Controlarea operațiunilor controlerului.

Comenzile de control al operațiunii pot fi trimise controlerului după inițializare în orice moment.

Portul 21h - Registrul de mască de întrerupere OCW1 (IMR)

biți 7..0 0 serviciu de întrerupere,

1 mascarea întreruperii;

Port 20h - Registrul de instrucțiuni de întrerupere OCW2 (ICR)

biții 2..0 determină numărul de biți din registrul curent de întreținere (ISR),

biții 4..3 sunt zero (definiți OCW2),

bit 5 1 întrerupere întrerupere;

bit 6 1 ștergerea bitului ISR ​​specificat;

bit 7 1 schimbare ciclică a priorităților.

Port 20h - cuvânt de operare OCW3

biți 1..0 citirea registrului:

0 sau 1 nu se citesc,

bit 2 1 Instrucțiune pentru a forma o stare-cuvânt (conține numărul celei mai mari cereri din partea primită);

biții 4..3 01 caracteristice OCW3;

biți 6..5 mascare specială:

0 sau 1 este absent,

3 seturi (în acest caz, prioritățile cererilor sunt egalizate);

bit 7 este zero.

Dezactivați / activați întreruperile hardware individuale.

Programele pe un asbler pot preveni întreruperile hardware. Acestea sunt întreruperi mascate; Alte întreruperi hardware care apar cu unele erori (cum ar fi împărțirea la zero) nu pot fi mascate.

Există două motive pentru interzicerea întreruperilor hardware.

În primul caz, toate întreruperile sunt blocate astfel încât partea critică a codului să fie executată în întregime înainte ca mașina să efectueze orice altă acțiune. De exemplu, întreruperile sunt dezactivate atunci când vectorul de întrerupere hardware este schimbat, evitând întreruperile atunci când vectorul este schimbat doar la jumătate.

În al doilea caz, numai anumite întreruperi hardware sunt mascate. Acest lucru se întâmplă atunci când anumite întreruperi specifice pot interacționa cu operații care sunt critice de timp. De exemplu, o procedură I / O precisă temporizată nu-și permite să fie întreruptă de o întrerupere de lungă durată a discului.

Execuția întreruperilor depinde de valoarea semnului de întrerupere (bitul 9) din registrul de steaguri. Când acest bit este 0, sunt permise toate întreruperile pe care masca le rezolvă. Când este 1, toate întreruperile hardware sunt dezactivate. Pentru a preveni întreruperile prin setarea acestui semnalizator la 1, utilizați instrucțiunea CLI. Pentru a șterge acest steguleț și a restabili întrerupe, utilizați instrucțiunea STI. Evitați dezactivarea întreruperilor pentru o perioadă lungă de timp. Întreruperea din timpul zilei are loc de 18,2 ori pe secundă și dacă au existat mai multe solicitări la întreruperea respectivă în momentul în care întreruperile hardware au fost interzise, ​​cererile inutile vor fi eliminate și timpul sistemului va fi determinat incorect.

Aparatul dezactivează automat întreruperile hardware atunci când apelează întreruperile software și le rezolvă automat atunci când se întorc. Când scrieți întreruperile software-ului, puteți porni programul cu o instrucțiune STI dacă puteți permite întreruperi hardware. Cu toate acestea, în cazul în care instrucțiunea CLI nu urmează STI, aceasta va face ca mașina să se oprească, deoarece intrarea tastaturii va fi înghețată.

Următorul exemplu blochează o întrerupere a unui disc. Nu uitați să ștergeți registrul la sfârșitul programului, altfel accesul la discuri va fi interzis chiar și după finalizarea programului.

; - mascarea celui de-al 6-lea registru al măștii de întrerupere

MOV AL, 01000000B; biți de mască 6

OUT 21H, AL; trimitere către registrul de mască de întrerupere

OUT 21H, AL; eliminați IMR la sfârșitul programului

La sfârșitul codului pentru fiecare dintre întreruperile hardware, trebuie să includeți următoarele 2 linii de cod:

Dacă întreruperea hardware nu se termină cu aceste linii, cipul 8259 nu va șterge informațiile din registrul de servicii, astfel încât să se permită manipularea întreruperii cu niveluri mai mici decât cele procesate. Absența acestor linii poate duce cu ușurință la accident de program, deoarece întreruperile de la tastatură pot fi înghețate și chiar Ctrl-Alt-Del vor fi inutile. Acest aditiv nu este necesar pentru acele vectori de întrerupere care sunt extensii ale întreruperilor existente.







Articole similare

Trimiteți-le prietenilor: