Sispemul de intreruperi la microprocesoare

58
SISTEME DE ÎNTRERUPERI CUPRINS CAPITOLUL 1. GENERALITǍŢI 1.1. Microprocesoare Pentium IV………………....................................1 CAPITOLUL 2. PRELUCRAREA ÎNTRERUPERILOR 2.1. Conceptul de întrerupere………………………………………..….4 2.2. Întreruperi la PC- uri…………………...................................………6 2.3. Clase de întreruperi la PC-uri……………... ……………….....…….7 2.4. Atribuirea întreruperilor şi prioritǎţii……………………...………..9 CAPITOLUL 3. MICROPROCESOARE, MICROCONTROLERE 3.1. Transferul prin întreruperi…………………………………...…....10 3.2. Sistemul de întreruperi cu vectorizare software…………...……....11 3.3. Sistemul de întreruperi cu vectorizare hardware…………...……...14 3.4. Întreruperi mascabile şi namascabile………………………….......17 3.5. Stabilitatea vectorului de 8 biţi…………………………..….…….19 3.6. Întreruperea rutinelor de întrerupere1…………….…………..…...20 CAPITOLUL 4. SURSE DE ÎNTRERUPERI 4.1. Întreruperi externe…………………………………...…………… 22 HARAPCEA DENIS CRISTIAN 1

description

ATESTAT

Transcript of Sispemul de intreruperi la microprocesoare

SISTEME DE ÎNTRERUPERI

CUPRINS

CAPITOLUL 1. GENERALITǍŢI 1.1. Microprocesoare Pentium IV………………....................................1

CAPITOLUL 2. PRELUCRAREA ÎNTRERUPERILOR 2.1. Conceptul de întrerupere………………………………………..….4 2.2. Întreruperi la PC-uri…………………...................................………6 2.3. Clase de întreruperi la PC-uri……………...……………….....…….7 2.4. Atribuirea întreruperilor şi prioritǎţii……………………...………..9

CAPITOLUL 3. MICROPROCESOARE, MICROCONTROLERE 3.1. Transferul prin întreruperi…………………………………...…....10 3.2. Sistemul de întreruperi cu vectorizare software…………...……....11 3.3. Sistemul de întreruperi cu vectorizare hardware…………...……...14 3.4. Întreruperi mascabile şi namascabile………………………….......17 3.5. Stabilitatea vectorului de 8 biţi…………………………..….…….19 3.6. Întreruperea rutinelor de întrerupere1…………….…………..…...20

CAPITOLUL 4. SURSE DE ÎNTRERUPERI 4.1. Întreruperi externe…………………………………...……………22 4.2. Întreruperi de la timere………………………………..…………...23 4.3. Întreruperi de la portul seria…………………………..…………...23 4.4. Activarea întreruperilor……………………………..……………..23 4.5. Nivele de prioritate…………………………………..…………….24

CAPITOLUL 5. COMUNICAŢIA CU HARDWARE-UL ÎN LINUX 5.1. Alocarea porturilor I/O………………………………………..…...26 5.2. Operaţii de scriere şi citire a porturilor I/O……………..…………27 5.3. Întreruperi în Linux. Obţinerea unei întreruperi…………..……….28 5.4. Implementarea rutinei de tratare a întreruperi…………..…………30 5.5. Locking…………………………………………………..………...31

CAPITOLUL 6. TRATAREA ÎNTRERUPERILOR DE CEAS 6.1. Întreruperea de ceas standard……………………………..……….33 6.2. Tratarea întreruperilor de ceas în executiv………………..……….33 6.3. Iniţializarea vectorilor de întrerupere…………………..………….34

BIBLIOGRAFIE.....................................................................................35

HARAPCEA DENIS CRISTIAN 1

SISTEME DE ÎNTRERUPERI

CAPITOLUL IGENERALITĂŢI

Capitolul 1.1.Microprocesoare Pentium IV Pentium IV cunoscut şi sub numele de cod Willamette, este cel mai nou model al familiei de microprocesoare Intel pe 32 de biţi care lucrează la frecvenţe mai mari şi înregistrează permormanţe superioare faţă de modelele precedente. Noua microarhitectură a acestor procesoare a fost denumită de către Intel, NetBurst, în spatele acestei tehnologii aflându-se următoarele noi facilităţi:

Bus-ul sistemului la 400MHz – utilizând noua tehnologie ‚quad pumped’ cu o lăţime a magistralei de 64 biţi şi ceas de 100MHz, se ajunge la o rată de transfer între procesor şi memorie de 3200 MB/s, de 3 ori mai mare ca cea a procesoarelor Pentium III. Pentium III putea transfera doar 1.06G la o frecvenţă de 133MHz. Pentium IV lucrează prin intermediul a două canale de transmisie cu RDRAM, la o viteză de 3.2G/s.

Advanced Transfer Cache – se concretizează în mărirea ratei de transfer a datelor între memoria cache L2 şi nucleul procesorului. Dimensiunea memoriei cache L2 este de 256KB. La schimbul de date cu sistemul (memorie, AGP, PCI) se folosesc blocuri de 64 bytes, ceea ce asigură o performanţă mare pentru transferurile în rafală, iar conexiunea cu nucleul se face prin intermediul unei interfeţe de 256 biţi, care poate transfera date la frecvenţa procesorului. Se obţine o lărgime de bandă de 44.8GB/s pentru un Pentium IV la1.4GHz, aproximativ de 3 ori mai mult ca un Pentium III la1GHz.

Advanced Dynamic Execution – optimizări ale arhitecturii de prelucrare şi stocare temporară a instrucţiunilor – mod speculativ şi arbitrar de execuţie care împiedică procesorul să aibă stări de stagnare când instrucţiunile aşteaptă rezolvarea dependentelor, cum ar fi de exemplu încărcarea de date în memorie. Pot fi rulate astfel până la126 de instrucţiuni în curs de rulare, faţă de 42 în cazul microarhitecturii Pentium III. Execution Trace Cache – în cazul procesorului Pentium IV nivelul 1 de cache pentru instrucţiuni este poziţionat după unitatea de decodare. În acest caz nu mai este necesară redecodarea instrucţiunilor

HARAPCEA DENIS CRISTIAN 2

SISTEME DE ÎNTRERUPERI

repetitive odată ce ele se află în acest cache, în plus sunt mai uşor de dedus dependentele în procesul de predicţie. Poate conţine până la 12000 de microinstrucţiuni (comparativ este de 6 ori mai mare ca nivelul L1 de cache al unui PentiumIII ) şi oferă spre execuţie 3 microinstrucţiuni la frecvenţa microprocesorului. Trace Cache-ul este un cache de instrucţiuni care încearcă să înregistreze instrucţiunile în ordinea lor de execuţie, ceea ce simplifică procesarea, asigurându-se că instrucţiunile sunt în ordinea corectă.Un nou algoritm de predicţie a instrucţiunilor, Enhancced Branch Prediction, cu un buffer în care se pot stoca 4096 de alternative, de 8 ori mai multe ca la un Pentium III, eliminându-se astfel 33% din predicţiile greşite în cazul procesorului menţionat anterior.Unitatea de execuţie rapidă asigură un nr mai mare de instrucţiuni –126, dintre care unităţile de execuţie pot alege; acest lucru permite microprocesorului să evite aşteptările care apar atunci când o instrucţiune foloseşte datele furnizate de o altă instrucţiune. Unitatea aduce şi o mai mare acurateţe în predicţia salturilor (ranch prediction), rata de predicţie greşită fiind cu 33% mai mică. Acurateţea este posibilă datorită implementării unui buffer de 4K ce stochează mai multe detalii despre ramurile accesate anterior, dar şi datorită unui nou algoritm de predicţie.

Hiper Pipelined Technology – dublarea faţă de arhitectura PentiumIII a numărului de stadii pe care le parcurge o instrucţiune între momentul intrării în execuţie şi obţinerea rezultatelor. Se obţine o creştere de performanţă, dar avantajul principal este scalabilitatea în frecvenţă, procesoarele PentiumIV putând funcţiona la frecvenţe mult mai mari decât cele ale procesoarelor cu arhitecturi curente. Astfel, cu introducerea unei linii de asamblare în 20 de etape, Intel a reuşit să facă procesorul să meargă la viteze foarte mari. În cazul unei instrucţiuni plasată pe o linie de asamblare în 10 etape, în timpul fiecărui impuls de ceas, o zecime este prelucrată şi este nevoie de 10 cicluri de ceas pentru a termina. Deci, unei benzi de asamblare de la PentiumIV îi trebuie 20 de cicluri de ceas pt a termina o instrucţiune, în fiecare etapă prelucrarea fiind destul de redusă ceea ce diminuează durata dintre 2 impulsuri de tact. Numărul total de cicluri necesare procesării unei instrucţiuni se numeşte timp de latenţă. O linie de asamblare mai lungă înseamnă timp de latenţă mai mare.

Rapid Execution Engine – combinând inovaţii ale arhitecturii interne şi proiectării fizice ale circuitelor, s-a reuşit ca cele 4 unităţi logice

HARAPCEA DENIS CRISTIAN 3

SISTEME DE ÎNTRERUPERI

