Keskeytys AVR-ohjaimessa Atmel AVR Studiossa. Keskeytykset - AVR:n opiskelu - Artikkeliluettelo - Mikro-ohjaimet - se on helppoa! Missä ympäristössä ohjelmoida mikro-ohjaimen keskeytykset

Keskeytysjärjestelmät ovat tärkeä osa mitä tahansa ohjausjärjestelmää.

Se, kuinka tehokkaasti mikroprosessorijärjestelmä suorittaa tehtävänsä, riippuu pitkälti sen toiminnasta. MK-51-keskeytysjärjestelmän yleinen rakenne on esitetty kuvassa. 14.3.

MK-51-perheen mikro-ohjaimet tukevat viittä keskeytyslähdettä:

* kaksi ulkoista keskeytystä, jotka saapuvat tulojen INT0 ja INT1 kautta (porttilinjat P3: P3.2 ja P3.3, vastaavasti);

* kaksi keskeytystä ajastimista/laskureista T/C0 ja T/C1;

* sarjaportin keskeytys.

Keskeytyspyynnöt tallennetaan mikro-ohjaimen erikoistoimintorekistereihin: liput IE0, IE1, TF0, TF1 keskeytyspyynnöt INT0, INT1, T/C0 ja T/C1 ovat TCON-ohjausrekisterissä (taulukko 14.4) ja liput RI. ja TI pyytää keskeytystä sarjaportista - SCON-rekisterissä sarjaportin ohjaamiseksi.

Taulukko 14.4. TCON-rekisterimuoto

0 IT0 Keskeytyksen tyypin asettaminen INT0

1 IE0 Keskeytyspyynnön lippu INT0

2 IT1 Keskeytyksen tyypin asettaminen INT1

3 IE1 keskeytyspyynnön lippu INT1

4 TR0 Ota ajastin/laskuri käyttöön 0

5 TF0 Ylivuotolippu (keskeytyspyyntö) ajastin/laskuri 0

6 TR1 Ota ajastin/laskuri käyttöön 1

7 Ajastimen/laskurin TF1 ylivuotolippu (keskeytyspyyntö) 1

Liput TF0 ja TF1 asetetaan laitteistolla, kun vastaava ajastin/laskuri vuotaa yli (tarkemmin, kun T/Cx siirtyy "kaikki ykköset" -tilasta "kaikki nollia" -tilaan).

Liput IE0 ja IE1 asetetaan laitteistolla ulkoisista keskeytyksistä IT0 ja IT1. Ulkoinen pyyntö voi aiheuttaa lipun asettamisen joko silloin, kun signaalitaso vastaavassa sisääntulossa on alhainen, tai kun tämä signaali vaihtuu korkealta matalalle (taajuudella, joka ei ylitä puolta MK:n ulkoisesta kellotaajuudesta).

Pyyntötyyppi konfiguroidaan ohjelmistolla asettamalla IT0- ja IT1-bitit TCON-ohjausrekisteriin. Asetus ITx = 0 konfiguroi keskeytysjärjestelmän pyytämään matalaa signaalitasoa, ITx = 1 - asettaa keskeytyksen vaatimaan matalaa signaalitasoa.

Sarjaliitäntälaitteisto asettaa TI- ja RI-liput lähetyksen tai vastaanoton päättymisen jälkeen.

Kaikki määritetyt keskeytyspyyntöliput ovat ohjelmoidusti käytettävissä asetusta ja nollausta varten. Keskeytyspyyntölipun asettaminen ohjelmistossa saa aikaan saman vastauksen mikro-ohjaimelta kuin saman lipun asettaminen laitteistossa.

Liput TF0 ja TF1 nollataan laitteistolla, kun ohjaus siirretään vastaavalle keskeytysrutiinille.

IEx-lippujen nollaus suoritetaan laitteistossa keskeytystä huollettaessa vain, jos keskeytys on määritetty havaitsemaan INTx-signaalin putoaminen. Jos keskeytys on konfiguroitu havaitsemaan pyyntösignaalin taso, keskeytyspalveluohjelman on suoritettava IEx-lipun nollaus ja toimittava keskeytyslähteeseen pyynnön poistamiseksi.

TI- ja RI-liput voidaan nollata vain ohjelmistolla.

Jokainen keskeytystyyppi otetaan käyttöön tai poistetaan käytöstä erikseen asettamalla tai tyhjentämällä vastaavat IE-keskeytysrekisterin bitit. Tämä rekisteri sisältää myös yleisen estobitin kaikille keskeytyksille. IE-rekisterin muoto on annettu taulukossa. 14.5.

Taulukko 14.5. IE-rekisteribittien antaminen

Rekisteröi paikka

Pientä muistio

Toiminto

Poista käytöstä kaikista lähteistä tulevat keskeytykset

Ei käytetty

Ei käytetty

Poista keskeytys käytöstä sarjaportti

Poista T/C1-ajastin/laskurin keskeytys käytöstä

Poista keskeytys käytöstä ulkoinen lähde INT1

Poista ajastin/laskurin keskeytys T/C0 käytöstä

Poista keskeytys käytöstä ulkoisesta lähteestä INT0

Kullekin keskeytystyypille voidaan ohjelmoida yksi kahdesta mahdollisesta prioriteetista: 0 - pienin tai 1 - korkein.

Prioriteetit konfiguroidaan asettamalla tai tyhjentämällä vastaava bitti IP-keskeytysprioriteettirekisterissä. Tämän rekisterin muoto on annettu taulukossa. 14.6.

Kun keskeytyspyyntöjä vastaanotetaan samanaikaisesti lähteistä, joilla on eri prioriteetti, pyyntö korkeamman prioriteetin lähteestä käsitellään ensin.

Jos samanaikaisesti vastaanotetaan useita keskeytyspyyntöjä samalla prioriteetilla, niiden käsittelyjärjestyksen määrittää mikrokontrollerilaitteisto, eikä sitä voida muuttaa ohjelmistolla. Tämä järjestys vastaa kyselyn keskeytyspyyntölippujen sarjaa, joka näyttää tältä:

IT0 -> TF0 -> IT1 -> TF1 -> (RI, TI)

Taulukko 14.6. IP-rekisterin bittimääritykset

Rekisteröi sijainti Bit-muistitoiminto

7 - Ei käytetty

6 - Ei käytetty

5 - Ei käytetty

4 PS Sarjaportin keskeytysprioriteetti

3 PT1 Ajastin/laskurin keskeytyksen prioriteetti T/C1

2 PX1 Keskeytyksen prioriteetti ulkoisesta lähteestä INT1

1 PT0 Ajastin/laskurin keskeytyksen prioriteetti T/C0

0 PX0 Keskeytysprioriteetti ulkoisesta lähteestä INT0

Laitteistolla toteutettu keskeytyskäsittelijän kutsu koostuu seuraavista toimista:

* ohjelman laskurin arvon tallentaminen pinoon;

Kunkin keskeytyslähteen keskeytyskäsittelijän sisääntulokohdat on kiinteästi laitteistossa. Niiden arvot on annettu taulukossa. 14.7.

