Întreruperi și cazuri speciale. Exemple de întreruperi

În arhitectura PC-ului sistem de bază intrare/ieșire (I/O) ocupă un loc special. Poate fi considerat, pe de o parte, ca parte integrantă a hardware-ului, pe de altă parte, acest sistem este unul dintre module software OS.

Unul dintre functie importanta BSVV - serviciu apeluri de sistem, sau întrerupe. Apelurile de sistem sunt generate de software sau hardware pentru a fi efectuate diverse operatii. Mecanismul de întrerupere este utilizat pentru a implementa apeluri de sistem. Esența acestui mecanism este că funcționarea curentă a mașinii, oricare ar fi aceasta, poate fi suspendată un timp scurt unul dintre semnalele care indică apariţia unei situaţii care necesită o prelucrare imediată

Întrerupe - aceasta este oprirea execuției comenzii curente sau a secvenței curente de comenzi pentru a gestiona un eveniment program special - handler de întreruperi, urmată de revenirea la execuţia programului întrerupt.

Evenimentul poate fi cauzat de o situație specială care apare în timpul execuției programului sau de un semnal de la un dispozitiv extern. Întreruperea este folosită pentru a reacționa rapid la situații speciale care apar în timpul execuției programului și interacțiunii cu procesorul. dispozitive externe.

Când este întrerupt, sistemul de operare salvează starea procesorului -înregistrează valori și semnificații contor de programe (PC)– adresele comenzii întrerupte . Managerul de întrerupere din sistemul de operare determină din conținutul segmentului de cod obiect ce tip de întrerupere a avut loc și ce acțiuni ar trebui întreprinse pentru a o gestiona. Printre tipuri posibileîntrerupe altele decât commit diverse erori, există, de asemenea temporizatorul se întrerupe– întreruperi periodice după un anumit interval de timp, destinate sondarea dispozitivului– acțiuni sistem de operare prin verificarea periodică a stării tuturor porturilor și dispozitivelor externe, care se pot schimba în timp: de exemplu, o unitate flash a fost conectată la portul USB; imprimanta a terminat de tipărit și a devenit liberă etc. Sistemul de operare realizează reconfigurarea sistemului și ajustează tabelele de sistem care stochează informații despre dispozitiv



Mecanismul de întrerupere este asigurat de hardware și software adecvat.

Orice excepție care provoacă o întrerupere este însoțită de un semnal numit cerere de întrerupere (IR). Solicitările de întrerupere de la dispozitive externe ajung la procesor prin intermediul linii speciale, iar solicitările care apar în timpul execuției programului vin direct din interiorul microprocesorului. Mecanismele de gestionare a întreruperilor de ambele tipuri sunt similare. Să luăm în considerare funcționarea unui computer atunci când apare un semnal de solicitare de întrerupere, bazându-ne în principal pe procesarea întreruperilor hardware (Fig. 13).

Orez. 13. Efectuarea unei întreruperi într-un computer:

tр - timpul de răspuns al procesorului la o cerere de întrerupere;

tс - timpul de salvare a stării programului întrerupt și apelarea gestionarului de întreruperi;

tв este timpul de recuperare al programului întrerupt.

După ce apare semnalul de cerere de întrerupere, computerul trece la executarea programului - handler-ul de întrerupere. Handler-ul efectuează acele acțiuni care sunt necesare în legătură cu situația excepțională apărută. De exemplu, o astfel de situație ar putea fi apăsarea unei taste de pe tastatura unui computer. Apoi, handlerul trebuie să transmită codul tastei apăsate de la controlerul tastaturii la procesor și, eventual, să analizeze acest cod. Când manipulatorul își încheie munca, controlul este transferat programului întrerupt.

Timp de reactie- acesta este timpul dintre apariția semnalului de cerere de întrerupere și începerea execuției programului de întrerupere (tratamentul de întrerupere) dacă această întrerupere este activată pentru service.

Timpul de răspuns depinde de momentul în care procesorul stabilește că a avut loc o solicitare de întrerupere. Interogarea cererilor de întrerupere poate fi efectuată fie după finalizarea următoarei etape a comenzii (de exemplu, citirea unei comenzi, citirea primului operand etc.), fie după finalizarea fiecărei comenzi din program.

Întreruperile pot fi împărțite în trei grupe: hardware, logice și software.

Surse întreruperi hardware – scăderea tensiunii de alimentare, apăsarea unei taste de pe tastatură, sosirea următorului impuls de la contorul de timp, apariția semnale speciale din dispozitivele de stocare pe flexibile sau hard disk-uri si etc.

Se întrerupe logice sau procesor apar sub diferite situatii non-standardîn funcționarea microprocesorului principal - diviziunea la zero, depășirea registrului, apariția unui „punct de întrerupere” etc.

Software-ul se întrerupe– cea mai extinsă categorie. Ele sunt produse atunci când un program dorește să primească un anumit serviciu de la un alt program, iar acest serviciu este de obicei asociat cu funcționarea hardware-ului.

Fiecare întrerupere are un număr unic și poate fi asociată cu o anumită subrutină concepută pentru a deservi situația care a apărut. Subrutina de serviciu în sine, în general, poate fi suspendată și de o altă întrerupere; dar de cele mai multe ori, în perioada de funcționare a unei subrutine care deservește o anumită întrerupere, alte întreruperi sunt „mascate”, adică nu sunt deservite imediat, ci sunt puse în coadă.

În componentele hardware ale mașinii în DOS în sine și în programe de aplicație pot fi generate întreruperi care trebuie deservite. BSVV are sarcina de a deservi întreruperile nivel inferior– cele care necesită control direct al componentelor hardware. Aceste întreruperi sunt numerotate de la 0 la 31 (numerele hexadecimale 0 - 1F). Alte întreruperi - numerele 32 - 63 (numerele hexadecimale 20 - 3F) - aparțin unui nivel superior, iar întreținerea lor este atribuită altor module OS.