aritmetice simple (ALU) care execută microinstrucţiunile simple, să ruleze la de 2 ori frecvenţa procesorului. Se încarcă astfel 2 microinstrucţiuni la fiecare ceas procesor rezultând o durată totală de execuţie a unei instrucţiuni mult mai mică. Operaţiile cu întregi sunt procesate de către unităţile de execuţie pt întregi. În mod normal, o unitate procesează o instrucţiune numai în partea crescătoare a impulsului de tact, dar Pentium IV poate procesa şi în partea descrescătoare a acestui impuls, reuşind astfel să dubleze viteza de lucru pentru anumite operaţii cu întregi.

Streaming SIMD Extensions2 (SSE2) – extind capabilităţile MMX şi SSE de la generaţiile anterioare de procesoare cu 144 de noi instrucţiuni (SSE2) care pot opera cu pachete de date de 128 biţi, numere întregi sau în virgulă mobilă cu dublă precizie. Aceste noi instrucţiuni reduc timpul necesar executării programelor optimizate pentru ele. Ele accelerează în special aplicaţiile vide, audio, procesările de imagini, aplicaţiile tehnice şi ştiinţifice. SSE2 înseamnă 76 de noi instrucţiuni SIMD, aî există în total 144de instrucţiuni pentru mărirea performanţei lucrului în virgulă mobilă şi a aplicaţiilor multimedia. Setul de instrucţiuni este destinat atât pentru întregi pe 128 biţi cât şi pt nr în virgulă mobilă dublă precizie, tot pe 128 biţi. Datorită noilor instrucţiuni programatorul are o mobilitate mai mare deoarece acestea permit calculelor de tip SIMD să fie efectuate în virgulă mobilă cât şi pe întregi împachetaţi în registrele MMX. Prezentând o arhitectură cu totul nouă, Pentium IV este destinat aplicaţiilor multimedia şi Internet, cum ar fi editare video, encodare şi încărcare de materiale în format video pe Internet, encodare MP3 şi aplicaţii de vizualizare 3D. Pentru a rula astfel de programe, noua arhitectură a procesorului Pentium IV (NetBurst) conţine o magistrală de date la400 MHz, noi tehnologii de realizare a memoriei cache şi a canalului de date, alături de un set îmbunătăţit de instrucţiuni interne şi un coprocesor matematic optimizat pentru aplicaţii multimedia. Modificările de arhitectură care au dus la îmbunătăţirea performanţelor obţinute în aplicaţiile de tip Internet (viteza superioară, canal de comunicaţie mai mare, set nou de instrucţiuni SSE2, dimensiune redusă a memoriei cache, magistrala de date mărită) nu se dovedesc la fel de benefice în cazul aplicaţiilor uzuale. Astfel de programe obişnuiesc să depună mari cantităţi de date în memoria cache şi în plus, mărirea magistralei de memorie la 3.2 GB pe secundă nu este atât de semnificativă pt aplicaţiile de birou, acestea accesând de foarte multe ori memoria cache şi nu memoria principală.

HARAPCEA DENIS CRISTIAN 4

SISTEME DE ÎNTRERUPERI

Pe măsură ce dispozitivele microelectronice devin mai integrate, cu funcţii mărite şi niveluri de performanţă mai ridicate, complexitatea soluţiilor de împachetare creşte proporţional.

HARAPCEA DENIS CRISTIAN 5

SISTEME DE ÎNTRERUPERI

CAPITOLUL IIPRELUCRAREA ÎNTRERUPERILOR

Capitolul 2.1.Conceptul de întrerupere În cadrul procesului de execuţie al unui program CPU trebuie să asigure următoarele funcţii:- evidenţierea stării în care se află şi asigurarea unui mecanism de schimbarea stării;- asigurarea înlănţuirii automate a instrucţiunilor;- asigurarea comenzilor necesare execuţiei unei instrucţiuni.În ceea ce priveşte schimbarea stării CPU, aceasta se poate realiza prin:- memorarea dinamică a informaţiei de stare, în cuvântul de stare al procesorului (MSW -Machine Status Word);- sistemul de întreruperi. CPU se poate afla în una din următoarele stări:- operaţională- atunci când poate executa operaţii de prelucrare a datelor;- neoperaţională- care corespunde unei situaţii de defect. Starea operaţională se caracterizează prin una din următoarele stări generate de procese:- activă sau în aşteptare;- întreruptibilă sau neîntreruptibilă, funcţie de luarea în considerare a întreruperii sau nu (se spune că întreruperea este mascată);- sistem sau utilizator, după cum este sub controlul sistemului de operare sau al programelorde aplicaţie lansate de utilizatori. Informaţia de stare este dinamică şi reflectă în orice moment funcţionarea, CPU fiind memorată într-un registru de stare sub denumirea de cuvânt de stare program MSW (Machine Status Word), conţinând în general, următoarele informaţii:- dreptul de acces al programului la zona respectivă de memorie;- o informaţie sintetică asupra modului cum s-a încheiat execuţia instrucţiunii precedente, numită cod de condiţie (registrul Eflags la microprocesoarele Intel);

HARAPCEA DENIS CRISTIAN 6

SISTEME DE ÎNTRERUPERI

- măştile de întreruperi;- starea CPU;- nivelul de prioritate al programului;- adresa următoarei instrucţiuni de executat (registrul EIP - Extended Instruction Pointer la microprocesoarele Intel). Posibilitatea comutării stării CPU se realizează prin procese de întrerupere care (de exemplu,în cazul multiprogramării) este o condiţie indispensabilă în sensul asigurării trecerii controlului de la un program la altul. Prelucrarea întreruperilor este realizată de o componentă hardware specializată inclusă în CPU şi o componentă software (ce dispune de rutine incluse în sistemul de operare pentru a trata fiecare întrerupere în parte). Etapele tratării unei întreruperi:

- în momentul apariţiei unei cereri de întreruperi, aceasta se va lua în considerare dacă este cea mai prioritară din şirul de întreruperi;

HARAPCEA DENIS CRISTIAN 7

SISTEME DE ÎNTRERUPERI

- analiza tipului de întrerupere şi salvarea cuvântului de stare al programului la o anumită adresă din memoria internă;- încărcarea unui cuvânt de stare al programului specific întreruperii şi lansarea în execuţie a rutinei ce prelucrează întreruperea;- reîncărcarea vechiului cuvânt de stare al programului de la adresa unde a fost salvat în memoria internă, după terminarea prelucrării întreruperii;- redarea controlului programului întrerupt. Întreruperile pot fi generate: de program, de operaţiile de intrare/ieşire, de defect al CPU sau externe sistemului de calcul provenind de la alte echipamente cu care este cuplat.

Capitolul 2.2.Întreruperi la PC-uri La microprocesoarele implementate pe PC-uri care permit multiprogramarea, controlul accesului între programele de aplicaţie şi sistemul de operare este asigurat prin controlul spaţiului de adresă şi un mechanism de protecţie privilegiat astfel:- controlul spaţiului de adresă separă programele de aplicaţii unele faţă de altele;- mecanismul privilegiat de protecţie izolează software-ul de bază de software-ul aplicaţii. Aceasta garantează posibilitatea programelor de a avea acces la segmentul de cod de date şi resursele de intrare/ieşire de bază, numai pentru nuvelul privilegiat al segmentului respectiv. Protecţia se bazează pe noţiunea de ierarhie de tutelă, existând patru niveluri privilegiate aranjate în inel începând cu cea mai mare tutelă 0.

HARAPCEA DENIS CRISTIAN 8

SISTEME DE ÎNTRERUPERI

.- nivelul 0 este rezervat în general, sistemului de operare;- nivelul 3 este nivelul cea mai mică tutelă. Nivelul privilegiat este un atribut de protecţie alocat la toate segmentele prin software-ul sistemului, aceasta determinând care proceduri pot accesa segmentul, în timp ce drepturile de acces sunt implementate hardware. Codul sistemului de operare şi segmentele de date plasate la cel mai privilegiat nivel (nivel 0) nu pot fi accesate prin programe de alt nivel privilegiat, fiecare program putând accesa date la un nivel identic sau mai mare. Întreruperile şi excepţiile sunt cazuri speciale de transfer al controlului între programe. O întrerupere este generată de un eveniment independent de programul în curs de execuţie, în timp ce excepţiile sunt rezultate direct din programul în curs de execuţie, apărând atunci când o instrucţiune nu poate fi executată complet în mod normal. Pentru localizarea întreruperii, CPU asociază fiecărei surse de întrerupere un număr numit vector de întrerupere cu rol de adresă în IDT. Tabela de descriere a întreruperilor(IDT) defineşte dirijarea acestora pentru fiecare tip de întrerupere; această tableă poate fi localizată oriunde în spaţiul adreselor fizice, ea fiind accesată

HARAPCEA DENIS CRISTIAN 9

SISTEME DE ÎNTRERUPERI