Taulukko 14.7. Keskeytysten käsittelijöiden sisääntulopisteiden osoitteet

Keskeytyksen lähde

Keskeytysten käsittelijöiden sisääntulopisteiden osoitteet

Ulkoinen keskeytys ( ITO)

Ajastinlaskuri (TFO)

Ulkoinen keskeytys (IT1)

Ajastinlaskuri (TF1)

Sarjaportti (R1 tai T1)

Keskeytyskäsittelijän ensimmäisen komennon tulee sijaita määritellyssä osoitteessa. Yleensä tällainen komento on komento, jolla ehdoitta siirrytään siihen paikkaan ohjelmassa, jossa käsittelijä todella sijaitsee.

Vaihdettaessa keskeytyskäsittelyrutiiniin, automaattisesti, IE-rekisterin tilasta riippumatta, kaikki keskeytykset, joiden prioriteettitaso on yhtä suuri kuin huolletun keskeytyksen prioriteettitaso, poistetaan käytöstä - eli saman prioriteettitason sisäkkäiset keskeytykset poistetaan käytöstä. . Näin ollen matalan prioriteetin keskeytys (jonka IP-rekisterin vastaavassa bitissä on "0") voidaan keskeyttää korkean prioriteetin keskeytyksellä (jolla on "1" vastaavassa IP-rekisterin bitissä), mutta ei matalan prioriteetin. Korkean prioriteetin keskeytyksen palvelua ei voi keskeyttää muu lähde.

Paluu keskeytyskäsittelijältä tapahtuu RETI-käskyllä, joka palauttaa pinosta siihen keskeytyskäsittelijän kutsumishetkellä tallennetun PC-ohjelmalaskurin arvon ja keskeytysprioriteettilogiikan.


Puhutaan keskeytyksistä. Sana keskeytys puhuu puolestaan: prosessi pysäytetään joksikin aikaa lisätoimintojen suorittamiseksi. Keskeytykset voivat olla ulkoisia tai sisäisiä. Annan sinulle yksinkertaisen esimerkin, jonka kuulin ystävältäni...

Hän valmistautui pesemään astioita keittiössä, aloitti jännityksellä, käärien hihat... mutta astiat osoittautuivat rasvaisiksi ja hänen oli pakko pysähtyä etsimään pesuainetta rasvaisten astioiden pesuun yhdeltä hyllyltä. keittiön, jonka jälkeen hän jatkoi tehtäväänsä uudelleen. Mutta jossain vaiheessa puhelin soi, ja hän taas pysähtyi työstään, otti puhelimen, anoppi soitti ja sanoi olevansa tulossa käymään, joten hänen täytyi mennä kauppaan ostamaan elintarvikkeita ennen kuin hän saapui. Kävin kaupassa ja vasta sitten pesin astiat.

Tämä esimerkki näyttää kahdenlaisia ​​keskeytyksiä, joista ensimmäinen liittyy päätyön suorittamiseen - pesuaineen etsimiseen rasvaisille astioille - sisäinen keskeytys, toinen - puhelu– ulkoinen keskeytys.
Mikro-ohjaimessa ulkoisia keskeytyksiä syntyy muista lähteistä tulevista signaaleista, sisäiset keskeytykset johtuvat itse mikrokontrolleriin sisäänrakennetuista laitteista. Miksi keskeytykset ovat niin houkuttelevia?
Ensimmäinen on, että voimme pysäyttää pääprosessin suorittaaksemme jonkin muun toiminnon ja jatkaa sitten tätä prosessia.
Toista ja luultavasti monissa tapauksissa tärkeintä pidetään kaikkien toimintojen suorittamisprosessin nopeuttamisena sisäisen lisälaitteita. Palataanpa esimerkkiimme. Oletetaan, että ystäväni aloitti astioiden pesun, kun hänen vaimonsa oli jo saapunut kotiin. Nähdessään rasvaiset astiat hän pyytää häntä etsimään astianpesuainetta, ja kun hän pesee, hän jo tuo hänelle tämän nesteen. Mutta sitten puhelin soi, vaimoni otti puhelimen, puhui äitinsä kanssa ja meni kauppaan. Yhdessä kaikki sujui todella nopeasti!
Ja on vielä helpompi jäädä jumiin – ts. ei ole pääohjelmaa.
Ystäväni istuu sohvalla eikä tee mitään, taloudenhoitaja näkee likaiset astiat, kertoo siitä ja luvan saatuaan alkaa pestä itseään. Kun puhelin soi, hän käskee vaimoaan ottamaan puhelimen, vaimo puhuu puhelimessa ja keskustelu menee ruokakauppaan... Kauneutta! Tällöin mikro-ohjaimessa toimii useita I/O-laitteita samanaikaisesti (nykyaikaisissa mikrokontrollereissa niitä voi olla melko paljon) ja prosessorin kokonaissuorituskyky kasvaa moninkertaiseksi, mutta laitteista tulevat keskeytykset käsitellään peräkkäin peräkkäin (ei samanaikaisesti). ), tärkeydestä riippuen (esimerkissämme vaimolla on suurempi prioriteetti kuin taloudenhoitajalla).

Useat rekisterit vastaavat keskeytysten hallinnasta
SREG – tilarekisteri(osavaltiot). Katsomme syöttö-/tulostuslaitteiden taulukkoa. SREG-rekisterin seitsemäs bitti on I (keskeytys) -lippu, jota kutsutaan globaaliksi keskeytyksen sallimiseksi. Jos lippu jätetään pois (seitsemäs bitti on nolla), kaikki keskeytykset poistetaan käytöstä. Jos lippu nostetaan (asettaa I arvoon 1), sallimme keskeytykset.

I-lippu asetetaan ja nollataan komennoilla:
SEI - salli keskeytykset
CLI - poista keskeytykset käytöstä
Toimivat keskeytykset asetetaan rekistereillä nimeltä - keskeyttää maskit.
Keskeytysmaskit on nimetty seuraavasti:
TIMSK,...,..,.. – ajastimien ja muiden sisäänrakennettujen laitteiden keskeytysten hallinta.
GIMSK (GIKR Mega-perheessä) - kaikkien ulkoisten keskeytysten hallinta.
Keskeytysmaskit puolestaan ​​riippuvat keskeytyslippuista:
TIFR ja GIFR(ei pidä sekoittaa yleisen keskeytyksen sallimiseen lippuun).