În tabel 3 prezintă o listă generală de întreruperi deservite de BSVV. ÎN programe realeÎn limbajul de asamblare și în literatura tehnică OS, întreruperile sunt identificate prin coduri hexazecimale. Din analiza tabelului. 3 este clar că întreruperile deservite de BSVV corespund operatii de baza pentru controlul dispozitivelor externe - afișaj, tastatură, unitate flotantă, imprimantă, canale de comunicatie. În acest caz, subrutinele incluse în BSVM efectuează operații de nivel inferior. De exemplu, întreținerea unei unități de dischetă include capacitatea de a instala inițial capete magnetice, de a verifica starea curentă a dispozitivului, de a citi și de a scrie direct sectoarele de disc specificate, de a verifica datele citite sau scrise și, în cele din urmă, de a formata (dispunerea inițială) discuri.

Tabelul 3. Întreruperi deservite de BSVV

Numar decimal Număr hexazecimal
Impartirea cu zero
Conversia microprocesorului în modul pas cu pas
Căderea tensiunii de alimentare
Apariția unui punct de întrerupere într-o secvență de comandă
Depășirea registrului unității aritmetice
Imprimarea unei copii grafice a ecranului
Rezervat
Rezervat
Semnal de la contor de timp - temporizator
Semnal de la apăsarea unei taste de pe tastatură
A Rezervat
Numar decimal Număr hexazecimal Situație servită sau funcție îndeplinită
ÎN Rezervat
CU Rezervat
D Rezervat
E Semnal despre încheierea schimbului cu NMD
F Rezervat pentru întreținerea imprimantei
Controlul afișajului
Solicitați o listă de echipamente conectate
Solicitați dimensiunea memorie fizică
managementul NMD
Gestionarea adaptorului de comunicație
Controlarea unui magnetofon și a altor dispozitive
Control de la tastatură
Managementul imprimantei
Accesarea BASIC-ului încorporat în ROM
Repornirea sistemului
1A Interogați/setați ora și data curente
1B
1C
1D Adresa tabelului parametrilor de inițializare a afișajului.
1E Adresa tabelului de parametri NGMD
1F Adresa tabelului de simboluri cu codurile 128-255

Unele dintre cele enumerate în tabel. 3 întreruperi oferă acces la mai multe funcții interconectate. Fiecare funcție este identificată prin numărul său hexazecimal (cod) și efectuează o anumită operație.

Deci, de exemplu, întreruperea 19 (controlul NGMD și NMD) oferă acces la 18 funcții cu codurile 0-17):

0 - instalare inițială (resetarea discului),

1 - afișarea stării curente a discului,

2 - citirea unui grup (bloc) de sectoare dintr-o singură pistă,

3 - înregistrarea unui grup de sectoare pe o singură pistă,

4 - verificare după citire sau scriere,

5 - formatarea piesei (înregistrare marcaje sectorului),

8 - emiterea de curent parametrii de unitate,

9 - inițializarea tabelului de parametri disc fix,

A - citire „lungă”,

B - intrare „lungă”,

C - căutați piesa dorită,

D - initiala instalare pe disc,

10 - verificarea pregătirii discului,

11 - calibrarea discului,

14 - diagnosticare controler,

15 - problema tipul de unitate,

16 - schimbați starea discului,

17 - setarea tipului de unitate.

Adâncimea întreruperii- numărul maxim de programe care se pot întrerupe reciproc. Adâncimea întreruperii se potrivește de obicei cu numărul de niveluri de prioritate recunoscute de sistemul de întrerupere. Funcționarea sistemului de întrerupere la diferite adâncimi de întrerupere (n) este prezentată în Fig. 10. Se presupune aici că pe măsură ce numărul cererii de întrerupere crește, prioritatea acestuia crește.

Orez. 14. Funcționarea sistemului de întrerupere la diferite adâncimi de întrerupere

Când se primește o cerere de întrerupere, computerul se execută următoarea secvență actiuni:

1) determinarea celei mai mari cereri de întrerupere nemascata (dacă au fost primite simultan mai multe cereri);

2) determinarea tipului cererii selectate;

3) salvarea stării curente a contorului programului și a registrului de steag;

4) determinarea adresei operatorului de întrerupere după tipul de întrerupere și transferarea controlului la prima comandă a acestui handler;

5) executarea programului - handler de întreruperi;

6)restaurarea valorilor salvate ale contorului programului și registrului de flag al programului întrerupt;

7) continuarea executării programului întrerupt.

Etapele 1-4 sunt efectuate automat de hardware-ul computerului atunci când apare o solicitare de întrerupere. Etapa 6 este, de asemenea, executată în hardware pe o instrucțiune de returnare de la manipulatorul de întreruperi.

Se efectuează tranziția la gestionarea de întreruperi corespunzător (în modul real operarea cu microprocesor) prin tabelul vector de întrerupere. Acest tabel se află la cele mai mici adrese memorie cu acces aleator, are un volum de 1 KB și conține valorile registrului de segmente de comandă (CS) și pointerului de instrucțiuni (IP) pentru 256 de gestionare de întreruperi.

Vector de întrerupere– o celulă de memorie care conține adresa operatorului de întrerupere.

Vectorii de întrerupere sunt combinați într-un tabel de vectori de întrerupere. Locația tabelului depinde de tipul și modul de funcționare al microprocesorului.

Principalele funcții ale mecanismului de întrerupere:

1.Recunoașterea sau clasificarea întreruperii.

2. Transferul controlului către operatorul de întrerupere.

3. Revenirea corectă la programul întrerupt