în memoria reală prin adrese ce sunt păstrate în registrul tabelei de descriere a întreruperilor(IDTR). Fiecare intrare în tabela de descriere a întreruperilor conţine adresa planificatorului de întreruperi. Erorile de execuţie care generează excepţiile referă o intrare în tabela de descriere a întreruperilor ce se poate identifica prin bitul 1 în codul de eroare. Acest bit este setat pe 1 dacă întreruperea a fost cauzată de un eveniment extern al programului (flagul TF=1). Excepţiile au totodată şi rolul de a detecta faulturile sau erorile de programare produse de utilizarea operanzilor sau a nivelelor privilegiate; ele nu pot fi mascate, având fixaţi vectorii în primele 32 de întreruperi. De exemplu, încercarea de a viola protecţia cauzează o excepţie care, ca orice fault este dirijată de programul care a generat-o dacă aceasta este o întrerupere respective de un alt program, dacă este o intrere în tabela de descriere a întreruperilor.

Capitolul 2.3.Clase de întreruperi la PC-uri Sistemul de întreruperi la PC este realizat cu ajutorul unui controlor de întreruperi, existând mai multe niveluri de întreruperi situate fie pe magistrala sistemului, fie pe placa de bază a CPU. PC din gama IBM sau compatibile manevrează următoarele clase de întreruperi:1) întreruperi ale microprocesorului grupate pe tipuri de întreruperi, fiecărui tip fiindu-i atribuit un cod după care se identifică;2) întreruperi iniţiate hardware sunt cauzate de evenimente externe activate pe două linii: INTR (INTerrupt Request) şi NMI (Non Maskable Interrupt -pini de întrerupere ai microprocesorului):- dacă linia INTR este activă, CPU execută anumite activităţi în funcţie de indicatorul de validare al întreruperii (IF): dacă IF=0, atunci întreruperile semnalate vor fi mascate (inactive), iar CPU ignoră întreruperea şi execută instrucţiunea următoare a programului active.; dacă IF=1, atunci CPU recunoaşte cererea de întrerupere, opreşte execuţia normală

HARAPCEA DENIS CRISTIAN 10

SISTEME DE ÎNTRERUPERI

a programului active şi predă controlul rutinei de tratare a întreruperii.- dacă linia NMI este activă, întreruperea anunţă producerea unor evenimente critice, iar CPU le va da imediat controlul; evenimentele ce utilizeazăintrarea NMI sunt Nemascabile, în timp ce evenimentele care utilizează intrarea INTR sunt calificate ca întreruperi posibil de inhibit (mascabile). Mascarea întreruperilor se poate realize prin setarea bitului IF din cuvântul de stare al procesorului (de remarcat că IF nu inhibă excepţiile, întreruperile cauzate de instrucţiunile INT sau de erorile de extensie ale procesorului). Întreruperile nemescabile au o prioritate mai mare decât întreruperile mascabile.3) întreruperi iniţiate software sunt produse explicit de instrucţiuni de întrerupere sau sunt rezultatul unor condiţii de excepţie ce previn programul asupra continuării execuţiei; sunt întreruperi nemascabile. Instructiunile de întrerupere sunt de forma INTn, unde n este numărul vectorului de întrerupere. O instructiune INT generează o întrerupere imediat după execuţia sa. Tipul de întrerupere este codificat în instrucţiune anunţând CPU care rutină de tratare a întreruperii să o execute. Deoarece poate fi specificat orice tip de Intrerupere software, se pot utilize şi pot utilize şi pentru a testa rutinele de tratare a întreruperii generate de dispozitivele externe. Dacă este setat bitul TF, CPU generează o întrerupere după execuţia fiecărei instrucţiuni; aceasta se numeşte execuţie pas cu pas(step by step) constituindu-se într-un instrument deosebit de citit pentru testarea şi depanarea programelor. Întreruperile software sunt fixate pe orice PC din gma IBM sau compatibil, ele făcând parte din programele BIOS-ului.4) întreruperile DOS sunt disponibile numai sistemului de operare MS-DOS; rutinele de tratare a acestor întreruperi gestionează oparaţii de bază, lucrul cu fişierele, gestionarea memoriei.5) întreruperile BASIC sunt folosite numai în memoria ROM, interpretorul BASIC este active.6) întreruperile de adresă se găsesc sub forma vectirolor de întreruperi, în tabela vectorilor de întrerupere şi conţin

HARAPCEA DENIS CRISTIAN 11

SISTEME DE ÎNTRERUPERI

adresele diferitelor tabele din memorie, nefiind associate cu rutinele de tratare a întreruperilor.7) întreruperile folosite de programe-utilizator care de regulă, au un interval rezervat.

Capitolul 2.4.Atribuirea întreruperilor şi priorităţii. Majoritatea PC-urilor actuale bazate pe microprocesoare Pentium, pentru a păstra compatibilitatea cu microprocesoarele Intel precedente, include plăci ISA/PCI. În acest caz, legătura cu microprocesorul se realizează pe magistrala PCI printr-un cip de legătură PCI-magistrala locală a microprocesorului, în timp ce legătura cu magistrala ISA se realizează printr-un cip de legătură ISA/PCI care include un standard de serializare a întreruperilor IRQ pentru magistrala PCI.

Întreruperea codificată

Poziţia cadrului Observaţii

IRQ0 1IRQ1 2SMI# 3 System

management Interrupt

IRQ3 4IRQ4 5IRQ5 6IRQ6 7IRQ7 8IRQ8 9IRQ9 10IRQ10 11IRQ11 12IRQ12 13IRQ13 14IRQ14 15IRQ15 16

IOCHCK# 17 I/O CheckINTA 18

HARAPCEA DENIS CRISTIAN 12

SISTEME DE ÎNTRERUPERI

INTB 19INTC 20INTD 21

Neatribuite 22-23 Disponibile Standardul de serializare IRQ se bazează pe un semnal special IRQ SER ce codifică întreruperile IRQ; printr-un ciclu IRQ SER se transmit informaţii despre starea tuturor întreruperilor din sistem (durata unui ciclu este de 4-8 cicluri de ceas), acesta fiind divizat în cadre ce include cât trei cicluri de ceas. Un cadru codifică starea de întreruperi.

CAPITOLUL IIIMICROPROCESOARE, MICROCONTROLERE

Capitolul 3.1.Transferul prin întreruperi Pentru creşterea coeficientului de utilizare al procesului s-a imaginat următoarea soluţie: în momentul în care o operaţie de intrare sau de ieşire nu se poate executa imediat, procesul (programul în execuţie) care a iniţiat-o va fi trecut în stare de aşteptare, un nou program este încarcat în memoria principală din memoria secundară şi i se dă controlul. Dacă şi cel de-al doilea proces iniţiază o operaţie de I/O ce nu se poate executa imediat, acesta este trecut la rândul său în stare de aşteptare şi un al treilea program este încărcat în memoria principală. Această soluţie se numeşte multiprogramare. Construnţia calculatoarelor care suportă multiprogramarea a presupus modificări majore atât hard cât şi soft: memoria principală trebuie să aibă capacitatea substanţial mai mare pentru ca în ea să se poată încărca mai multe programe, trebuie asigurată protecţia informaţiei; un program nu are voie să altereze zonele de cod sau de date aferente altui program, sunt necesare instrucţiuni speciale pentru alocarea memoriei, trebuie să existe un pachet de programe care să ţină evidenţa tuturor resurselor (memorie, periferice,

HARAPCEA DENIS CRISTIAN 13

SISTEME DE ÎNTRERUPERI

procesor). Acest pachet de programe se numeşte sistem de operare. Pentru ca multiprogramarea să fie funcţională trebuie soluţionată problema activării unui program ce aşteaptă terminarea unei oparaţii de I/O. Pentru detaliere să presupunem următoarea situaţie:procesul p1 doreşte la un moment dat să citească un character de la tastatură. Pentru acesta p1 solicită un apel (un CALL) către sistemul de operare. Sistemul de operare preia controlul şi verifică dacă se poate citi un caracter de la tastatură de la tastatură(se citeşte starea semnalului KB_REQ). Să presupunem că utilizatorul încă nu a apăsat nici o tastă. În acest caz sistemul de operare încearcă în memorie al doilea program p2 şi îi dă controlul. P2 execută un calcul laborios. Acest calcul poate dura secunde sau minute, în funcţie de forţa de calcul a procesorului. Dacă pe durata execuţiei lui p2 se apasă una sau mai multe taste, aceste evenimente nu vor fi testate şi se vor pierde. Reamintim că tastatura blocheaza sistemul de scanare până nu se activează semnalul KB_ACK. Sistemul de operarear trebui informat despre apariţia acestor evenimente pentru a optimiza funcţionarea sistemului de calcul; de exemplu suspendă procesul p2, citeşte tastatura şi introduce în coada asociată acesteia codul caracterului citit apoi poate reda controlul lui p1 sau poate continua cu p2. Ar fi normal ca execuţia să continue cu p1 pentru a nu da senzaţia utilizatorului că sistemul s-a blocat (adică utilizatorul apasă o tastă şi nu se întmplă nimic deoarece sistemul de operare decide să continue execuţia cu p2).

Capitolul 3.2.Sitemul de întreruperi cu vectorizare software Soluţia constă în a prevede procesorul cu o intrare pentru întrerupereîn cazul unui eveniment extern. Semnalul ce se aplică pe acestă intrare aparţine magistralei de control. El se numeşte INT sau INTR. Apariţia unei întreruperi (activarea linie de întrerupere) trebuie să suspende procesul current şi să transfere controlul unei secvenţe de instrucţiuni care în mod normal aparţine sistemului de operare astfel încât acesta