Keskeytyksen suoritusjärjestys:
Kun mikro-ohjain käynnistetään, kaikki keskeytysliput nollataan arvoon 0. Keskeytyksiä varten ohjelman on asetettava SREG-rekisterin lipun I arvoksi 1. Tämän jälkeen rekisteröi maskirekisterit paikallisilla keskeytysasetuksilla (tarpeemme) .
Kun keskeytyspyyntö (signaali) saapuu, se nostaa keskeytyslipun (vaikka keskeytys on poistettu käytöstä, järjestää sisäkkäiset keskeytykset ja prioriteetit eri keskeytysten välillä). Jos keskeytyksiä ei ole poistettu käytöstä, ohjain ottaa yhteyttä asianomaiseen (Keskeytysvektorit) - keskeytysvektori, keskeyttää nykyisen ohjelman.
Keskeytysvektori on kiinteä linja ohjelma-alueella, johon ohjelma menee keskeytyksen sattuessa.
Koko luettelo keskeytysvektoreista kutsutaan keskeytysvektoritaulukko, joka sijaitsee ohjelmakoodin alussa.
Joten sillä hetkellä, kun keskeytysvektoriin päästään, SREG-rekisterin I-lippu ja keskeytyksen aiheuttanut lippu palautetaan nollaan, mikä estää muut keskeytykset. Jos muita keskeytyspyyntöjä esiintyy keskeytyksen suorittamisen aikana, näiden keskeytysten liput pysyvät ylhäällä. Kun nykyinen keskeytys on suoritettu, SREG-rekisterin I-lippu nostetaan, jolloin seuraava keskeytys voidaan suorittaa. Jos useita pyyntöjä saapuu ja niiden liput nostetaan, suoritetaan ensimmäisenä se keskeytys, jonka vektori on pienempi taulukossa olevassa osoitteessa, lähempänä muistin alkua. Toinen seuraa ja niin edelleen. Lisäksi ohjelmoija voi järjestää ns. sisäkkäisen keskeytyksen, kun keskeytysohjelman suorituksen aikana tapahtuu toinen keskeytys. Tämän jälkeen nykyisen keskeytyksen suoritus pysäytetään ja suoritetaan uusi, minkä jälkeen pysäytetyn keskeytyksen suoritusta jatketaan.

Esimerkkinä on annettu ATtiny2313:n keskeytysvektoritaulukko

Atmega16:n keskeytysvektoritaulukko on seuraava:

Vertailun vuoksi taulukot eivät täsmää ollenkaan.
ATtiny-perheessä keskeytysvektoririvi vie 16 bittiä ja Mega-perheessä 32 bittiä (kiinnitä huomiota keskeytysvektorien osoitteisiin; muistutan, että ohjelma-alueen osoiteriviä edustaa 16 bittiä -bittinen sana).

ATtiny2313:n ohjelmakoodi voi näyttää tältä:
.cseg .org 0 rjmp Nollaa rjmp INT_0 rjmp INT_1 rjmp Timer1_capt1 rjmp Timer1_comp1 rjmp Timer1_OVF1 rjmp Timer0_OVF0 rjmp UART_RX rjmp UART_UDRE rjmp UART_TX rjmp_ Time ANAINT_COMPcomp_rjmp ANAINT_COMPcomp_ jmp Timer0_compB rjmp USI_START rjmp USI_OVERFLOW rjmp EE_READY rjmp WDT_ OVERFLOW

Kuten näet, keskeytysvektori luo suhteellisen hypyn keskeytysohjelman nimikkeisiin. Alla oleva taulukko näyttää vaihtoehdot; 1. Kun ei ole keskeytyksiä; 2, 3. ulkoisella keskeytyksellä tulossa INT_1.
Jos tarrat ovat "tyhjiä" (tarran alla ei ole ohjelmaa), mitään ei tapahdu ja ohjelma "ajoaa" peräkkäin jäljellä olevat tarrat ja saavuttaa turvallisesti komennon RETI- Keskeytyksen paluu - poistu keskeytyskäsittelijästä kuten taulukon ensimmäisessä sarakkeessa näkyy.

Jos haluat suorittaa keskeytysohjelman esimerkiksi INT_1-syötössä, sinun on poistettava INT_1:-nimike luettelosta. Tämä on esitetty kaavamaisesti taulukon toisessa sarakkeessa.
Mutta ohjelmoijalle on hankalaa kirjoittaa kaikki keskeytykset ja erilliset etiketit joka kerta, varsinkin uusimmissa malleissa, joissa taulukko on melko suuri; RETI-komento on helpompi kirjoittaa välittömästi keskeytysvektoririville, jos keskeytystä ei käytetä. Sitten ohjelma näyttää taulukon kolmannen sarakkeen mukaiselta.

AVR-ohjaimissa voi mallista riippuen olla 1-8 tuloa ulkoisia keskeytyksiä.
Tarkastellaanpa ulkoista keskeytyshallintajärjestelmää. Tätä tarkoitusta varten tarjotaan seuraavat I/O-rekisterien yhdistelmät mallista riippuen (katso vastaava tietolehti):
- GIMSK, EIFR, PCMSK, MCUCR;
- GIKR, GIFR, MCUCR;
- EIMSK, EICR, EIFR;
GIMSK, GIKR, EIMSK - keskeytysmaskit,
EIFR, PCMSK, GIFR, EIFR – keskeytysliput
Luvan tai kiellon vuoksi ulkoisia keskeytyksiä ohjausrekisterit on tarkoitettu: GIMSK-(General Interrupt Mask Register) (Tiny), GICR- (General Interrupt Control Register) (Mega), MCUCR – (MCU Control Register)




EIFR- Ulkoinen keskeytyslippurekisteri: 1 - käytössä, 0 - pois käytöstä. Jokainen bitti (lippu) sallii vastaavan nastan toimia keskeytyslähteenä.

GIMSK-rekisterin ohjausbitit:
Bitti 7 – INT1: Ulkoinen keskeytyspyyntö 1 käytössä – INT1 keskeytyksen salliva bitti: 1 – käytössä, 0 – pois käytöstä. Keskeytys syntyy, vaikka INT1-nasta on määritetty ulostuloksi. INT1-bitti on asetettu keskeyttämään EIFR-lippurekisterissä. INT1-nasta on synkronoitu kellogeneraattorin kanssa.

Bitti 6 – INT0: Ulkoinen keskeytyspyyntö 0 Käytössä - keskeytyksen salliva bitti INT0: 1 – käytössä, 0 – pois käytöstä. Keskeytys syntyy, vaikka INT0-nasta on määritetty ulostuloksi. INT0-bitti on asetettu keskeyttämään EIFR-lippurekisterissä. INT10-nasta on synkronoitu kellogeneraattorin kanssa.

Bitti 5 – PCIE: Pin Change Interrupt Enable – keskeytyksen estobitti PCINT0…7 nastaissa: 1 – käytössä, 0 – pois käytöstä. Mikä tahansa muutos PCINT0...7-nastassa aiheuttaa keskeytyksen. Pinnat PCINT0...7 on määritetty keskeyttämään yksitellen, PCMSK-lippurekisterin bittien mukaan.

PCMSK- Pin Change Mask Rekiser - lippurekisteri PCMSK: 1 - sallittu, 0 - pois käytöstä. Jokainen bitti (lippu) sallii vastaavan nastan toimia keskeytyslähteenä. PCINT0...7 nastat eivät ole synkronoituja kellogeneraattorin kanssa, ts. keskeytys tapahtuu, kun jossakin nastassa tapahtuu muutos.

Mega8

ja vastaava lippurekisteri


Bitti 7

Bitti 6 – INT0: Ulkoinen keskeytyspyyntö 0 Käytössä - keskeytyksen salliva bitti INT0: 1 – käytössä, 0 – pois käytöstä. Keskeytys syntyy, vaikka INT0-nasta on määritetty ulostuloksi. INT0 bitti on asetettu keskeyttämään GIFR-lippurekisterissä