Trecerea de la programul întrerupt la handler și înapoi trebuie făcută cât mai repede posibil. Unul dintre metode rapide este de a folosi un tabel care să conțină o listă cu toate întreruperile permise pentru computer și adresele handler-urilor corespunzători. Pentru a reveni corect la un program întrerupt, înainte de a transfera controlul către handler, conținutul registrelor procesorului este stocat fie în memoria cu acces direct, fie pe stiva de sistem.

Deoarece semnalele de întrerupere apar în momente aleatorii, în momentul întreruperii pot exista mai multe semnale de întrerupere care pot fi procesate numai secvenţial. Pentru a procesa semnalele de întrerupere într-o ordine rezonabilă, li se atribuie priorități. Programele, prin gestionarea registrelor speciale de măști, vă permit să implementați diverse discipline de servicii:

întreruperi imbricate.

Pentru întreruperi imbricate, procedura de procesare întrerupere curentă poate fi întrerupt (întârziat) la primirea unei cereri de întrerupere care are un nivel de prioritate mai mare. După procesarea unei întreruperi cu mai multe nivel inalt cu prioritate, procesorul revine la procedura întreruptă și continuă procesarea acestei întreruperi până când se încheie sau până când apare o nouă întrerupere. Evident, o rutină de serviciu de întrerupere cu un nivel de prioritate mai mare poate fi, la rândul său, întreruptă de o întrerupere cu un nivel de prioritate și mai mare și așa mai departe. În același timp, întreruperi care au mai multe nivel scăzut prioritate față de cea actuală sunt de obicei interzise (mascate).

3. Exemple de întreruperi

3.1. Întreruperea când semnalul se schimbă pe porturile I/O (exemplu în PROTEUS)

3.2. Întreruperea externă INT (exemplu în PROTEUS)

Toate tipurile de microcontrolere dsPIC au aceleași întreruperi. Prin urmare, puteți studia în siguranță întreruperile în programul PROTEUS. Pentru studiu vom folosi un microcontroler, care este disponibil în PROTEUS.

Deci, ce fel de întreruperi există în microcontrolerul dsPIC33FJ32GP204?

Și există o mulțime de întreruperi în microcontroler. Și nu are sens să enumeram totul în această prelegere. La urma urmei, primul lucru la care acordăm atenție atunci când alegem un microcontroler este ce module are și abia apoi ne uităm la ce întreruperi are. De asemenea, vom studia totul în aceeași succesiune. Pe măsură ce studiem microcontrolerul, vom analiza întreruperile diferitelor module.

În general, trebuie să știți că pentru microcontroler există un tabel de vectori de întrerupere, care se află în memoria programului. Fiecare întrerupere are propriul său vector, adică adresa de început a rutinei specifice de întrerupere (ISR). Există, de asemenea, un tabel alternativ de vectori de întrerupere. Folosind un singur bit ALTINV, puteți specifica din ce tabel ar trebui luată adresa rutinei de întrerupere. Adică, există o alternativă la masa principală. Dar trebuie să rețineți că bitul ALTINV este folosit pentru întreaga tabelă simultan. Și dacă este instalată un tabel alternativ, atunci absolut toate adresele subrutinei de gestionare a întreruperilor, programul principal va fi preluat din tabelul alternativ. Tabelul alternativ este foarte util pentru modul de depanare, deoarece vă permite să scrieți un program în controler o dată și, folosind, de exemplu, un buton, să alegeți între doi algoritmi de program.

dsPIC a extins gama de priorități de întrerupere. Dacă în PIC18 erau doar 2, atunci în dsPIC există deja 8 niveluri. Și când dezvoltam un modul de comunicare prin Canal GPRS, acest lucru mi-a fost foarte util, deoarece microcontrolerul folosea aproape toate perifericele disponibile la bord, iar numărul de întreruperi procesate a fost de aproximativ douăzeci.

Cel mai important lucru pe care trebuie să-l știți este că, pentru a lucra cu fiecare întrerupere, există doar 3 biți principali (registri): bitul de activare a întreruperii, indicatorul de întrerupere și trei biți de selecție a priorității întreruperii.

Deci, de ce are nevoie un programator de la un programator pentru a lucra cu o întrerupere:

1. Trebuie să activeze o anumită întrerupere.

2. După ce a avut loc evenimentul care a cauzat întreruperea, este setat indicatorul de întrerupere corespunzător, iar programul, ca să spunem așa, se deplasează de-a lungul vectorului de întrerupere. Și dacă spunem în limbajul obișnuit: atunci de îndată ce apare o întrerupere, subrutina pentru procesarea unei anumite întreruperi va fi apelată imediat.

3. Principalul lucru este să nu uitați să resetați steagul acestei întreruperi în subrutina de întrerupere.

Pentru microcontrolerul dsPIC, compilatorul C30 oferă următoarea regulă pentru descrierea rutinelor de gestionare a întreruperilor, de exemplu pentru întreruperea INT1:

vid __ atribut__((__ întrerupe__)) _ INT1 Întrerupe()

Principalul lucru la care trebuie să acordați atenție este sfârșitul textului titlului subrutinei: _ INT1 Întrerupe() - acesta este singurul parametru pentru care trebuie schimbat tipuri variateîntrerupe. Fiecare întrerupere din tabelul de vectori de întrerupere are propria sa denumire acest parametru. Și aici va trebui să deschideți fișierul de ajutor pentru compilatorul C30, în special secțiunea (am asta...) „dsPIC30F DSCs (SMPS) Interrupt Vectors” și să priviți tabelul pentru care întrerupere ar trebui apelată în ce fel . Nu cred că este recomandabil să prezentați acest tabel în acest articol, deoarece oricine are un compilator C30 ar trebui să aibă atașat un fișier de ajutor hlpMPLABC30.chm(personal, așa numesc eu). Și pentru cei care nu au acest compilator, nu au nevoie de un tabel J. Bine, hai să ne divagăm...