HARAPCEA DENIS CRISTIAN 14

SISTEME DE ÎNTRERUPERI

să ia decizia ce se impune. Această secvenţă de instrucţiuni o vom numi în continuare “rutină de tratare întrerupere”. După terminarea rutinei de întrerupere trebuie să se transfere controlul procesului interrupt. În concluzie, ca urmare a activării linie de întrerupere trebuie să se desfăşoare următoarea secvenţă de evenimente: *procesorul termină de executat instrucţiune curentă; *procesorul salvează (de regulă pe stivă) informaţiile necesare reluării ulterioare a procesului interrupt. Unele procesoare salvează numai PC, altele salvează PC plus PSW. Există procesoare care salvează PC plus toate registrele. *PC se încarcă cu o adresă fixă, cablată. Această adresă se va numi în continuare vector de întrerupere. Acesta diferă de la tip la tip de processor. Acestă secvenţă este implementată în hardware prin o mică midificare a maşinii de stare care controlează procesorul. În starea FETCH Code ce testează intrarea INT. Dacă acesta este inactivă în IR (Instruction Register) se încarcă codul instrucţiunii din memoria de program. În caz contrar în IR se încarcă codul maşină al instrucţiunii CALL adresă unde adresă este valoarea fixă, cablată amintită la pasul 3. cu alte cuvinte tratarea unei întreruperi constă în execuţia instrucţiunii CALL addr_fix. Este evident că o singură linie de întreruperi nu ste suficientă. Fiecare periferic ar trebui să avertizeze procesorul despre modificarea stării sale printr-o linie de întrerupere proprie. Rezultă că sunt necesare atâtea linii de întrerupere câte periferice sunt. Cum numărul de periferice difer la un system la altul, în funcţie de destinaţia acestuia, rezultă este foarte greu de prevăzut în faza de proiectare a procesorului numărul de linii de întrerupere. Din acest motiv, procesorul este prevăzut cu o singură linie de întrerupere. Ori de câte ori apare o cerere de întrerupere, indiferent de la ce periferic, acestă linie trebuie activată. În figura de mai jos este prezentat un system cu patru surse de întrerupere: de le imprimantă, de la interfaţa serială, de la timer şi de tastatură.

HARAPCEA DENIS CRISTIAN 15

SISTEME DE ÎNTRERUPERI

Cererile de întrerupere sunt active pe 1 logic. Semnalul INT, active tot pe 1 logic, se generează cu o poartă SAU4: ori de câte ori este activă o cerere (sau mai multe) se va activă şi INT. Pentru a determina care cerere a determinat activarea liniei INT, se va citi starea liniilor de cerere. Acestea se grupeză într-un port de intrare: portul de stare cereri întreruperi. În figura de mai susu, selecţia acestui port se numeşte CS_int_status. //secvenţa de mai jos se execută pe u processor theoretic cu vectorul de întrerupere la adresa 0f000h# include <stdio.h>- -void interrupt int_routine(void) //cuvântul cheie “interrupt” forţează generarea codului pentru această funcţie la adresa fixă 0xf000{ char temp; temp =read_port(int_status); if (temp & 1 ) { …………… //citeşte caracter şi depune-l în coada tastaturii; …………… } if (temp & 2) { …………… //secvenţă de instrucţiuni pentru tratarea cererii de la timer;

HARAPCEA DENIS CRISTIAN 16

SISTEME DE ÎNTRERUPERI