GIFR – General Interrupt Flag Register: 1 – käytössä, 0 – pois käytöstä. Jokainen bitti (lippu) sallii vastaavan nastan toimia keskeytyslähteenä.

GICR-rekisterin ohjausbitit:
Bitti 7– : Ulkoinen keskeytyspyyntö 1 Ota käyttöön – keskeytyksen salliva bitti INT1: 1 – sallittu, 0 – kielletty. Keskeytys syntyy, vaikka INT1-nasta on määritetty ulostuloksi. INT1-bitti on asetettu keskeyttämään GIFR-lippurekisterissä

Bitti 6 – INT0: Ulkoinen keskeytyspyyntö 0 Ota käyttöön - keskeytyksen salliva bitti INT0: 1 – sallittu, 0 – kielletty. Keskeytys syntyy, vaikka INT0-nasta on määritetty ulostuloksi. INT0 bitti on asetettu keskeyttämään GIFR-lippurekisterissä

Bitti 5 – INT2: Ulkoinen keskeytyspyyntö 2 Ota käyttöön - keskeytyksen salliva bitti INT2: 1 – sallittu, 0 – kielletty. Keskeytys syntyy, vaikka INT2-nasta on määritetty ulostuloksi. INT2-bitti on asetettu keskeyttämään GIFR-lippurekisterissä

Kaikkien ohjaimien INT0- ja INT1-tulojen toimintoja ohjataan MCUCR-rekisterin matalan kertaluvun biteillä.

MCUCR – MCU-ohjausrekisteri
Ohjausbitit:
Bitit 1, 0 – ISC01, ISC00 (Interrupt Sense Control 0 Bit 1 and Bit 0) – näiden bittien tila määrittää tapahtuman INT0-nastassa, joka luo INT0-keskeytyksen:
ISC01=0, ISC00=0 – looginen nollataso;
ISC01=0, ISC00=1 – mikä tahansa loogisen tilan muutos;
ISC01=1, ISC00=0 – laskevalla reunalla;
ISC01=1, ISC00=1 – nousevalla reunalla.

Bitit 3, 2 – ISC11, ISC10 (Interrupt Sense Control 1 Bit 1 and Bit 0) – näiden bittien tila määrittää signaalitason INT1-nastassa, joka luo INT1-keskeytyksen:
ISC11=0, ISC10=0 – looginen nollataso;
ISC11=0, ISC10=1 – mikä tahansa loogisen tilan muutos;
ISC11=1, ISC10=0 – laskevalla reunalla;
ISC11=1, ISC10=1 – nousevalla reunalla.

No, näyttää siltä, ​​että olemme puhuneet minimissään ulkoisista keskeytyksistä.
On selvää, että jotta keskeytykset toimisivat, ne on rekisteröitävä vastaavasti.
Lisätään INT1:ssä alkaneen keskeytyksen alustus pienelle signaalin nousevalla reunalla:

Ldi r16.0x80 ; kirjoita kohtaan r16 numero 0b10000000 ldi r17.0x0C ; kirjoita kohtaan r17 numero 0b00001100 ulos MCUCR,r17 ; keskeytys generoidaan nousevalla reunalla ISC11=1, ISC10=1 ulos GIMSK,r16 ; aseta maski INT0 sei
Muuten, voit luoda keskeytyksen tiny2313:lle millä tahansa PCINT0…7 nastalla, Megassa sarjaan 48 asti nämä ominaisuudet eivät ole käytettävissä...
On toimintoja, joiden aikana saattaa ilmetä keskeytyksiä, jotka voivat aiheuttaa ohjelman kaatumisen. Tällaisissa tapauksissa ennen toiminnan aloittamista kirjoitamme CLI ja SEI:n jälkeen. Tällaisia ​​operaatioita kutsutaan - atomi-.
On toivottavaa, että keskeytysohjelmat ovat kompakteja ja suoritettuja suurimmalla nopeudella, koska minkä tahansa keskeytyksen tarkoitus on siepata tapahtuma. Jos sen mukaan monia syitä ohjelma toimii hitaasti, riittää, että tallennat tapahtuman ja käsittelet sen hieman myöhemmin.

Jotta esitetty materiaali ei sotkeutuisi tarpeettomalla tiedolla, suosittelen, että lukijat käyttävät tietolomakkeita, ja jos kaikki ei ole selvää, kysy kysymyksiä useammin foorumeilla.
Seuraavaksi tarkastelemme yksityiskohtaisesti sisäisiä keskeytyksiä sisäänrakennettujen ajastimien perusteella. lukijat. Osallistuaksesi äänestykseen, rekisteröidy ja kirjaudu sisään sivustolle käyttäjätunnuksellasi ja salasanallasi.

Yksi ATmega8-mikro-ohjaimen eduista on sen laaja valikoima erilaisia ​​keskeytyksiä.

Keskeyttää on tapahtuma, jonka sattuessa pääohjelman suoritus keskeytyy ja kutsutaan toiminto, joka käsittelee tietyn tyyppisen keskeytyksen.

Keskeytykset jaetaan sisäisiin ja ulkoisiin. Sisäisten keskeytysten lähteitä ovat sisäänrakennetut mikro-ohjainmoduulit (ajastimet, USART-lähetin-vastaanotin jne.). Ulkoisia keskeytyksiä esiintyy, kun ulkoiset signaalit saapuvat mikro-ohjaimen nastoihin (esimerkiksi signaalit RESET- ja INT-nastoihin). Keskeytykseen johtavien signaalien luonne asetetaan ohjausrekisterissä MCUCR, erityisesti biteissä - ISC00 (bitti 0) ja ISC01 (bitti 1) tulolle INT 0; ISC10 (bit2) ja ISC11 (bit3) INT1-tulolle.

ATmega8-mikro-ohjaimessa jokaisella keskeytyksellä on omansa keskeytysvektori(osoite sen ohjelman muistialueen alussa, johon on tallennettu komento hyppäämiseksi määritettyyn keskeytysrutiiniin). Mega8:ssa kaikilla keskeytyksillä on sama prioriteetti. Jos useita keskeytyksiä esiintyy samanaikaisesti, keskeytys, jonka vektorinumero on pienempi, käsitellään ensin.

Keskeytysvektorit Atmega8:ssa

Osoite Keskeytyslähde Kuvaus
0x0000 RESET Nollaa signaali
0x0001 INT0 Ulkoinen keskeytyspyyntö INT0-tulossa
0x0002 INT1 Ulkoinen keskeytyspyyntö INT1-tulossa
0x0003 T/C1 Ajastinkaappaus T/C1
0x0004 T/C1 Ottelu T/C1 Ajastin Vertaa rekisteriä A
0x0005 T/C1 Yhdistä ajastimen T/C1 vertailurekisteriin B
0x0006 T/C1 T/C1-laskurin ylivuoto
0x0007 T/C0 T/C0 laskurin ylivuoto
0x0008 SPI SPI-tiedonsiirto valmis
0x0009 UART UART-lähetin-vastaanotin on vastaanottanut tiedot.
0x000A UART UART-tietorekisteri on tyhjä
0x000B UART Tiedonsiirto UART-lähetin-vastaanottimella on valmis
0x000C ANA_COMP Keskeytys analogisesta vertailijasta