Apropo, dacă vă familiarizați mai profund cu principiile descrierii funcției de întrerupere, veți găsi prezența unui atribut special auto_psv. Acest parametru este destinat să instruiască microcontrolerul că ar trebui să salveze registrele principale înainte de a continua să întrerupă procesarea. Presupun că știți de ce trebuie să salvați registrele cheilor.

De exemplu, descrierea întreruperii ar arăta astfel:

vid__attribute__((intrerupere, auto_psv)) _INT1Interrupt()

Mai sus a fost un exemplu de antet de apel de subrutină folosind adresa tabelului principal. Și pentru un tabel alternativ trebuie doar să introduceți în parametrul variabil după liniuță Alt, De exemplu:

_ INT1 Întrerupe() -> _ AltINT1 Întrerupe()

Aș dori să vă atrag atenția asupra faptului că, deși subrutina de întrerupere arată ca o subrutină, nu trebuie să fie declarată, la fel ca principal , deoarece este deja declarat de compilator, trebuie doar să scrieți corect antetul subrutinei de gestionare a întreruperilor.

Să începem prin a studia întreruperile elementare și apoi, pe măsură ce studiem fiecare modul, ne vom familiariza cu întreruperile inerente acestora.

3.1. Întreruperea când semnalul se schimbă pe porturile I/O (CN)

Una dintre cele mai ușor de înțeles întreruperi este întreruperea de schimbare a stării la intrarea CN. Microcontrolerul dsPIC33FJ32GP204 este plin de astfel de intrări, așa că cred că acest număr va satisface orice nevoie. Indiferent de ce stare se schimbă pe aceste canale (1 -> 0 sau 0 -> 1), această modificare, dacă este activată, va determina setarea flag-ului CNIF. Pentru a activa o întrerupere atunci când un semnal se schimbă, trebuie să faceți următoarele:

1. Configurați canalele necesare CN la intrare (folosind registrul TRISx).

2. Activați controlul modificărilor semnalului la intrarea CN corespunzătoare. Pentru aceasta există deja 2 registre CNEN1 și CNEN2. Puteți fie să accesați fiecare registru în întregime pentru setare, fie să accesați biții corespunzători (de exemplu, _CN15IE=1; _CN6IE=1;)

3. Dacă este necesar, porniți rezistențele de tragere. În acest scop există și două registre CNPU1 și CNPU2. Este posibil și separat, de exemplu _CN15PUE=1; _CN6PUE=1;

4. Activați întreruperea când semnalul se schimbă pe CN ( _ CNIE=1 )

5. Acum, de îndată ce semnalul de pe pinii CN controlați se schimbă, va fi setat indicatorul de întrerupere _CNIF. Și programul intră în funcția de gestionare a întreruperilor. Compilatorul C30 pentru întrerupere când un semnal se schimbă pe CN oferă următoarea descriere a funcției:

vid __ atribut __((__ întrerupe __)) _ CNInterrupt ()

Aici este procesată această întrerupere (vezi exemplul)

6. În subprogramul de gestionare a întreruperilor, nu uitați să resetați indicatorul de întrerupere.

Pentru a vă familiariza cu acest tip de întrerupere, luați în considerare următorul exemplu. Există un motor și 4 senzori. Când totul este în ordine, motorul ar trebui să se rotească în sens invers acelor de ceasornic. Dar de îndată ce starea senzorului se schimbă ( modul de urgență) – motorul ar trebui să înceapă imediat să se rotească reversul(în sensul acelor de ceasornic). Și după o anumită perioadă de timp, începeți să vă rotiți din nou în sens invers acelor de ceasornic.

Un detector de metale este implementat în mod similar pe mașinile de recoltat. Când, de exemplu, iarba cosită intră în mașină, aceasta Mod normal muncă. Dar de îndată ce detectorul de metale detectează un obiect metalic, acesta se întoarce instantaneu și mașina pare să scuipe acest obiect metalic pentru a nu deteriora mecanismul. Și metalul este detectat de un senzor special, format din mai multe canale independente, dar combinate într-unul singur dispozitiv general. În exemplul nostru, desigur, vom simplifica totul foarte mult; în loc de un senzor de prezență metalic, vom folosi butoane obișnuite.

Asamblarea circuitului în PROTEUS

Acum să creăm un program pentru a finaliza sarcina.

# include " p33 Fxxxx. h"

_ FOSCSEL(0 X02);

_ FOSC(0 xE2);

char stat; // variabila stocheaza sensul de rotatie al motorului

// "1" - modul de urgență, "0" - modul normal

vid init (vid);

vid init (vid)