…………… } if (temp & 4) { …………… //secvenţă de instrucţiuni pentru tratarea cererii de la uart; …………… } if (temp & 8) { …………… //secvenţă de instrucţiuni pentru tratarea cererii de la lpt; …………… } }//end int routine--main ( ){.//nici o functie (inclusive main) nu aplelează int_routine( );--} Această soluţie este folosită de microprocesoarele PIC de firma Microchip. Este important de reţinut că:1. Rutina de întrerupere nu este apelată de nici o funcţie, inclusiv main( ) din program. Atunci se pune problema: cum comunică rutina de întrerupere cu restul programului? Răspunsul este simplu: prin intermediul variabilelor globale.2. Rutina de întrerupere nu admite parametrii. În mod normal, o rutină normală poate fi apelată cu parametrii, aceştia fiind depuşi în memorie, de exemplu pe stivă, de programul appelant. Rutina ştie că trebuie să extragă de pe stivă parametrii. În cazul rutinei de întrerupere, nu există un program apelant, apelul făcându-se la activarea unui semnal electric, semnal care nu ştie să depună pe stivă parametrii. Dacă rutina de întrerupere ar fi scrisă cu parametrii, la execuţie aceasta ar scoate de pe stivă parametrii, fără ca cineva să-I fi depus. Această acţiune altereză

HARAPCEA DENIS CRISTIAN 17

SISTEME DE ÎNTRERUPERI

stiva deoarece se extrage mai mult decât se depune, şi probabil va duce în final la blocarea sistemului.3. Rutina de îtrerupere nu returnează valori. De obicei rutinele returnează valori prin intermediul regiştrilor de uz general. Programul aplelant se aşteaptă să primească o valoare într-unul din register. Dar rutina de întrerupere este apelată la activarea unui semnal INT. Acesta nu aşteaptă o valoare într-un registru deoarece nu ştie ce să facă cu ea. Dacă totuşi rutina de întrerupere ar întoarce o valoare, nu ar face altceva decât să altereze valoarea dintr-un registru pe care o foloseşte. Din acestă cauză sistemul se va bloca sau va avea o comportare imprevizibilă.

Capitolul 3.3.Sistem de întreruperi cu vectorizare hardware Metoda prezentată anterior este foarte simpl poate deveni dezavantajoasă dacă numul de întreruperi este mare. În exemplul de mai sus funcţia lpt( ) va fi apelată abia dupvor fi testate toate cele trei condiţii anterioare, ceea ce va mări timpul de răspuns în cazul unui eveniment generat de imprimantă. Timpul de răspuns poate deveni nepermis de mare în cazul procesoarelor lente. Timpul de răspuns se poate îmbunătăţii dacă funcţiile specifice perifericilor vor fi apelate hardware şi nu software. Cu alte cuvinte în loc de a se forţa în IR codul maşină al instrucţiunii CALL adresă_fixă vom forţa codul f(IRQ activ). Adică adresa rutinei de întrerupere se calculează în funcţie de cererea de întrerupere activă. Metoda care implementează idea enunţată este:1. Una sau mai multe linii de întrerupere IR se activează.2. Prin intermediul unei porţi SAU, se activează linia de întreruperi INT, pentru a informa procesorul despre apariţia unui eveniment extern, fără a preciza ce linie sau ce linii IRQ au provocat activarea lui INT.3. Procesorul termină instrucţiunea în curs de execuţie.4. Procesorul cere informaţii despre natura evenimentului. Pentru aceasta procesorul lansează o operaţie de citire, numai că în loc de RD# se activează semnalul ce aparţine magistralei

HARAPCEA DENIS CRISTIAN 18

SISTEME DE ÎNTRERUPERI

de control, şi anume INTA# (interrupt acknowledge). Se spune că întreruperea este acceptată. Structura hardware din exteriorul procesorului depune pe DATA BUS o informaţie, informaţie caracteristică cererii de întrerupere activă (una din liniile IR). Asocierea informaţie-linie de cerere de întrerupere trebuie să fie univocă; fiecare linie are asocoată propria sa informaţie. Acestă informaţie se numeşte numărul vectorului de întrerupere sau vector pe 8 biţi (V8). Informaţia vehiculate cele 3 magistrale pentru acest tip de ciclu este: - magistrala de adrese: nu contează. - pe magistrala de date: numărul vectorului de întrerupere. - pe magistrala de control: INTA# (sau o combinaţie de semnale ce identifică în mod univoc acest tip de ciclu).

5. Aşa cum s-a afirmat anterior , este datoria circuitelor din exteriorul procesorului să asocieze în mod univoc un vector de 8 biţi fiecei linii IR. În figura de mai jos este prezentat un exemplu:

HARAPCEA DENIS CRISTIAN 19

SISTEME DE ÎNTRERUPERI

Fiecare linie IR poate fi codificată pe 2 biţi dacă folosim un codificator de priorităţi. Vectorul de 8 biţi este depus pe magistrala de date prin intermediul a 8 porţi repetoare prevăzute cu ieşire 3 state. Cele 8 porţi sunt validate simultan de semnalul INTA#. Deoarece numărul liniei IR prioritate este codificată de COP pe 2 biţi, restul de 6 biţi se conectează la o valoare constantă. În exemplu acestă valoare este 0 logic. Astfel vectorii de 8 biţi generaţi sunt:0000 00_00b pentru IR_KB0000 00_01b pentru IR_timer0000 00_10b pentru IR2_UART0000 00_11b pentru IR3_LPT6. Procesorul prelucrează numărul vectorului de întrerupere după o metodă ce diferă de la processor la processor. În urma prelucrării rezultă o valoare de adresă, valoare care va fi încărcată în PC. Acestă valoare este vectorul de întrerupere.7. Procesorul salvează PC şi eventual alte informaţii.8. În momentul în care rutina de tratare se încheie, spunem că întreruperea a fost achitată. Dacă la pasul 4, procesorul a salvat pe stivă numai PC, ruitna de tratare se va încheia cu un RET. Dacă însă s-a salvat PC plus alte informaţîî, este nevoie de o instrucţiune specială, care să restaureze toate informaţiile salvate, nu numai PC aşa cum face RET. Această instrucţiune specială se numeşte RETI sau IRET.

HARAPCEA DENIS CRISTIAN 20

SISTEME DE ÎNTRERUPERI

Varianta cu tabelă de vectori de întrerupere, Borland C, sisteme de operare DOS sau WIN95, 98, ME:Void interrupt enqueue_chor (void) {…………}Void interrupt timer (void) {…………}Void interrupt uart (void) {…………}Void interrupt lpt (void) {…………}--Main( ){-//se completează tabela vectorilor de întrerupereSetvect (0, enqueue_char);Setvect (1, timer);Setvect (2, uart);Setvect (3, lpt);--asm sti;//sau enable( )//nici o funcţie (inclusive main) nu apelează rutinele de întrerupere;--} Conlucrarea între processor şi blocul de întreruperi implică un dialog ce presupune pe lâmgă transferal de date (numărul vectorului de întrerupere) şi activarea unui semnal ce nu implică vehiculare de date ci are rol de avertizare şi anume INT. Avertizarea procesorului prin activarea INT aparţine nivelului de dialog între module. Capitolul 3.4.Întreruperi mascabile şi nemascabile Din cele menţionate anterior rezultă că apariţia semnalului de întrerupere provoacă executarea rutinei de tratare aferentă, ori de câte ori semnalul respective se acţionează. Altfel spus întreruperea este tratată la fiecare apariţie. Din păcate acest mod de lucru poate duce la blocarea sistemului. După cum s-a amintit anterior, tratarea unei întreruperi poate fi asimilată unui CALL generat hardware. Instrucţiunea CALL stă la baza

HARAPCEA DENIS CRISTIAN 21

SISTEME DE ÎNTRERUPERI

reversibilităţii. Aşa cum există programe recursive greşit scrise (ce conduc la blocarea sistemului), tot aşa vor exista anumite secvenţe de activare a cererilor de întrerupere ce vor duce la blocarea sistemului. Să presupunem următoarea secvenţă de evenimente (recursivitate inversă):

- linia IRQi se activează;- se trece la executarea instrunţiunilor din rutina d

tratare aferentă lui IRQi, rutină ce o vom numi în continuare Ri;

- înainte de terminarea lui Ri se activează IRQj (Rj);- Ri este întreruptă şi se trece la executarea rutinei

aferentă lui IRQj;- înainte de terminarea lui Rj se activează din nou IRQi,

iar ciclul se repetă. Repetarea la infinit a secvenţei IRQi, Ri, IRQj, Rj duce la blocarea sistemului. Un alt exemplu de blocare în constituie secvenţa IRQi, Ri, IRQi, Ri (recursivitate directă). Situaţiile de buclare la infinit descrise mai sus pot fi evitate cu condiţia ca o rutină de întrerupere să nu poată fi la rândul ei întreruptă. Pentru acesta semnalul de întrerupere ce constituie intrare în maşina secvenţiala ce comandă activitatea procesorului trebuie forţat în starea inactiva sau cu alte cuvinte inhibit, mascat. La orice processor întreruperile sunt dezactivate, mascate în urmatoarele situaţii:

- după RESET, tabela vectorilor de întrerupere nu a fost încă iniţializată;

- după achitarea unei întreruperi, pentru a evita buclele infinite;

- sub controlul programului, prin executarea unei instrucţiuni speciale, de exemplu DESABLE INTERRUPTS (DI) sau CLEAR INTERRUPTS (CLI).

HARAPCEA DENIS CRISTIAN 22

SISTEME DE ÎNTRERUPERI

Activarea liniei de întrerupere se face numai sub controlul programului, prin executarea unei instrucţiuni ca de exemplu ENABLE INTERRUPT sau SET INTERRUPT. Unele procesoare au prevăzută încă o linie de întrerupere; activarea acestei linii nu poate fi mascată. De regulă această linie linie este folosită pentru semnalizarea evenimentelor catastrifale, evenimente ce fac imposibilă continuarea executării programului. Acestă linie de regulă se numeşte NON MASCABLE INTERRUPT sau pe scurt NMI. Necesitatea linie NMI rezultă din următorul exemplu: să presupunem un bloc de întreruperi cu 8 linii IR0-IR7, IR0 de prioritate maximă (căderea tensiunii). La un moment dat se activează I7 şi se controlul rutinei aferentă lui I7 (R7). În R7 nu este folosită nici o instrucţiune de tip EI. Dacă pe durata execuţiei lui R& se acivează I0, acesta nu va fi onorată. Dacă R7 este sufficient de lungă, este posibil ca alimentarea să se întrerupă înainte de achitarea lui I10. Acestă situaţie se evită prin introducerea liniei NMI. Capitolul 3.5.Stabilitatea vectorului de 8 biţi

HARAPCEA DENIS CRISTIAN 23

SISTEME DE ÎNTRERUPERI

Vectorul pe 8 biţi, trebuie sǎ respecte timpii de setup şi de hold în raport cu fondul ridicǎtor al ceasului din T4 pentru a fi citit correct de processor. Sǎ presupunem cǎ este activǎ cererea IR3, de prioritate minimǎ. Vectorul generat va avea biţii cei mai puţin semnificativi 11.

Chiar în momentul în care procesorul citeşte ecst vector se activeazǎ şi cererea IR0 de prioritate maximǎ. Vectorul generat de COP va avea biţii cei mai puţin semnificativi 00. Tranziţia de la 11 la 00 se face exact în mkomentul în care vectorul de 8 biţi ar trebui sǎ fie stabil. Cum tranziţia 00 la 11 se face în realitate prin 01 sau 10 (00->01->11 sau 00->10->11) vectorul citat de processor poate fi şi 01 sau 10. acest fapt duce la achitarea altei rutine de tratare decât cele corespunzǎtoare liniilor IR active (0 sau 3). Pentru a evita generarea de vectori de 8 biţi falşi, cererile de întrerupere se îngheaţǎ (frezze). Fiecare cerere este memoratǎ

HARAPCEA DENIS CRISTIAN 24

SISTEME DE ÎNTRERUPERI

pe frontal coborâtor al semnalului INTA#, evitându-se astfel modificarea intrǎrilor COP-ului pe durata ciclului INTA#.

Capitolul 3.6.Întreruperea rutinelor de întrerupere Acceptarea unei cereri de întrerupere provoacǎ execuţia rutinei de tratare aferentǎ. În rutina de tratare, programatorul poate folosi sau nu instruncţiunea de activare a liniei INT (EI sau STI). Apar urmǎtoarele posibilitǎţi:1. Dacǎ linia INT rǎmâne mascatǎ pe toatǎ durata execuţiei rutinei de tratare (în rutinǎ ne se foloseşte instrucţiunea STI), urmǎtoarea cerere de întrerupere va fi acceptatǎ dupǎ terminarea rutinei de tratare curentǎ. În aceastǎ situaţie un COP este sufficient, deoarece întotdeauna se va executa rutina aferentǎ cererii de prioritate maximǎ.2. Dacǎ în rutina de tratare se foloseşte STI, o rutinǎ de tratare întrerupere poate fi la rândul ei întraruptǎ. Uneori se doreşte ca rutinele de prioritate micǎ, relative lungi, sǎ fie întrerupte dacǎ apar cereri de prioritate mai mari. Din pǎcate un COP nu poate face distinţia dintre cererile de prioritate mai mare şi ale de prioritate mai micǎ decât cea a cererii ce este în curs de tratare. Folofirea instrucţiunii STI într-o rutinǎ de tratare face ca protecţia împotriva recusivitǎţii hardware, asiguratǎ prin intermediul bistabilului IF, sǎ devinǎ inefectivǎ. În acest caz protecţia împotriva recursivitǎţii trebuie asiguratǎ de întreruperi din exteriorul procesorului. Problema enunţatǎ anterior se rezolvǎ folosind o tehnicǎ bazatǎ pe DAISY CHAIN (lanţ de margarete):~ fiecare cerere IR este mascatǎ prin intermediul unei porţi AND2 (U5, U10, U15, U20).~ pentru fiecare cerere de întrerupere se prevede un bistabil D cu Inscriere pe front ridicǎtor. În acest bistabil se va înscrie constanta 0 în momentul în care cererea de întrerupere aferentǎ a fost acceptatǎ. Acest bistabil se va numi IS-IN SERVICE, pentru IR0 bistabilul se va numi IS0 (U3), pentru IR1 se va numi IS1 (U8), pentru IR2 se va numi IS2 (U13), iar pentru IR3 se va numi IS3 (U18).~ constanta 0 ce trebuie înscrisǎ într-unul din bistabilii IS, este demultiplexatǎ prin intermediul DEMUX4 din poziţia U23, în funcţie de ieşirile COP.

HARAPCEA DENIS CRISTIAN 25

SISTEME DE ÎNTRERUPERI

Înscrierea se face în momentul în care procesorul citeşte V8, adicǎ pe frontal ridicǎtor al semnalului INTA#.~ infmormaţia din bistabili IS este folositǎ pentru a masca cererile IRQ. IRQ0 se mascheazǎ numai dacǎ este în serviciu chiar dacǎ este în serviciu IRQ0 sau IRQ1. IRQ2 este mascatǎ dacǎ este în serviciu IRQ0, IRQ1 sau IRQ2. IRQ3 este mascatǎ dacǎ e în serviciu IRQ0 sau IRQ1 sau IRQ2 sau IRQ3. Porţile AND U4, U9, U14, U19 formeazǎ DAISY CHAIN-ul. Poarta U4 nu este necesarǎ şi este prezentǎ în schemǎ numai pentru a evidenţia structura de DAISY CHAIN.

HARAPCEA DENIS CRISTIAN 26

SISTEME DE ÎNTRERUPERI

~ setarea unui bistabil IS se face prin intermediul unui port de ieşire şi a unui DEC4 sub comanda programului. EOi0 – EOi3 (End Of Interrupt) sunt ieşirile DEC-ului.~ de asemenea dacǎ un bistabil IS a fost setat, starea acestuia nu trebuie afectatǎ la o înscriere subsecventǎ sub 0 (evident in alt bistabil IS). Din acest motiv auto menţinerea stǎrii se face prin intermediul unei porţi AND2 (U2, U6, U11, U16). Pentru a evidenţia rolul acestei porţi considerǎm urmǎtoarea secvenţǎ de evenimente:

- nici o cerere nu este în serviciu (toate semnalele IS# sunt 1);- IRQ devine activǎ, cererea este ecceptatǎ şi se intrǎ în rutina de

tratare asociatǎ, RI2;- în IR2 se întâlneşte STI;- IRQ devine activǎ, cerera este acceptatǎ şi se intrǎ în rutina de

tratare asociatǎ RI0;- în timpul execuţiei RI0 se activeazǎ IR3.

HARAPCEA DENIS CRISTIAN 27

SISTEME DE ÎNTRERUPERI

CAPITOLUL IVSURSE DE ÎNTRERUPERI

Capitolul 4.1.Întreruperi externe

Întreruperile externe INT0 şi INT1 pot fi active pe nivel fie pe front, în funcţie de biţii IT0 şi IT1 din registrul TCON. Dacǎ ITx=0 întreruperea externǎ ITx este activǎ dacǎ nivelul de pe pinul INTx este zero. Dacǎ ITx=1

HARAPCEA DENIS CRISTIAN 28

SISTEME DE ÎNTRERUPERI

întreruperea externǎ este activǎ pe front negative. Bistabilii (flagurile) care genereazǎ de fapt aceste întreruperi sunt biţi IE0 şi IE1 din TCON. Dacǎ întreruperea este activǎtǎ pe front aceste flaguri sunt şterse automat, prin mecanisme hardware, în momentul în care se intrǎ în rutina de tratare. Dacǎ întreruperea este activǎ pe nivel, controlul flagului este fǎcut din exterior de cǎtre sursa întreruperii. Deoarece semnalele de pe pinii aferenţi întreruperilor externe sunt eşantionţi o singurǎ datǎ pe ciclu maşinǎ, valorile logice 1 sau 0 trebuiesc menţionate cel puţin 12 perioade de ceas (un ciclu maşinǎ). Dacǎ întreruperea externǎ este activǎ pe front, sursa externǎ trebuie sǎ menţinǎ 1 logic pe pinul de întrerupere cel puţin un ciclu maşinǎ urmat apoi de 0 logic ce trebuie, la rândul sǎu menţinut cel puţin un ciclu maşinǎ. Dacǎ întreruperea externǎ INT0 sau INT1 este activǎ pe nivel, sursa externǎ trebuie sǎ menţinǎ cererea activǎ (sǎ fie 0) pânǎ când aceasta este acceptatǎ. Cererea trebuie dezactivatǎ (sǎ devinǎ 1). Înainte de terminarea rutinei de terminarea rutinei de tatare, altfel se va genera o nouǎ întrerupere.

Capitolul 4.2.Întreruperi de la timere Întrerupereile de la timere 0 sau de la timerul 1 sunt generate prin intermediul flagurilor TF0 sau TF1 din TCON. Acestea sunt poziţionate pe 1 logic de depǎşirea capaciǎţii de numǎrare (overflow) a Timer/Counter-ului asociat. Flagul care a generat întreruperea este şters (pus la 0) de cǎtre macanismele hardware interne la intrarea în rutina de tratare.

Capitolul 4.3.Întreruperi de la portul serial Întreruperea de la portul serial este generatǎ de un SAU între RI şi TI din registrul SCON. Nici unul din aceste flaguri nu este şters prin mecanisme hardware. În mod normal rutina de tratare trebuie sǎ determine dacǎ întreruperea a fost generatǎ de RI sau de TI iar bitul corespunzǎtor va trebui şters software.

Capitolul 4.4.Activarea întreruperilor Fiecare sursǎ de întrerupere poate fi validǎ sau inhibatǎ prin setarea sau ştergerea unui bit din registrul Interrupt Enable (IE). De asemenea IE conţine un bit de inhibare globalǎ EA. Dacǎ EA este setat (1) întreruperile sunt validate sau inhibate individual prin intermediul bitului corespunzǎtor din IE. Dacǎ EA este şters (0), toate întreruperile sunt inhibate.

HARAPCEA DENIS CRISTIAN 29

SISTEME DE ÎNTRERUPERI

IE

Bit 7 6 5 4 3 2 1 0

Enable bit=1 valideazǎ întrerupereaEnable bit=0 inhibǎ întreruperea“EA” – bit de inhibare globalǎ“-” – neimplementat“ES” – validare întrerupere de la portul serial“ET1” – validare întrerupere de la timer-ul 1“EX1” – validare întrerupere externǎ 1“ET0” – validare întrerupere de la timer-ul 0“EX0” – validare întrerupere externǎ 0

Capitolul 4.5.Nivelele de prioritate Prioriateta fiercǎrei surse de întrerupere poate fi progaramatǎ. Existǎ douǎ nivele de prioritate ce pot fi allocate unei surse prin ştergerea sau setarea unui bit din registrul Interrupt Priority (IP).IP

Bit 7 6 5 4 3 2 1 0

Bit de prioritate=1 prioritate maximǎBit de prioritate=0 prioritate scǎzutǎ“PS” – prioritate întrerupere de le portul serial“-”– neimplementat“PT1” – prioritate întrerupere de la timer-ul 1“PX1” – prioritate întrerupere externǎ 1“PT0” – prioritate întrerupere de la timer-ul 0“PX0” – prioritate întrerupere externǎ 0 Intrarea în serviciu: dacǎ simultan sunt promise douǎ cereri de prioritǎţi diferite cerera de prioritate ridicatǎ este servitǎ prima. Dacǎ sunt premise simultan cereri de aceeaşi prioritate o a doua structurǎ de prioritǎţi determinǎ ce întrerupere va fi tratatǎ, dupǎ cum urmeazǎ:1 prioritatea cea mai mare INT02 Timer 03 INT14 Timer 15 prioritatea cea mai micǎ Portul Serial

HARAPCEA DENIS CRISTIAN

EA - - ES ET1 EX1 ET0 EX0

- - - PS PT1 PX1 PT0 PX0

30

SISTEME DE ÎNTRERUPERI

Întreruperea rutinelor de întrerupere: O întrerupere de prioritate scǎzutǎ poate fi întreruptǎ la rândul ei de o întrerupere de prioritate ridicatǎ dar nu poate fi întreruptǎ de nici o altǎ întrerupere de prioritate scǎzutǎ. O întrerupere de prioritate ridicatǎ nu poate fi întreruptǎ de nici o altǎ întrerupere.Vectorii de întrerupere: La acceptarea unei întreruperi procesul executǎ un LCALL generat hardware cǎtre una din urmǎtoarele adrese, conform tabelului urmǎtor:Sursa întreruperii Bit Şters hardware Vector

INT0 IE0 Nu(nivel)Da(front)

0003H

Timer0 TF0 Da 000BHINT1 IE1 Nu(nivel)

Da(front)0013H

Timer1 TF1 Da 001BHPort Serial Ri; Ti Nu 0023H

Rutina de tratare se terminǎ cu instrucţiunea RETI. La întâlnirea instrucţiunii RETI blocul de întreruperi achitǎ respective cerere de întrerupere. Trebuie notat cǎ distanţa între vectorii de întrerupere este de numai 8biţi. Dacǎ se folosesc întreruperi consecutive (IE0 şi TF0, IE1, etc) şi o rutinǎ de tratare este mai lungǎ de 8 octeţi atunci acestǎ rutinǎ va trebui sǎ execute un salt undeva în memorie unde astfel încât sǎ nu existe suprapuneri cu urmǎtoarea rutinǎ de tratare.

HARAPCEA DENIS CRISTIAN 31

SISTEME DE ÎNTRERUPERI

CAPITOLUL VCOMUNICAŢIA CU HARDWARE-UL ÎN LINUX

CAPITOLUL 5.1.Alocarea porturilor I/O Înainte de a putea lucra cu porturile I/O, trebuie sǎ ne asigurǎm cǎ avem acces exclusiv la ele. Pentru a obţine porturile dorite, se foloseşte funcţia request_region: #include <linux/ioport.h> struct resource *request_region(unsigned long first, unsigned long n, const char *name); Parametrul first specificǎ adresa de bazǎ pentru dispozitiv, iar n numǎrul de porturi dorite. Adresa de bazǎ este începutul zonei de adrese (sau de porturi I/O) asociate dispozitivului şi trebuie sǎ fie unicǎ pentru fiecare dispozitiv. Paramentrul name reprezintǎ numele dispozitivului. Toate porturile alocate apar în /proc/ioports. Pentru eliberarea porturilor rezervate se foloseste funcţia release_region:void release _region(unsigned long start, unsigned long n); Spre exemplu, portul paralel are adresa de bazǎ 0x378 şi deţine 8 porturi. Secvenţa de cod pentru alocarea porturilor asociate acestuia este urmǎtoarea: #include <linux/ioport.h> #define my_baseport 0x378 #define my_nr_ports 8if (! request_region(my_baseport, my_nr_ports, "parallelport")) { /* handle error */ return −enodev;} Iar cea pentru eliberare:

HARAPCEA DENIS CRISTIAN 32

SISTEME DE ÎNTRERUPERI

release_region(my_baseport, my_nr_ports); De cele mai multe ori alocarea porturilor se realizeazǎ la iniţializarea driver-ului în funcţia init_module. Dupǎ cum s-a specificat mai sus, în proc/ioports/ se pot vizualiza toate porturile alocate:$ cat /proc/ioports0000−001f : dma10020−0021 : pic10040−005f : timer0060−006f : keyboard0070−0077 : rtc0080−008f : dma page reg00a0−00a1 : pic200c0−00df : dma200f0−00ff : fpu0170−0177 : ide101f0−01f7 : ide00376−0376 : ide10378−037a : parport0037b−037f : parport003c0−03df : vga+03f6−03f6 : ide003f8−03ff : serial...

CAPITOLUL 5.2.Operaţii de scriere şi citire a porturilor I/O Dupǎ ce un driver a obţinut intervalul de porturi I/O dorite, trebuie sǎ realizeze operaţii de citire sau scriere pe aceste porturi. Întrucât porturile fizice sunt diferenţiate dupǎ numǎrul de biţi (8,16,32 biţi), existǎ diferite funcţii de acces a porturilor în funcţie de dimensiunea lor. În <asm/io.h> sunt definite urmǎtoarele funcţii de acces a porturilor:

- unsigned inb (unsigned port), citeşte porturi de dimensiunea unui octet (8 biţi).

- void outb (unsigned char byte, unsigned port), scrie porturi de dimensiunea unui octet (8 biţi).

- unsigned inw (unsigned port), citeşte porturi de dimensiunea a doi octeţi (16 biţi).

- void outw (unsigned short word, unsigned port), scrie porturi de dimensiunea a doi octeţi (16 biţi).

HARAPCEA DENIS CRISTIAN 33

SISTEME DE ÎNTRERUPERI

- unsigned inl (unsigned port), citeşte porturi de dimensiunea a patru octeţi (32 biţi).

- void outl (unsigned longword, unsigned port), scrie porturi de dimensiunea a patru octeţi (32 biţi).

Argumentul port specificǎ adresa portului de unde se citeşte sau se scrie, iar tipul sǎu este dependent de platformǎ (poate fi unsigned long sau unsigned short). Anumite platforme pot avea probleme atunci când procesorul încearcǎ sǎ transfere date prea rapid cǎtre şi de la dispozitiv. Soluţia este inserarea unei întârzieri dupǎ fiecare instrucţiune de I/O, în cazul în care urmeazǎ oaltǎ instrucţiune de acelaşi tip. În cazul în care dispozitivul pierde date, se pot folosi funcţii care introduce aceastǎ întârziere; numele acestora este similar cu cele descrise mai sus, cu deosebirea cǎ se terminǎ în _p: inb_p, outb_p, etc. Spre exemplu, urmǎtoarea secvenţǎ scrie un octet pe portul paralel şi apoi îl citeşte:#include <asm/io.h>#define my_baseport 0x378

unsigned char value = 0xFF;outb(value, my_baseport);value = inb(my_baseport); Deşi funcţiile descrise mai sus sunt definite pentru device drivere, ele pot fi folosite şi din user_space, prin includerea header−ului <sys/io.h>. Pentru a putea fi folosite, vor trebui apelate mai întâi funcţiile ioperm sau iopl pentru obţinerea permisiunii de a realiza operaţii cu porturile. Funcţia ioperm obţine permisiunea pentru porturi individuale, în timp ce iopl pentru întregul spaţiu de adrese I/O. Pentru a putea folosi aceste funcţii utilizatorul trebuie sǎ fie root. Urmǎtoarea secvenţa obţine permisiunea pentru primele 3 porturi ale portului paralel, şi apoi le elibereazǎ:#define my_baseport 0x378if (ioperm(my_baseport, 3, 1)) {/* handle error */}if (ioperm(my_baseport, 3, 0)) {/* handle error */}

Capitolul 5.3.Întreruperi în Linux.Obţinerea unei întreruperi

HARAPCEA DENIS CRISTIAN 34

SISTEME DE ÎNTRERUPERI

La fel ca şi în cazul celorlalte resurse, un driver trebuie sǎ obţinǎ accesul la o linie de întreruperi înainte de a o putea utiliza şi sǎ o elibereze la sfârşitul execuţiei. În Linux, cererea de obţinere şi resperctiv eliberare a unei întreruperi se face cu ajutorul urmǎtoarelor funcţii:#include <linux/interrupt.h>

int request_irq(unsigned int irq_no, irqreturn_t (*handler)(int irq_no, void *dev_id, struct pt_regs *regs), unsigned long flags, const char *dev_name, void *dev_id);

void free_irq(unsigned int irq_no, void *dev_id); Se observǎ cǎ pentru obţinerea unei întreruperi utilizatorul trebuie sǎ specifice numǎrul întreruperii (irq_no), un handler ce va fi chemat în momentul generǎrii întreruperii (handler), flag-uri ce vor instrui kernelul despre comportarea doritǎ (flags), numele dispozitivului ce foloseşte aceastǎ întrerupere (dev_name), şi un pointer ce poate fi setat de cǎtre utilizator la orice valoare, şi care nu are semnificaţie globalǎ (dev_id). De cele mai multe ori dev_id va fi setat la pointerul cǎtre datele private ale dispozitivului. În schimb, la eliberarea întreruperii utilizatorul sǎ apese în aceeaşi valoare a pointerului (dev_id) împreunǎ cu numǎrul întreruperii (irq_no). Valoarea pe care o întoarce request_irq este 0 in cazul în care înregistrarea s-a efectuat cu success, fie un cod de eroare negativ care indicǎ motivul eşecului. O valoare uzualǎ este EBUSY care este întoarsǎ atunci când întreruperea este ocupatǎ deja de un alt echipament. Flag-urile ce pot fi pasate la obţinerea unei întreruperi sunt SA_SHIRQ şi SA_SAMPLE_RANDOM. Primul flag anunţǎ kernelul cǎ întreruperea poate fi partajatǎ cu alte dispozitive. Dacǎ acest flag nu este setat, atunci dacǎ existǎ deja un handler asociat cu întreruperea cerutǎ cererea de obţinere a unei întreruperi va eşua. O întrerupere partajatǎ este tratatǎ prin execuţia tutror rutinelor înregistrate. Aceastǎ abordare duce la o situaţie interesantǎ: cum îsi poate da seama un device driver dacǎ rutina de tratare a întreruperii a fost activatǎ de o întrerupere generata de dispozitivul pe care îl gestioneazǎ? Raspunsul estesimplu: toate dispozitivele care suportǎ întreruperi au asociate un registru de stare, care poate fi interogat în rutina de tratare pentru a afla dacǎ întreruperea a fost sau nu generatǎ de dispozitiv. Revenim la flag−urile ce pot fi pasate la cererea de obţinere a unei întreruperi. SA_SAMPLE_RANDOM anunţǎ kernelul cǎ poate folosi întreruperea ca o sursǎ de evenimente asincrone ce pot fi folosite pentru a

HARAPCEA DENIS CRISTIAN 35

SISTEME DE ÎNTRERUPERI

genera numere aleatoare. Din motive de securitate, utilizatorul nu trebuie sǎ foloseascǎ acest flag decât dacǎ întreruperile sunt asincrone, în raport cu o entitate ce priveşte aceste evenimente din exteriorul sistemului. Exemple de dispozitive ce genereazǎ întreruperi asincrone sunt: discul, placa de reţea, mouse−ul, tastatura. Exemple de dispozitive ce genereazǎ întreruperi sincrone: ceasul. Obţinerea întreruperii se poate realiza fie la iniţializarea driver−ului, în funcţia init_module, fie atunci când dispozitivul este deschis prima datǎ, în funcţia open. Urmǎtorul exemplu realizeazǎ aceste operaţii pentru portul paralel:#include <linux/interrupt.h>

#define MY_BASEPORT 0x378#define MY_IRQ 7

struct my_device_data *my_data;int err;

if ((err = request_irq(MY_IRQ, my_handler, SA_INTERRUPT, "parallelport", my_data))) { /* handle error*/ return err;} Dupǎ cum se poate observa, IRQ−ul pentru portul paralel este 7,iar handlerul este instalat cu întreruperile dezactivate pe procesorul local (sa_interrupt). Pentru eliberarea întreruperii asociate portului paralel se va executa urmǎtoarea secvenţǎ:free_irq(MY_IRQ, my_data); În funcţia de iniţializare, init_module sau în funcţia de deschidere a dispozitivului, open, trebuiesc activate întreruperile pentru a putea fi primite de cǎtre dispozitiv. Aceastǎ operaţie este dependentǎ de dispozitivul folosit, dar de cele mai multe ori presupune setarea unui bit din registrul de control. Spre exemplu, pentru portul paralel se activeazǎ întreruperile prin setarea bitului 4 (0x10) al portului 2 (registrul de control, la adresa my_baseport+2):#include <asm/io.h>#define my_baseport 0x378

outb(0x10, MY_BASEPORT + 2);

HARAPCEA DENIS CRISTIAN 36

SISTEME DE ÎNTRERUPERI

Capitolul 5.4.Implementarea rutinei de tratare a întreruperii Sǎ examinǎm acum signature funcţiei de tratare a întreruperii:irqreturn_t (*handler)(int irq_no, void *dev_id, struct pt_regs *regs); Se observǎ cǎ funcţia primeşte ca parametri numǎrul întreruperii pe care rutina o trateazǎ, pointer−ul trimis la cererea de obţinere a întreruperii şi un pointer la o structurǎ ce conţine valorile registrelor la momentulîntreruperii. Pentru device drivere aceste valori nu sunt folositoare. De asemenea observaţi cǎ rutina de tratare a întreruperii trebuie sǎ întoarcǎ o valoare cu tipul irqreturn_t. Pentru versiunea curentǎ de kernel existǎdoar douǎ valori valide: IRQ_NONE şi IRQ_HANDLED. Device driverul trebuie sǎ întoarcǎ IRQ_NONE dacǎ observǎ cǎ întreruperea nu a fost generatǎ de dispozitivul pe care îl comandǎ. În caz contrar, device driverultrebuie sǎ întoarcǎ IRQ_HANDLED.

HARAPCEA DENIS CRISTIAN 37

SISTEME DE ÎNTRERUPERI

CAPITOLUL VITRATAREA ÎNTRERUPERILOR DE CEAS

Capitolul 6.1.Întreruperea de ceas standard Sistemul de întreruperi al calculatorului IBM PC este realizat cu un controlor de tip I8259A. Acest circuit gestioneazǎ cererile de întrerupere pe care le cumuleazǎ pe opt nivele de întrerupere, deservindu-le în ordinea prioritǎţii ce descreşte cu numǎrul nivelului. Întreruperea UC de cǎtre I8259 se face pe linia de înrerupere mascabilǎ INT. Procesorul posedǎ încǎ o linie de întrerupere NMI, nemasbabilǎ, care este acţionatǎ de coprocessor (dacǎ existǎ) sau de o eroare de paritate apǎrutǎ la memoria în memoria BIOS INT 08H. Secvenţa de tratare a acestei întreruperi constǎ în:

- încrementarea unui contor de ceas aflat în zona BIOS la 0000:46CH;

- decrementarea contorului pentru oprirea motorului unitǎţii de disc flexibil;

- generarea unei întreruperi (soft) 1CH, care cuprinde doar un IRET, dar care poate fi înlocuitǎ cu o rutinǎ a utilizatorului;

- achitarea întreruperii prin transmiterea octetului EOI (End Of Interrupt) la circuitul I8259, care marcheazǎ terminarea tratǎrii întreruperii şi posisbilitatea ca acest circuit sǎ ia în considerare urmǎtoarea cerere de întrerupere, fǎrǎ transmitereaunui octet de achitare, circuitul nu va recunoaşte nici o cerere de întrerupere.

Deci secvenţa de tratare a întreruperii de ceas va rebui astfel modificatǎ încât pe lângǎ operaţiile de mai sus, sǎ realizeze si schimbarea contextului.

Capitolul 6.2.Tratarea întreruperilor de ceas în executiv Deoarece la fiecare cuantǎ de timp trebuie sǎ se facǎ toate operaţiile din secvenţa standard î în plus schimbarea contextului se pune problema raportului între regia de sistem şi valoarea cuantei, care ar trebui sǎ fie cât mai

HARAPCEA DENIS CRISTIAN 38

SISTEME DE ÎNTRERUPERI

mic, însemnând cǎ UC sǎ fie ocupatǎ cel mai mult de rularea proceselor şi nu de comutarea lor. Dacǎ tratarea întreruperii dureazǎ mai mult decât o cuantǎ, cât o întrerupere de timp se pierde. Cuanta de timp se poate reprograma prin reprogramarea circuitului de ceas I8253 o cuantǎ mare rezolvǎ un raport bun, dar comutarea proceselor s-ar face rar, viteza de reacţie virtualǎ în sisteme de timp real fiind scǎzutǎ o cuantǎ prea micǎ, ocupǎ UC cu schimbarea contextului şi nu cu rularea proceselor, putându-se pierde înrtreruperi. Cuanta de execuţie a unui proces se poate modifica şi fǎrǎ reprogramarea circuitului de ceas, prin apelul alocatorului UC din rutina de tratare a întreruperii de ceas, numai dupǎ un numǎr fixat de cuante elementare.

Capitolul 6.3.Iniţializarea vectorilor de întrerupere La apariţia unei întreruperi de ceas, codul rutinei de tratare e executat de procesorul ce a fost gǎsit activ. Alocatorul UC apelat la sfârşitul rutinei va da comandǎ urmǎtorului proces. În aceastǎ variantǎ, dupǎ apariţia primei întreruperi, primul proces ar trece la execuţia codului procesorului, iar al doilea nemai revenind din 1CH pentru achitarea întreruperii, EOI; deci nu s-ar mai recunoaşte nici o întrerupere şi procesul ar rula la infinit. Din acestǎ cauzǎ, achitarea întreruperii trebuie fǎcutǎ înainte de apelul alocatorului UC, deci rutina standard de tratare trabuie apelatǎ din cea a executivului, la începutul ei, apoi fǎcându-se apelul alocatorului UC. Acestea duc la urmǎtoarele iniţializǎri ale vectorilor de întrerupere în funcţia de iniţializare a executivului:

- se gǎseşte adresa rutinei standard pentru întreruperea 08C (getvet);

- se initializeazǎ cu acestǎ adresǎ un vector nefolosit (setvet);- se iniţializeazǎ vectorul întreruperii 08H cu adresa secvenţei de

tratare ceas a executivului (setvet). Aceste iniţializǎri se fac cu întreruperile dezactivate, deci precedate de un disable( ) înainte de lansarea în execuţie a primului proces al aplicaţiei, acre se determina anterior. Nu este necesar ca dupǎ iniţializarea vectorilor, sǎ se activeze întreruperile, deoarece tratarea la execuţia primului proces realizeazǎ acesta. Rutina de tratare a întreruperii de ceas nu este disponibilǎ proceselor, deci va fi privatǎ în varianta conceperii executivului ca obiect. E necesar ca obiectivul sǎ-şi gestioneze un ceas de timp real, printr-o variabilǎ, ce se iniţializeazǎ de asemenea la iniţializarea executivului, actualizându-se la

HARAPCEA DENIS CRISTIAN 39

SISTEME DE ÎNTRERUPERI

fiecare întrerupere de ceas. Rutina executivului de tratare a întreruperii de ceas trebuie sǎ fie neîntreruptibilǎ, deci se declarǎ interrupt şi trebuie sǎ cuprindǎ:

- generarea întreruperii soft pentru execuţia rutinei standard de tratare (geninterrupt);

- actualizarea ceasului executivului;- apelul alocatorului UC pentru lansarea unui alt proces.ş

BIBLIOGRAFIE

Dodescu Gh., Vasilescu A. : Sisteme de operare MS-DOS şi UNIX Editura: Viaţa Româneascǎ

Dodescu Gh., Nǎstase F. : Sisteme de calcul şi operare Vol.1 Editura: Aldo

Dodescu Gh., Nǎstase F. : Sisteme de calcul şi operare Vol.2 Editura: Aldo

Stallings W. : Opperating Systems Editura: Prentice Hall PTR

Zota R.D. : Elemente de arhitecturǎ a sistemelor de calcul şi operare Editura: ASE

Mârşanu R. : Sisteme de calcul Editura: Didacticǎ şi Pedagogicǎ

Mârşanu R. : Sisteme de operare Editura: All

Dodescu Gh., Nǎstase F., Mârşanu R. : Sisteme de calcul şi operare Editura: ASE

HARAPCEA DENIS CRISTIAN 40

SISTEME DE ÎNTRERUPERI

HARAPCEA DENIS CRISTIAN 41