Keskeytä hallinta

ATmega8:n keskeytysten hallinnasta vastaa neljä rekisteriä:

GIMSK(alias GICR) - estää/ottaa käyttöön keskeytykset tulojen INT0, INT1 signaalien perusteella

GIFR- kaikkien ulkoisten keskeytysten hallinta

TIMSK, TIFR- ajastimien/laskurien aiheuttamien keskeytysten hallinta

Rekisteröidy GIMSK (GICR)

INTFx=1: INTx-tulossa tapahtui keskeytys. Kun siirryt keskeytyksen käsittelyrutiiniin, INTFx palautuu automaattisesti lokitilaan. 0

Rekisteröidy TIMSK

7 6 5 4 3 2 1 0
TOIE1
OCIE1A
OCIE1B
-
TICIE
-
TOIE0
-

TOIE1=1: T/C1 ylivuotokeskeytys käytössä

OCIE1A=1: keskeytä, kun vertailurekisteri A vastaa laskurin T/C1 sisältöä

OCIE1B=1: keskeytä, kun vertailurekisteri B vastaa laskurin T/C1 sisältöä

TICIE=1: keskeytys käytössä, kun sieppausehto täyttyy

TOIE0=1: T/C0 ylivuotokeskeytys käytössä

Rekisteröidy TIFR

7 6 5 4 3 2 1 0
TOV1
OCF1A
OCF1B
-
ICF1
-
TOV0
-

TOV1=1: T/C1 ylivuoto tapahtui

OCF1A=1: vertailurekisteri A osui yhteen laskurin T/C1 sisällön kanssa

OCF1B=1: vertailurekisteri B vastaa laskurin T/C1 sallittua sisältöä

ICF=1: sieppausehdot täyttyvät

TOV0=1: T/C0 ylivuoto tapahtui

Keskeytyksen käsittelyalirutiiniin siirtyessä keskeytystä vastaava TIFR-rekisterilippu palautuu automaattisesti lokitilaan. 0

Keskeytykset toimivat vain, kun yleiset keskeytykset on otettu käyttöön SREG-tilarekisterissä (bitti 7 = 1). Kun keskeytys tapahtuu, tämä bitti palautetaan automaattisesti arvoon 0, mikä estää myöhemmät keskeytykset.

Tässä esimerkissä INT0-nasta on käytössä pull-up-syöttötilassa. Kun napa on oikosuljettu maahan painikkeella, siihen asetetaan logiikka 0 (signaalin reuna putoaa syöttöjännitteestä 0:aan) ja keskeytyskäsittelijä laukeaa ja kytkee portin nollanastaan ​​kytketyn lampun päälle. B

tyhjä lamppu ON()
{
PORTB.0=1;
DDRB.0 = 1;
}

keskeytys void ext_int0_isr(void)
{
lamppu päällä();
}

DDRD.2=0;
PORTD.2=1;