{ _ CN8 PUE=1; //porniți rezistența de tragere la intrarea CN8 (RC0)

_ CN10 PUE=1; //porniți rezistența de tragere la intrarea CN10 (RC2)

_ CN17 PUE=1; //porniți rezistența de tragere la intrarea CN17 (RC7)

_ CN19 PUE=1; //porniți rezistența de tragere la intrarea CN19 (RC9)

ANUNȚ1 PCFGL=0 xffff;

PORTC=0; // inițializați portul C

LATC=0;

TRISC=0 xFFFF; // setați portul C ca intrare

PORTC=0 xFFFF;

PORTA=0; // inițializați portul A

LATA=0;

TRISA=0; // Setați toate ieșirile la ieșire,

PORTA=0;

_ CN8 I.E.=1; // permite controlul modificărilor semnalului la

_ CN10 I.E.=1; // ieşirile corespunzătoare

_ CN17 I.E.=1; // dacă semnalul se schimbă asupra lor, atunci

_ CN19 I.E.=1; // flag de întrerupere _CNIF este setat

_ CNIE=1; // activează întreruperea INT1

vid __ atribut__((__ întrerupe__)) _ CNInterrupt()

stat=1; // acesta este modul de urgență

_ CNIF=0; // resetați indicatorul de întrerupere când semnalul se schimbă

vid principal (vid)

{ static lung int i;

init();

stat=0; // presupunem că modul de operare la pornire este normal

in timp ce(1) // începe o buclă nesfârșită

{ dacă (stat) // dacă este modul de urgență, atunci

{ _ CNIE=0; // dezactivează întreruperea când semnalul se schimbă

_ R.A.8=0;

_ R.A.0=1; // în modul de urgență

pentru(i=0; i<210000; i++) //oferă întârziere

stat=0; // activează funcționarea normală a motorului

_ CNIE=1; // activează întreruperile CN

{ _ R.A.8=1; // în modul normal

_ R.A.0=0; // furnizează sensul de rotație al motorului

} // în timp ce(1)

3.2. Întreruperea externăINT

Dacă aveți nevoie ca microcontrolerul dvs. să răspundă imediat la dispozitivele externe, atunci întreruperea INT este ceea ce aveți nevoie. Microcontrolerul dsPIC33FJ32GP204 are trei canale INT (INT0, INT1, INT2). Adică, puteți furniza propria întrerupere pentru fiecare dintre cele trei dispozitive externe. Această întrerupere este bună deoarece poate trezi controlerul din modul SLEEP. În plus, nu trebuie să scanați în mod continuu aceste intrări, ceea ce ar consuma resursele microcontrolerului.

O întrerupere INT apare atunci când semnalul de intrare se schimbă fie „0” -> „1” fie „1” -> „0”. Depinde de starea bitului _INT1EP. Dacă _INT1EP=1, apoi pe muchia de cădere; Dacă _INT1EP=0, apoi de-a lungul muchiei de conducere (de exemplu _INT1EP=1 – întreruperea INT0 are loc pe o margine descendentă).

În ceea ce privește prioritatea, întreruperea INT0 are cea mai mare prioritate, iar în tabelul de întreruperi este chiar primul. Mai jos sunt întreruperile INT1 și INT2.

În principiu, acestea sunt toate caracteristicile acestei întreruperi. Orice altceva este la fel ca pentru alte întreruperi, adică trebuie să activați întreruperea externă corespunzătoare. Și dacă apare o întrerupere, va seta indicatorul corespunzător _INTхIF (de exemplu _INT1IF). Nu uitați să-l resetați. În general, totul este la fel de simplu ca decojirea perelor.

Să trecem la un exemplu

Emitem apel electronic la un apartament sau o casă. Când apăsați butonul, dispozitivul ar trebui să se emită semnal sonorși faceți cu ochiul cu lumină (pentru cei cărora le place să asculte muzică tare).

Facem un circuit în PROTEUS; pe lângă microcontroler, vom avea nevoie de un buton, un beeper și un LED.

Cred că totul este foarte clar în imagine. Să trecem la program.

#include"p33Fxxxx. h"

// Setați biții de reglare a oscilatorului (HS)

_ FOSCSEL(0 X02);

_ FOSC(0 xE2);

charstat;// "1" - activați soneria, "0" - dezactivați soneria

vidinit(void);//declară rutina de inițializare

// ** inițializare subrutine **

vidinit(void)

(_CN4PUE=1;//porniți rezistența de tragere la intrarea CN4 (RB0)

AD1PCFGL=0xffff;// toți pinii ca I/O digitale

PORTB=0x00;// inițializați portul B

LATB=0;

TRISB=0x0001;// setează ieșirea RB0 la intrare

PORTB=0x00;

// inițializarea portului C.

PORTC=0;

LATC=0;

TRISC=0;//setează toți pinii ca ieșire

PORTC=0;

RPINR0=0x0000;// semnalul INT1 este configurat pentru a elimina din pinul RP0 (RB0) (acest

// Comanda nu este pentru toate dsPIC

_INT1EP=1;// Întreruperea INT1 are loc pe marginea descendentă

_INT1IE=1;// activează întreruperea INT1

// ******* subrutina de gestionare a întreruperii *

vid __ atribut__((__ întrerupe__)) _ INT1 Întrerupe()

stat=1; // apelul trebuie să fie activat

_ INT1 DACĂ=0; // resetează indicatorul de întrerupere INT1

// **** Punct de intrare în program *

vid principal (vid)

{ static lung int i; //declară o variabilă pentru a organiza o întârziere

init();// apelează subrutina de inițializare

stare=0;// mai întâi apelul trebuie oprit

în timp ce (1)// începe o buclă nesfârșită

(daca (stat)// dacă starea este „1”, atunci

( _RC0=1;// aprinde LED-ul

_RC2=1;// pornește beeper-ul

pentru(i=0;i<160000;i++) // întârziere, asigură un anumit timp de joc

stare=0;// indică faptul că beeper-ul trebuie oprit

altfel// în caz contrar, dacă starea este „0”, atunci

( _RC0=0;// stinge LED-ul

_RC2=0;// încetează să sune

} // în timp ce(1)

Lucrați în mod similar cu întreruperile INT0 și INT2. În alte exemple, vom folosi aceste întreruperi de mai multe ori.

Mecanismul de prioritate (MP) arată ce dispozitive trebuie întreținute mai întâi. MP rezolvă următoarele probleme:

    Fixează prioritatea oricărui program executat de procesor.

    Identifică o solicitare de la o gazdă cu prioritate maximă.

    Permite întreruperea programului atunci când apare o solicitare cu prioritate ridicată.

O întrerupere a unei rutine de serviciu de întrerupere se numește întrerupere imbricată.

Orez. 6.4 Exemplu de funcționare a CPU în modul de întrerupere imbricată.

Figura 6.4 prezintă un exemplu de întrerupere imbricată:

    Inainte de t 1 nici un salariu

    t 1 → Salariu de la VU4

    t 2 → Salariu de la VU3

    t 3 → Salariu de la VU2

    t 4 → service-ul VU2 este finalizat

    t 5 → Salariu de la VU1

    t 6 → service-ul VU1 este finalizat

    t 7 → service-ul VU3 este finalizat

    t 8 → service-ul VU4 este finalizat

Dezavantaj: Cu o frecvență mare de primire a PO, CPU funcționează ineficient, deoarece Mult timp CPU este cheltuit procesării, restabilirii registrelor procesorului și trecerii de la un program la altul.

Puteți reduce frecvența stocării activând stocarea tampon.

La atribuirea priorităților VA, se iau în considerare următoarele condiții:

    Cu cât dispozitivul este mai rapid, cu atât este mai mare prioritate.

    Cea mai mare prioritate este atribuită dispozitivului de pe care datele nu pot fi recuperate (de obicei, un cronometru).

    În familia calculatoarelor Macintosh Prioritatea programului este indicată în al doilea cuvânt al VI.

    În familia calculatoarelor IBMPC Prioritatea programului este setată folosind un LSI (circuit integrat mare) special - controler programabil de întrerupere.

Implementarea tehnică a întreruperilor vectoriale cu prioritate imbricată pe mai multe niveluri într-un computer bazat pe un singur canal principal de schimb de date.

Implementarea VP-urilor pe mai multe niveluri în calculatoarele de familieIBM .

Pentru implementarea VP-urilor pe mai multe niveluri în computerele familiei IBM BIS aplicat Intel 8259A.

Caracteristicile tehnice ale Intel 8259a encore.

    Numărul de niveluri salariale = 8.

    Numărul de niveluri poate fi extins la 64 prin cipuri în cascadă

    Modul de serviciu PO, nivelurile de prioritate și WUA-urile sunt setate în mod programatic.

    Implementarea tehnică a întreruperilor vectoriale prioritare în calculatoare cu canale principale izolate de schimb de date (familie IBMLA): moduri de funcționare ale controlerului de întrerupere programabil (PIC),

diagrama de conectare a panoului de control la autostrada de sistem,

Schema de conectare a panoului de control la magistrala de sistem a computerului.

Orez. 6.7 Diagrama de conectare a panoului de control la magistrala de sistem și la unitatea de control.

Scopul pinurilor LSI:

    D7- D0 – Pinii SD sunt utilizați pentru a primi informații de control de la CPU și pentru a transmite informații de stare către CPU.

    A0 – intrare adresa, adresarea registrelor interne ale controlerului (2 adrese).

    ~ C.S. (cip Selectați) - selecția cristalului, permite sau dezactivează comunicarea între controler și magistrala de sistem.

    • ~C.S.= 0 – există o conexiune, ~ C.S.= 1 – fără conexiune.

Primul panou de control folosește adrese – 20 h, 21 h.

Al doilea panou de control folosește adrese - A0 h, A1 h.

    ~ R.D., ~ WR– intrare, ieșire (semnale camera de control), conectate la liniile principale ~ IORşi ~IOW.

    INT(ieșire) – semnal ZP către CPU.

    ~INTA (confirmare întrerupere)– Semnal RP de la CPU.

    CAS2, CAS1, CAS0 – autobuz în cascadă. Pentru controlerul de întrerupere master aceste linii sunt ieșiri, iar pentru slave sunt intrări.

    ~ SP/~ RO– indică panoul de control master (1) sau slave (0).

    IR0... IR7 – intrări de cereri de întrerupere de la gazdă.

compoziția funcțională și modelul software al panoului de control.

Cele mai importante caracteristici ale unui sistem de întrerupere sunt adâncimea și prioritatea întreruperii. Există un sistem de întrerupere cu un singur nivel și pe mai multe niveluri într-un computer. În sistemele cu un singur nivel, procesarea întreruperilor nu reacționează la semnalele de la alte întreruperi de intrare. Cererile de întrerupere în astfel de sisteme sunt satisfăcute numai după ce procesarea întreruperii întâlnite anterior a fost finalizată. PC-urile moderne folosesc sisteme pe mai multe niveluri care permit întreruperi de diferite adâncimi. Adâncimea de întrerupere este numărul maxim de programe ISR care se pot întrerupe reciproc. În acest caz, dacă adâncimea de întrerupere este n, atunci n subrutine pot fi întrerupte. Profunzimea posibilelor întreruperi depinde de clasa sarcinilor care se rezolvă și este determinată de organizarea cozii de procesare a întreruperilor. Solicitările de întrerupere primite simultan către registrul de întreruperi MP sunt procesate conform principiului priorității. Întreruperile cu cea mai mare prioritate sunt deservite mai întâi. Când sunt primite cereri de întrerupere, declanșatorul corespunzător din registrul de întrerupere este setat la 1. Înainte de a finaliza execuția următoarei comenzi, MP interogează registrul de întreruperi. Ordinea de implementare a cererilor de întrerupere este stabilită în ordinea de prioritate atribuită anterior fiecărui tip de întrerupere. Atribuirea priorității este o sarcină complexă care necesită luarea în considerare a importanței și urgenței deservirii anumitor întreruperi. De obicei, managementul energiei și întreruperile de eroare ale mașinii au cea mai mare prioritate.

Întreruperea rutinelor ISR se numește imbricare întrerupere. Pentru a organiza întreruperi imbricate în fiecare rutină de serviciu de întrerupere, trebuie să efectuați:

1. activați întreruperea prin comanda EI

2. amintiți-vă temporar prioritatea programului întrerupt

3. încărcați noua prioritate de curent în circuitul de întrerupere prioritară

4. service această întrerupere

5. restabiliți prioritatea anterioară

6. restabiliți programul întrerupt (comanda IRET)

Întreruperi hardware:

Intern (de la procesor și coprocesor)

Extern:

Mascabil

Demascat

Software-ul numit întreruperi

Întreruperile interne includ, de asemenea, software-ul numit întreruperi. Întreruperile MP interne sunt generate atunci când apar condiții speciale în timpul executării comenzii curente (exemplu: împărțirea la zero, depășirea grilei de biți etc.).

Întreruperile numite de software sunt executate sub acțiunea comenzii INT, iar în acest caz acțiunile MP sunt similare cu apelarea programului ISR, adică. salvând adresa de retur pe stivă, transferând controlul către adresa specificată, dar există câteva diferențe:

A) întreruperea este executată, împinsă pe stivă și bitul IF (activare întrerupere) din registrul de flags este resetat la 0.

B) în loc de adresa subrutinei apelate, argumentul de apel este numărul vectorului de întrerupere.

B) la finalizarea procedurii software numită întrerupere, procesorul scoate din stivă, pe lângă adresa de retur, valoarea stocată a registrului de steaguri. Întreruperile denumite software vă permit să apelați ușor și rapid proceduri din orice segment de memorie, fără a utiliza apeluri la distanță lungă. De exemplu, întreruperea software INT3 este folosită în mod tradițional pentru depanarea programelor pentru a crea un punct de întrerupere și este apelată de o instrucțiune pe un singur octet.

Numele parametrului Sens
Subiect articol: întreruperi.
Rubrica (categoria tematica) Programare

Temporizatoare de supraveghere.

Adesea, zgomotul electric produs de echipamentele din jur determină microcontrolerul să adreseze o adresă greșită, după care comportamentul său devine imprevizibil (microcontrolerul „înnebunește”). Pentru a monitoriza astfel de situații, cronometrele de supraveghere sunt adesea incluse în microcontroler.

Acest dispozitiv determină resetarea microcontrolerului dacă conținutul său nu este actualizat într-o anumită perioadă de timp (de obicei, de la zeci de milisecunde până la câteva secunde). Dacă modificarea conținutului contorului programului nu corespunde programului specificat, comanda de modificare a temporizatorului watchdog nu va fi executată. În acest caz, timer-ul watchdog resetează microcontrolerul, punându-l la starea inițială.

Mulți dezvoltatori nu folosesc temporizatoare watchdog în aplicațiile lor, deoarece nu văd importanța critică a utilizării acestora pentru a combate efectele zgomotului electric, de exemplu, atunci când plasează microcontrolerul într-un afișaj cu raze catodice în apropierea sau în apropierea unui transformator flyback. bobine într-o mașină. În electronica modernă, probabilitatea apariției unor perturbări electrice este neglijabilă, deși acestea apar uneori în situații similare celor enumerate mai sus.

Nu este recomandat să folosiți un timer watchdog pentru a masca problemele software. Deși acest temporizator poate reduce probabilitatea erorilor software, este puțin probabil să elimine toate cauzele posibile ale apariției acestora. În loc să vă bazați pe hardware pentru a preveni defecțiunile software, este mai bine să testați software-ul mai amănunțit în diferite situații.

Mulți utilizatori cred că întreruperile sunt o piesă hardware care este cel mai bine lăsată în pace, deoarece utilizarea lor necesită cunoștințe superioare despre procesor pentru a proiecta rutina de întrerupere. În caz contrar, atunci când are loc o întrerupere, sistemul „adoarme” sau „înnebunește”. Acest sentiment apare de obicei unui dezvoltator după experiența cu întreruperi pentru un computer personal, care are o serie de caracteristici care complică crearea unui handler de întreruperi. Multe dintre aceste probleme nu apar în hardware-ul bazat pe microcontrolere. Utilizarea întreruperilor în acest echipament poate simplifica semnificativ dezvoltarea și utilizarea acestuia.

Dacă nu te-ai ocupat niciodată de întreruperi, atunci vei avea o întrebare - ce este? Într-un sistem informatic, o întrerupere este execuția unei rutine speciale (numite gestionare de întreruperi sau rutină de serviciu de întrerupere) care este apelată de un semnal hardware. În timpul execuției acestei subrutine, implementarea programului curent se oprește. Termenul „cerere de întrerupere” este folosit deoarece uneori un program refuză să recunoască o întrerupere și să execute imediat gestionarea întreruperilor (Figura 2.19).

Întreruperile dintr-un sistem informatic sunt similare cu întreruperile din viața de zi cu zi. Un exemplu clasic de astfel de întrerupere este un apel telefonic în timp ce vizionați un program de televiziune. Când sună telefonul, aveți trei opțiuni. Primul este să ignori apelul. Al doilea este să răspundeți la apel, dar spuneți că veți suna mai târziu. Al treilea este să răspunzi la apel, lăsând deoparte toate treburile curente. Sistemul informatic are, de asemenea, trei răspunsuri similare care pot fi utilizate ca răspuns la o solicitare hardware externă.

Primul răspuns posibil - „nu răspundeți la întrerupere până când sarcina curentă nu este finalizată” - este implementat prin dezactivarea (mascarea) deservirii cererii de întrerupere. După finalizarea sarcinii, este posibilă una dintre cele două opțiuni: resetarea măștii și activarea întreținerii, ceea ce va duce la apelarea operatorului de întrerupere sau analizarea valorii biților ("polling"). indicând primirea cererilor de întrerupere și execuția directă a programului de service fără apelarea operatorului de întrerupere. Această metodă de gestionare a întreruperilor este utilizată atunci când este necesar să se asigure timpul de execuție specificat al programului principal, deoarece orice întrerupere poate perturba implementarea unei interfețe extrem de importante.

Orez. 2.18 - Executarea unei întreruperi.

Nu este recomandat să mascați întreruperile pentru o perioadă lungă de timp, deoarece în acest timp se pot suprapune mai multe evenimente de întrerupere și doar unul va fi recunoscut. Durata admisibilă a mascării depinde de aplicația specifică a microcontrolerului, de tipul și frecvența unor astfel de evenimente. Nu este recomandat să dezactivați întreruperile pentru mai mult de jumătate din perioada minimă așteptată de evenimente care solicită întreruperi.

Managerul de întreruperi oferă întotdeauna următoarea secvență de acțiuni:

2. Resetați controlerul de întrerupere și echipamentul care a cauzat solicitarea.

3. Prelucrați datele.

4. Restaurați conținutul registrelor de context.

5. Reveniți la programul întrerupt.

Registrele context sunt registre care determină starea curentă de execuție a programului principal. De obicei, acestea includ un numărător de programe, registre de stare și acumulatori. Alte registre de procesor, cum ar fi registrele de index, sunt utilizate în timpul procesării întreruperilor, astfel încât conținutul lor este, de asemenea, esențial de păstrat. Toate celelalte registre sunt specifice unui anumit microcontroler și aplicației sale.

Odată resetat, controlerul de întrerupere este gata să accepte următoarea cerere, iar echipamentul care provoacă întreruperi este gata să trimită cererea atunci când apar motivele adecvate. Dacă sosește o nouă cerere de întrerupere, registrul de mascare a întreruperilor al procesorului va împiedica procesarea întreruperii, dar registrul de stare a întreruperii va captura cererea, care va aștepta serviciul. După finalizarea procesării întreruperii curente, masca de întrerupere va fi resetată, iar cererea nou primită va fi procesată.

Întreruperile imbricate sunt greu de implementat pe unele tipuri de microcontrolere care nu au o stivă. Aceste întreruperi pot cauza, de asemenea, probleme de depășire a stivei. Problema overflow este relevantă pentru microcontrolere datorită capacității limitate a memoriei și a stivei lor de date: o secvență de întreruperi imbricate poate duce la împingerea mai multor date în stivă decât este permis.

În cele din urmă, întreruperea este procesată. Al doilea exemplu TV arată că puteți răspunde rapid la o solicitare de întrerupere acceptând datele necesare, care vor fi apoi folosite după rezolvarea sarcinii curente. În microcontrolere, acest lucru este implementat prin stocarea datelor primite într-o matrice de memorie și apoi procesarea lor când execuția programului original este finalizată. Această metodă de întreținere este un bun compromis între gestionarea imediată completă a întreruperii, care poate dura mult timp, și ignorarea întreruperii, ceea ce poate duce la pierderea informațiilor despre evenimentul care a provocat întreruperea.

Restaurarea registrelor de context și executarea instrucțiunii de returnare a întreruperii readuce procesorul la starea în care se afla înainte de apariția întreruperii.

Să ne uităm la ce se întâmplă cu conținutul diferitelor registre atunci când este procesată o întrerupere. Conținutul registrului de stare este de obicei salvat automat împreună cu conținutul contorului de programe înainte ca întreruperea să fie procesată. Acest lucru elimină necesitatea critică de a-l stoca în memorie în mod programatic, utilizând instrucțiuni de transfer, și apoi de a-l restabili când revine la programul original. Cu toate acestea, o astfel de salvare automată nu este implementată în toate tipurile de microcontrolere; prin urmare, trebuie acordată o atenție deosebită organizării procesării întreruperilor.

Dacă conținutul registrului de stare este salvat înainte ca handlerul de întrerupere să înceapă să execute, atunci comanda return îl restabilește automat.

Dacă conținutul altor registre de procesor se modifică în timpul serviciului de întrerupere, ele trebuie, de asemenea, stocate în memorie înainte de modificare și restaurate înainte de a reveni la programul principal. Este o practică obișnuită să salvați toate registrele procesorului pentru a evita erorile imprevizibile care sunt foarte greu de localizat.

Adresa care este încărcată în contorul de programe atunci când treceți la manipulatorul de întreruperi este de obicei numită „vector de întrerupere”. Există mai multe tipuri de vectori. Adresa care este încărcată în contorul de programe atunci când microcontrolerul este pornit (resetare) este de obicei numită „vector de resetare”. Diferite întreruperi au vectori diferiți, ceea ce scutește programul de întreținere de nevoia critică de a determina cauza întreruperii. Utilizarea unui vector prin diferite întreruperi, de obicei, nu cauzează probleme la operarea microcontrolerelor, deoarece cel mai adesea microcontrolerul execută un singur program. Acest lucru distinge un microcontroler de un computer personal, în timpul căruia pot fi adăugate diverse surse de întrerupere. (Dacă ați conectat vreodată două dispozitive la porturile COM1 și COM3, atunci aveți o idee despre ce vorbim). Într-un microcontroler în care hardware-ul este bine cunoscut, nu ar trebui să existe nicio problemă la partajarea vectorilor de întrerupere.

Ultimul lucru care rămâne de luat în considerare sunt întreruperile software. Există instrucțiuni de procesor care pot fi folosite pentru a simula întreruperi hardware. Cea mai evidentă utilizare a acestor instrucțiuni este apelarea rutinelor de sistem care sunt situate într-o locație de memorie arbitrară sau necesită salturi de intersegment pentru a le accesa. Această caracteristică este implementată în familia de microprocesoare Intel i86 și este utilizată în sistemul de operare BIOS (Basic Input/Output System) și DOS al computerelor personale pentru a apela rutinele sistemului fără necesitatea critică de a fixa punctul de intrare. În schimb, diverși vectori de întrerupere sunt utilizați pentru a selecta instrucțiunea care trebuie executată atunci când are loc o astfel de întrerupere software.

Poate după ce ați citit acest capitol, mecanismul de întrerupere va deveni mai clar pentru dvs. sau invers. Vei deveni doar mai confuz. Pe măsură ce este descris fiecare microcontroler, se va arăta cum utilizarea întreruperilor poate simplifica utilizarea acestuia.

întreruperi. - concept și tipuri. Clasificarea și caracteristicile categoriei „Întreruperi”. 2017, 2018.