SREG|= (1 while(1) (

Yllä oleva esimerkki näyttää myös kuinka keskeytysvektorit asetetaan Code Vision AVR:ssä (keskeytys void ext_int0_isr(void)). Keskeytysvektorit asetetaan samalla tavalla muihin tapauksiin:

EXT_INT0 2
EXT_INT1 3
TIM2_COMP 4
TIM2_OVF 5
TIM1_CAPT 6
TIM1_COMPA 7
TIM1_COMPB 8
TIM1_OVF 9
TIM0_OVF 10
SPI_STC 11
USART_RXC 12
USART_DRE 13
USART_TXC 14
ADC_INT 15
EE_RDY 16
ANA_COMP 17
TWI 18
SPM_VALMIS 19

Osa AVR-mikro-ohjaimet sisältää suuren määrän oheislaitteita (ADC, Timer/Counters, EXTI, Analog Comparator, EEPROM, USART, SPI, I2C jne.), joista jokainen voi suorittaa tiettyjä toimintoja datalle/signaaleille ja muille tiedoille. Nämä laitteet on integroitu mikrokontrolleriin parantamaan sovellusten tehokkuutta ja alentamaan kustannuksia kehitettäessä kaikenlaisia ​​AVR-mikrokontrollereihin perustuvia laitteita.

Prosessori kommunikoi/ohjaa oheislaitteita I/O-rekisterien kautta, jotka sijaitsevat datamuistissa, jolloin niitä voidaan käyttää tavallisten muuttujien tavoin. Jokaisella laitteella on omat I/O-rekisterinsä.

Kaikki I/O-rekisterit voidaan jakaa kolmeen ryhmään: tietorekisterit, ohjausrekisterit ja tilarekisterit.

Ohjausrekistereillä laite konfiguroidaan toimimaan jossakin tilassa, tietyllä taajuudella, tarkkuudella jne. ja Datarekistereillä luetaan työn tulos. tästä laitteesta(analogi-digitaalimuunnos, vastaanotettu data, ajastin/laskuriarvo jne.). Vaikuttaa siltä, ​​​​että tässä ei ole mitään monimutkaista (itse asiassa, täällä ei todellakaan ole mitään monimutkaista :)), käynnisti laite, osoitti halutun toimintatilan ja sitten jää vain leikkaamaan kupongit, lukea valmiit tiedot ja käytä niitä laskelmissa. Koko kysymys on "milloin" juuri nämä tiedot luetaan (onko laite suorittanut työnsä tai käsittelee edelleen tietoja), koska kaikki oheislaitteet toimivat rinnakkain mikrokontrolleriytimen kanssa ja jopa eri taajuuksilla. Herää kysymys viestinnän toteuttamisesta ja synkronointi prosessorin ja oheislaite.

Kuten luultavasti jo arvasitkin, laitteen ja prosessorin välisen tiedonsiirron ja synkronoinnin toteuttamiseen käytetään "Tilarekistereitä", jotka tallentavat tietyn laitteen nykyisen toimintatilan. Jokainen tila, jossa laite voi olla, vastaa "bittiä" rekisteritila" (lippu), jonka nykyinen arvo "puhuu" tämän laitteen nykytilasta tai sen yksittäisestä toiminnasta (työ suoritettu/ei suoritettu, virhe tietojenkäsittelyssä, rekisteri tyhjä jne.).

Prosessorin ja oheislaitteen välinen viestintämekanismi toteutetaan lippukyselyllä, jotka vastaavat tämän laitteen tietystä toiminnasta. Tietyn lipun (laitteen tila) arvosta riippuen voit muuttaa ohjelman suorituskulkua (haaroittumista). Esim:

Tarkistaminen, onko tietty lippu asetettu (jokin tapahtuma on tapahtunut):

if (RegX & (1<< Flag) ) // jos RegX-rekisterin lippu on asetettu
{
// tee jotain
}

Odotetaan jonkin toiminnon (tapahtuman) valmistumista:

while(!(RegX & (1<

Lippujen kysely on melko resursseja vaativa tehtävä sekä ohjelman koon että nopeuden suhteen. Koska lippujen kokonaismäärä AVR-mikro-ohjaimissa on melko suuri (etu), prosessorin ja laitteen välinen viestinnän toteuttaminen lippujen kautta johtaa kirjoittamasi ohjelman tehokkuuden (koodin nopeuden / koodin koon) laskuun, Lisäksi ohjelmasta tulee erittäin sekava, mikä edistää virheiden ilmaantumista, joita on vaikea havaita jopa koodin yksityiskohtaisella virheenkorjauksella.

AVR-mikro-ohjainten ohjelmien tehokkuuden lisäämiseksi sekä näiden ohjelmien luomis- ja virheenkorjausprosessin helpottamiseksi kehittäjät ovat varustaneet kaikki oheislaitteet "keskeytyslähteillä" ( Keskeytä lähteet), joillakin laitteilla voi olla useita keskeytyslähteitä.

Se toteutetaan keskeytyslähteitä käyttämällä synkronointimekanismi, prosessorin ja oheislaitteen välillä, eli prosessori alkaa vastaanottaa tietoja, pollauslippuja ja muita oheislaitteen toimintoja vasta, kun laite on valmis tähän (raportoi tietojenkäsittelyn valmistumisesta, virheen aikana tietojen käsittely, rekisteri on tyhjä jne.) jne.), generoimalla "keskeytyspyynnön" ( Keskeytyspyyntö), riippuen jonkin lipun arvosta (laite/toiminto/tapahtumatila).

Kirjallisuudessa hyvin usein koko tapahtumaketju "keskeytyspyynnöstä" (IRQ) "keskeytyspalvelumenettelyyn" (ISR) on lyhennetty keskeytykseksi. Keskeyttää).

Mikä on keskeytys?


Keskeytys on signaali, joka ilmoittaa prosessorille tapahtumasta. Tällöin nykyisen komentosarjan suoritus keskeytetään ja ohjaus siirtyy tätä tapahtumaa vastaavaan keskeytyskäsittelyyn, jonka jälkeen koodin suoritus jatkuu täsmälleen siitä kohdasta, jossa se keskeytettiin (ohjauksen paluu). (Wiki)

Keskeytä rutiini(Interrupt Service Routine) ei ole muuta kuin toiminto/alirutiini, joka tulee suorittaa, kun tietty tapahtuma tapahtuu. Käytämme sanaa "menettely" korostaaksemme sen eroa kaikista muista toiminnoista.

Suurin ero menettelyn ja yksinkertaisten funktioiden välillä on, että tavallisen "paluu funktiosta" (kokoonpanokomento RET) sijaan tulisi käyttää "palaa keskeytyksestä" (assembler-komento RETI) - " RETurn from Interrupt".

AVR-keskeytysominaisuudet:

  • Jokaisella oheislaitteella, joka on osa AVR-mikro-ohjainta, on vähintään yksi keskeytyslähde. Kaikkien näiden keskeytysten joukkoon tulisi sisällyttää myös nollauskeskeytys, jonka tarkoitus on erilainen kuin kaikkien muiden.
  • Jokaisella keskeytyksellä on tiukasti määritetty vektori (linkki), joka osoittaa keskeytyspalvelurutiiniin. Kaikki keskeytysvektorit sijaitsevat aivan ohjelmamuistin alussa ja muodostavat yhdessä "keskeytysvektoritaulukon".
  • Jokainen keskeytys liittyy tiettyyn "keskeytyksen sallivaan bittiin", joten tietyn keskeytyksen käyttämiseksi sinun tulee kirjoittaa sen "keskeytyksen salliva bitti" -lokiin. yksikkö. Lisäksi riippumatta siitä, oletko ottanut tietyt keskeytykset käyttöön vai et, mikro-ohjain ei aloita näiden keskeytusten käsittelyä ennen kuin SREG-tilarekisterin "Global Interrupt Enable bit" -kohtaan on kirjoitettu looginen. määrittelemätön aika), looginen nolla tulisi kirjoittaa yleisen keskeytyksen sallivaan bittiin.

Nollauskeskeytystä, toisin kuin kaikkia muita, ei voi poistaa käytöstä. Tällaisia ​​keskeytyksiä kutsutaan myös ei-maskoitaviksi keskeytyksiksi.

  • Jokaisella keskeytyksellä on tiukasti määritelty prioriteetti. Keskeytyksen prioriteetti riippuu sen sijainnista "keskeytysvektoritaulukossa". Mitä pienempi vektorin numero taulukossa on, sitä korkeampi on keskeytyksen prioriteetti. Eli korkein prioriteetti on nollauskeskeytys, joka sijaitsee ensin taulukossa ja vastaavasti muistiohjelmissa Ulkoisen keskeytyksen INT0 "keskeytysvektoritaulukon" Reset-keskeytyksen jälkeen on prioriteetti pienempi kuin Resetin, mutta korkeampi kuin kaikkien muiden keskeytysten jne.

Keskeytysvektoritaulukko, paitsi Reset-vektori, voidaan siirtää Flash-muistin Boot-osan alkuun asettamalla IVSEL-bitti GICR-rekisteriin. Nollausvektori voidaan siirtää myös Flash-muistin Boot-osan alkuun ohjelmoimalla sulakebitti - BOOTRST.



Kuva 1 ATmega16-keskeytysvektoritaulukko

Keskeytä rutiinin prototyyppi


Jotta funktio julistettaisiin keskeytyksen käsittelyrutiiniksi, sinun on noudatettava tiettyjä prototyyppisääntöjä, jotta kääntäjä/linkkeri voi tunnistaa ja liittää tarvitsemasi keskeytyksen oikein käsittelyrutiiniinsa.

Ensinnäkin keskeytyspalvelurutiini ei voi hyväksyä mitään argumentiksi (tyhjä), eikä myöskään voi palauttaa mitään (tyhjä). Tämä johtuu siitä, että kaikki AVR:n keskeytykset ovat asynkronisia, joten ei ole tiedossa, missä ohjelman suoritus keskeytyy, keneltä vastaanottaa ja kenelle arvo palautetaan, sekä minimoida sisääntuloaika ja poistu keskeytyksestä.

void isr(void)

Toiseksi, ennen funktion prototyyppiä sinun tulee ilmoittaa, että kyseessä on keskeytyskäsittely. Kuten tiedät, C-kielessä suoritetaan vain päätoiminnossa käytetty koodi. Koska päätoiminnon keskeytyskäsittelyproseduuria ei käytetä missään, jotta kääntäjä ei "heitä sitä pois" tarpeettomana, tulee ennen proseduuriprototyyppiä ilmoittaa, että tämä toiminto on keskeytyksen käsittelyproseduuri.

Keskeytyskäsittelyn prototyyppi AVR Studio -ympäristössä

#sisältää

ISR (XXX_vect)
{

}

AVR Studiossa (AVR GCC) jokainen keskeytysrutiini alkaa ISR-makromäärityksellä, jota seuraa suluissa seuraava rakennelma:

XXX_vect

jossa "XXX" on keskeytysvektorin nimi. Kaikki tietyn AVR-mikro-ohjaimen vektorien nimet löytyvät mikro-ohjaimen tietolomakkeen "keskeytysvektoritaulukosta" tai sen otsikkotiedostosta. Esimerkiksi ATmega16-mikrokontrollerin "keskeytysvektoritaulukko" on esitetty kuvassa 1, jossa Source-sarakkeessa on lueteltu kaikki keskeytysvektorien nimet.Nimet löytyvät myös tämän mikro-ohjaimen otsikkotiedostosta (C :\Program Files\Atmel\AVR Tools\AVR Toolchain\avr\include\avr\iom16.h), katso kuva 2. Meidän tarvitsee vain etsiä taulukosta tarvitsemamme vektorin nimi ja lisätä loppuosa "_vect" siihen.


Kuva 2 ATmega16-otsikkotiedosto AVR Studiolle

Kirjoitetaan esimerkiksi keskeytyskäsittely tavun vastaanottamiseksi USART:n kautta (USART, Rx Complete):

ISR (USART_RXC_vect)
{
// Keskeytyskäsittelijän runko
}

Muuten: ennen kuin käytät keskeytyksiä AVR Studiossa, sinun tulee sisällyttää projektiin otsikkotiedostot io.h ja interrupt.h:

#sisältää
#sisältää

Voit lukea lisää AVR Studion (AVR GCC) keskeytyskäsittelijöistä osiossa Johdanto avr-libc:n keskeytyskäsittelyyn.

Keskeytyskäsittelyn prototyyppi ImageCraft-ympäristössä

#pragma interrupt_handler : iv_XXX
mitätön< handler_name>(tyhjä)
{
// Keskeytyskäsittelijän runko
}

ImageCraft-ympäristössä prototyypin keskeytysrutiini näyttää tältä:

mitätön< handler_name>(tyhjä)

Missä , tämä on se nimi, jonka haluat antaa tälle keskeytyskäsittelijälle. Yksi keskeytysten käsittelymenettelyjen ilmoittamisen vaatimuksista on, että ennen funktion prototyyppiä on ilmoitettava, että se on keskeytyskäsittelijä. Tämä tehdään pragmadirektiivin avulla keskeytyskäsittelijä :

#pragma interrupt_handler : iv_XXX

Missä tämä on keskeytyskäsittelijänä käytettävän funktion nimi ja rakenne "iv_XXX" on keskeytysvektorin (XXX) nimi etuliitteellä "iv_". Kuten AVR Studion tapauksessa, kaikki vektorien nimet tietylle AVR-mikro-ohjaimelle löytyy tietyn mikro-ohjaimen tietolomakkeen "keskeytysvektoritaulukosta" tai sen otsikkotiedostosta (katso kuva 3).


Kuva 3 ATmega16-otsikkotiedosto ImageCraft IDE:lle

Esimerkiksi keskeytyksen käsittely tavun vastaanottamiseksi USART:n kautta (USART, Rx Complete) ImageCraft-ympäristössä näyttää tältä:

#pragma interrupt_handler usart_rxc_isr: iv_USART_RXC
void usart_rxc_isr(void)
{
// Keskeytyskäsittelijän runko
}

Lisätietoja keskeytyskäsittelystä ImageCraft IDE:ssä löytyy kehitysympäristön Ohje->AVR-ohjelmointi->Keskeytyskäsittelijät-valikosta.

Joskus, jos useiden keskeytyskäsittelijöiden on tehtävä sama asia, voit säästää ohjelmamuistia ohjaamalla useita keskeytysvektoreita samaan keskeytysrutiiniin.

AVR Studiossa se näyttää tältä:

ISR (INT0_vect)
{
// Tee jotain
}
ISR(INT1_vect, ISR_ALIASOF(INT0_vect) );

Ensin tulee keskeytysproseduuri tietylle vektorille, tässä tapauksessa INT0:lle. Kaikki muut menettelyt voivat viitata mihin tahansa keskeytyskäsittelijään, joka käyttää konstruktia:

ISR (YYY_vect, ISR_ALIASOF(XXX_vect) ) ;

missä YYY on keskeytysvektorin nimi, joka viittaa vektorin XXX aiemmin ilmoitettuun keskeytyskäsittelijään.

ImageCraftissa se näyttää tältä:

#pragma interrupt_handler : iv_XXX : iv_YYY
mitätön< handler_name>(tyhjä)
{
// Keskeytyskäsittelijän runko
}

#pragma interrupt_handler : iv_XXX
#pragma interrupt_handler : iv_YYY
mitätön< handler_name>(tyhjä)
{
// Keskeytyskäsittelijän runko
}

jossa vektorit XXX ja YYY viittaavat samaan keskeytyskäsittelijään .

Miten keskeytys toimii AVR-mikro-ohjaimissa?

1. Oletetaan, että " keskeytyspyyntö”(IRQ).

Muuten: jos useita keskeytysprosessointipyyntöjä esiintyy samanaikaisesti, korkeimman prioriteetin omaava keskeytys käsitellään ensin, kaikki muut pyynnöt käsitellään korkean prioriteetin keskeytyksen valmistumisen jälkeen.

2. Tutkimus.

Jos tämän keskeytyksen aktivointibitti on asetettu (Interrupt enable bit) ja prosessorin tilarekisterin (SREG) I-bitti (yleinen keskeytyksen salliva bitti) on asetettu, prosessori alkaa valmistella keskeytyspalvelurutiinia, kun taas yleinen keskeytyksen salliva bitti (rekisterin SREG I-bitti) nollataan, jolloin kaikki muut keskeytykset poistetaan käytöstä. Tämä tapahtuu siten, että mikään muu tapahtuma ei voi keskeyttää nykyisen keskeytyksen käsittelyä.

Muuten: jos keskeytyksen käsittelyssä asetat I-bitin lokitilaan. yksikköä, mikä tahansa aktivoitu keskeytys voi vuorostaan ​​keskeyttää nykyisen keskeytyksen käsittelyn. Tällaisia ​​keskeytyksiä kutsutaan sisäkkäisiksi keskeytyksiksi.

3. Valmistautuminen.

Prosessori suorittaa nykyisen kokoonpanokäskyn loppuun ja asettaa sitten seuraavan käskyn osoitteen pinoon (PC->PINO). Seuraavaksi prosessori tarkistaa, mikä keskeytyslähde on lähettänyt "keskeytyspyynnön" (IRQ), minkä jälkeen se siirtyy käyttämällä tämän lähteen (linkin) vektoria vektoritaulukosta (joka on tiukasti määritetty kullekin keskeytyslähteelle) keskeytyskäsittelymenettely (JMP-käsky). Siinä se, prosessori käyttää vähintään 4 kellojaksoa (riippuen pyynnön ilmestymishetkestä ja nykyisen käskyn suoritusajan kestosta). Tämä on erittäin hyvä vasteaika IRQ:lle verrattuna muiden valmistajien mikro-ohjaimet.

Muuten: jos IRQ tapahtuu, kun mikro-ohjain on lepotilassa, vasteaika IRQ:lle kasvaa vielä neljällä kellojaksolla, plus sulakebitteihin SUT1 ja SUT0 (Start-Up Time) tallennettu aika.

Keskeytys - tapahtuma, joka vaatii välitöntä vastausta prosessorilta. Vastaus on, että prosessori keskeyttää nykyisen ohjelman käsittelyn ( keskeytynyt ohjelma) ja suorittaa jonkin muun ohjelman ( keskeyttävä ohjelma), suunniteltu erityisesti tätä tapahtumaa varten. Tämän ohjelman päätyttyä prosessori palaa suorittamaan keskeytetyn ohjelman.

Jokaiseen keskeytystä vaativaan tapahtumaan liittyy keskeytyssignaali, ilmoitti tästä tietokoneelle ja soitti keskeytyspyyntö.

Ohjelman tila edustaa joukkoa kaikkien tallennuselementtien tiloja vastaavana ajankohtana (esimerkiksi viimeisen komennon suorittamisen jälkeen). Keskeytyksen sattuessa mikro-ohjain tallentaa ohjelmalaskurin sisällön pinoon ja lataa siihen vastaavan keskeytysvektorin osoitteen. Keskeytyspalvelurutiinin viimeisen komennon tulee olla komento, joka palaa pääohjelmaan ja palauttaa aiemmin tallennetun ohjelmalaskurin. Kun keskeytyskäsittelijä suorittaa, jotkut tiedot voivat muuttua. Siksi keskeytyskäsittelijään siirryttäessä on tarpeellista tallentaa muutettavat elementit. Tällaisten elementtien joukko on ohjelman tilavektori. Tässä tapauksessa muut tiedot muistisolujen tilasta eivät ole tärkeitä tai ne voidaan palauttaa ohjelmallisesti.

Vektori alkutila sisältää kaikki tarvittavat tiedot ohjelman ensimmäistä käynnistämistä varten. Monissa tapauksissa alkutilavektori sisältää vain yhden elementin - käynnistettävän ohjelman aloitusosoitteen.

Keskeytysvektori on keskeyttävän ohjelman (käsittelijän) alkutilan vektori ja sisältää kaiken käsittelijään siirtymiseen tarvittavan tiedon, mukaan lukien sen aloitusosoitteen. Jokaisella keskeytystyypillä on oma keskeytysvektorinsa, joka käynnistää vastaavan käsittelijän suorituksen. Tyypillisesti keskeytysvektorit tallennetaan erityisesti varattuihin kiinteisiin muistipaikkoihin lyhyillä osoitteilla, jotka edustavat keskeytysvektoritaulukko. Jotta voit siirtyä sopivaan keskeytysohjelmaan, prosessorilla on oltava keskeytysvektori ja tämän vektorin osoite. Tässä osoitteessa on pääsääntöisesti ehdoton hyppykäsky keskeytyksenkäsittelyalirutiiniin.

Pääsääntöisesti tallennuksen ja palauttamisen ohjaus on annettu keskeytyskäsittelijälle. Käsittelijä koostuu tässä tapauksessa kolmesta osasta - valmistelevasta (prologi) ja lopullisesta (epilogi), jotka varmistavat ohjelman vaihdon, sekä varsinaisesta keskeytysohjelmasta, joka suorittaa pyynnön edellyttämät toiminnot. Vasteaika määritellään aikaväliksi keskeytyspyynnön vastaanottamisesta siihen asti, kun keskeyttävä ohjelma alkaa suorittaa.


tp– järjestelmän vasteaika keskeytykseen;
t z– keskeytetyn ohjelman tilan tallennusaika;
t ppr– varsinaisen keskeytysohjelman aika;
t sisään– aika palauttaa keskeytetyn ohjelman tila

Jos pyyntölähteitä on useita, tulee tietty saapuvien pyyntöjen palvelujärjestys muodostaa, kutsutaan prioriteettisuhteet tai palvelukuria. Kaikkien mahdollisten prosessorin keskeytystyyppien joukko on keskeytysjärjestelmä mikro-ohjain. Palvelukuri määrittelee, mitkä useista samanaikaisesti vastaanotetuista pyynnöistä tulee käsitellä ensin ja onko tämä pyyntö keskeyttää yksi tai toinen keskeytyskäsittelijä.
Jos korkeamman prioriteetin keskeytyspyyntö vastaanotetaan keskeytyksen käsittelyn aikana, ohjaus siirretään korkeamman prioriteetin keskeytyskäsittelijälle ja alemman prioriteetin keskeytyskäsittelijä keskeytetään. Nousee keskeyttää sisäkkäisyyden. Kutsutaan enimmäismäärä ohjelmia, jotka voivat keskeyttää toisensa keskeytysten syvyys.

Jos keskeytyspyyntöä ei palvella siihen mennessä, kun uusi pyyntö saapuu samasta lähteestä (sama prioriteetti), keskeyttää järjestelmän kyllästymisen. Tässä tapauksessa osa keskeytyspyynnöistä menetetään, mikä normaali operaatio mikro-ohjain ei ole sallittu.

Keskeytysjärjestelmän ominaisuudet ovat:

  • keskeytyspyyntöjen kokonaismäärä keskeytyspyyntöjen lähteiden lukumäärä;
  • keskeytysesitystyyppi - keskeytyspyyntöä edustaa yleensä looginen signaalitaso;
  • keskeytysprioriteetti – määrittää järjestyksen, jossa kukin keskeytyspyyntö käsitellään; mitä korkeampi prioriteetti, sitä lyhyempi on keskeyttävän ohjelman suorittamisen viive;
  • vasteaika – keskeytyspyynnön ilmestymisen ja keskeyttävän ohjelman suorittamisen alkamisen välinen aika;
  • keskeytysviive – määräytyy ohjelman tallennus- ja palautusajan kokonaisajan mukaan;
  • syvyys, yleensä sama kuin keskeytysjärjestelmän prioriteettitasojen lukumäärä;
  • keskeyttää järjestelmän kyllästymisen;
  • sallitut ohjelman keskeytysajat (yleensä seuraavan komennon suorituksen loppu).

Keskeytä maskaus käytetään käskemään mikro-ohjainta vastaamaan jokaiseen keskeytystyyppiin tai jättämään ne huomiotta. Keskeytysmaski edustaa binaarikoodia, jonka bitit on osoitettu keskeytyspyynnön lähteille. Binäärikoodin yksi bitti käskee mikro-ohjaimen käsittelemään tämän tyyppisiä keskeytyksiä. Nollabitti päinvastoin ei salli mikro-ohjaimen edetä määritellyn tyyppisten keskeytysten käsittelyyn.
Pääsääntöisesti keskeytysten peittämisen lisäksi on olemassa myös globaali keskeytyksen salliva bitti, jonka nolla-arvo poistaa käytöstä kaikki keskeytyskäsittelijät (paitsi laitteiston nollaus ja hyppy suoritettavan ohjelman alkuun).
Keskeytysmaskin binaarikoodin lisäksi on olemassa myös binäärikoodi keskeytysliput, jonka avulla keskeytyskäsittelijä voi asettaa keskeytyksen lähteen, jos mikro-ohjaimessa on useita lähteitä, joilla on määritetty pyyntö.




Yläosa