31
Mikroprotsessorid: Katkestused Artur Abels

Mikroprotsessorid : Katkestused

  • Upload
    nijole

  • View
    45

  • Download
    0

Embed Size (px)

DESCRIPTION

Mikroprotsessorid : Katkestused. Artur Abels. Praegu. Selleks et saada teada et IO seade on midagi ära teinud või mingisse seisundisse läinud me peame pidevalt seda kontrollima…. Kuidas me tegime siiamaani. - PowerPoint PPT Presentation

Citation preview

Mikroprotsessorid: Katkestused

Mikroprotsessorid: KatkestusedArtur AbelsPraeguSelleks et saada teada et IO seade on midagi ra teinud vi mingisse seisundisse linud me peame pidevalt seda kontrollimaKuidas me tegime siiamaaniAnname UARTile ksu saata midagi ja ootame kuni see saab tehtud, pidevalt kontrollides selle seisundit. Ainult siis teeme midagi edasi. Vi siis vastupidi et ootame kuni saab saadetud enne uue baidi saatmist.See thendab et sel ajal me ei saa teha midagi muud. Niteks me ei saa samal ajal mta ADC abil pinget, teha taimeriga midagi kavalat, vljastada reaalajas LCD ekraanile midagi ja saata andmed lbi UARTi.Kuigi tegelikult iga neist seadmetest sisuliselt ei vaja meie koguaegset sekkumist.Kuidas me tegime siiamaaniSee thendab et enamus protsessoriajast meil lheb raisku mttetu ootamise peale.Rkimata sellest et progemine muutub koledaks kui meil vaja paralleelselt suhelda mitme seadmega ja paralleelselt oodata mitme seadme t lpetamist.

NideNiteks raske oleks teha sellist asja et me paralleelselt tahame teha jrgmised operatsioonid: kasutame taimerit, selleks et vilgutada LEDi mingi madala sagedusega (et peaksime ootama pris kaua)Vtame vastu ja dekodeerime telekapuldi signaali (suhteliselt keeruline jrjestikprotokoll)Saadame midagi le UARTiSee sisuliselt thendaks et meil peaks olema ks tskkel kus sees me pidevalt kontrollime kikide seadmete seisu ja koordineerime nende td.

5Kuidas see umbes neks vlja?CPU: Hei, ADC! Kas sa oled midagi tehtud saanud?ADC: !@#$, ei ole judnudCPU: Hei, UART! Kas sa oled midagi ra saatnud?UART: Sa ksid iga 10 takti tagant, EI OLE VEEL!CPU: Hei, UART! Oot, kas sa pole midagi vastu vtnud?UART: kki ise oskad kiiremini vastu vtta?CPU: Hei, PORTB! Ega sul 5nda jala seis ei muutunud?PORTB: NOCPU: nd on mul 5 takti et midagi kasuliku arvutada, ja RJMP BEGIN. Muidu mingi thtis sndmus jb kahe silma vahel. :SLoeme rahulikult, midagi ei juhtuMida me tahaks?

Teeme rahulikult enda td, kll mulle antakse teada kui midagi juhtub

Teeme rahulikult enda td, kll mulle antakse teada kui midagi juhtubMida me tahaks?

HM! Mul hakkab tekkima overflow.. PROOSEEEE!!! MUL ON OVERFLOW!!!!HM! Mul hakkab tekkima overflow.. PROOSEEEE!!! MUL ON OVERFLOW!!!!Mida me tahaks?

Rahu! Loe edasi!Hm Nii tal on overflow peame tegema xxxxx..Mida me tahaks?

Teeme rahulikult enda td, overflow on tdeldud

Loeme rahulikult, prose tles et kik on korrasSee ongi katkestuste mteSelle asemel et prose kogu aeg peaks seadmeid pollima, nemad annavad talle mrku ise kui on toimunud mingi thtis sndmus.Sama aga riistvaraliselt Kui seadmetel toimub mingi sndmus, siis nad annavad sellest CPUle mrku. Selle peale CPU automaatselt peatab philise programmi titmist ja kivitab protseduuri mis oskab seda sndmust teenindada (katkestuse teenindusrutiin == interrupt handler).Sama aga riistvaraliselt AVR arhitektuuris on iga seadme iga sndmuse jaoks eraldi katkestus.Katkestuse teenindusrutiini aadressi nimetatakse katkestusvektoriks (Interrupt Vector).Katkestusvektorite tabelKsimus: Kuidas CPU teab kus asub mingi katkestuse teenindusrutiin ?Vastus: katkestusvektorite tabel. (datasheet lk. 47)Katkestusvektorite tabelIga katkestuse jaoks on kindlalt mratud aadress mida kutsutakse selle katkestuse puhul.Need aadressid asuvad programmimlu alguses (aadressid 0x0002 kuni 0x002C). Tabel 22, lk 46.Juhul kui me EI KASUTA KATKESTUSI LDSE, siis nendel aadressitel vib asuda meie programmJuhul kui me KASUTAME katkestusi, siis antud aadressiltel PEAVAD olema instruktsioonid JMP antud_katkestuse_teenindusrutiini_aadressInterrupt handlerIga katkestust teenindav rutiin PEAB lppema instruktsiooniga RETI (mitte mingil juhul RET)Instruktsiooni RETI EI TOHI kasutada RET asemel tavalistes protseduuridesKatkestust teenindav rutiin PEAB salvestama KIK registrid mille vrtust ta muudab, ja lpus nende registrite originaalsisu taastamaKatkestust teenindav rutiin PEAB salvestama SREG juhul kui on olemas kas vi ks instruktsioon mis seda muudab. Loomulikult selleks, et lpus SREG taastada.Silmad tahvli pealeKuidas neks vlja Taimer0 letitmiskatkestust kasutav programm

Kuidas toimub katkestuste kutsumineIga katkestuse kohta on olemas 2 lipu: XX_interrupt_enable ja XX_interrupt_flagXX_interrupt_enable panakse programmis psti et lubada antud katkestuse tekkimist. Kui vastav interrupt_enable lipp on maas, siis seda katkestust ei toimu isegi kui seadmel tekis vastav sndmus.XX_interrupt_flag paneb psti IO SEADE kui tal on tekkinud vastav sndmus. Katkestus XX toimub siis kui XX_interrupt_enable ja XX_interrupt_flag on korraga psti.Kuidas toimub katkestuste kutsumineLisaks sellele on olemas STATUS registris lipp GLOBAL INTERRUPT ENABLE (GIE)Kui GIE on maas, siis htegi katkestust ei toimu.Selleks et toimuks mingi katkestus ennekige see peab olema lubatud. Lubatud nii GIE poolt kui ka XX_interrupt_enable poolt.Niteks selleks et lubada timer0 overflow katkestus on vaja TIMSK0 (timer interrupt mask 0) registris panna psti lipp TOIE0 (timer overflow interrupt enable). Ja loomulikult peab psti olema ka GIE.

Nide: taimer0 letitmise katkestusTimer0 letitmise puhul paneb Timer0 lipu TOV0 (timer overflow 0 flag) registris TIFR0 (timer interrupt flags register 0) psti.Juhul kui igal pool on taimeri letitmise katkestus on lubatud, toimub see KOHE kui TOV0 bitis tekib 1.

Kuidas toimub katkestuste kutsumineKui mingi katkestuse lipp tuleb psti, siis sisuliselt automaatselt toimub CALL vastava katkestusvektorite tabeli koha peale (kus omakorda asub JMP tegeliku katkestusteeninduse rutiini peale)See thendab et katkestuse kivitamisel pannakse stacki tagasiprdumisaadress.Katkestus lpeb RETI instruktsiooniga mis kitub peaaegu nagu RET vtab stackist tagasiprdumise aadressi ja hppab sinna.NB!! JRELDUS selleks et kasutada katkestusi STACK PEAB OLEMA INITSIALISEERITUD!!!

Katkestuse tekkimisel AUTOMAATSELT vetakse GIE lipu maha selleks et selle katkestuse sees ei tekiks veel korra sama katkestust. RETI erineb RETst selle poolest et RETI lisaks paneb veel GIE tagasi psti.

Korduvad katkestusedKsimus: miks peale katkestusest vljumist ei teki teist korda sama katkestust?Vastus: katkestuse teenindusrutiin peab tegema selleks vajalikud toimingud, et ei tekiks topelt katkestusi. See, mis toimingud need on sltub sellest, mis katkestusega tegu on. Mnede katkestuste puhul vastava interrupt_flag lipu vetakse maha automaatselt katkestusrutiini kivitamisel, mnede puhul tuleb midagi teha selle lipu maha vtmiseks.Kui peale katkestusrutiinist vljumist vastav katkestuse lipp on ikka veel psti siis kutsutakse katkestus jlle.KsimusiNB!Te EI KUTSU katkestusi.. Te ainult LUBATE neid, kutsub aga IO seade millel on toimunud mingi sndmus.Seega katkestuse kutse vib osutuda kskik mis ajahetkel vaatamata sellele mis teie programmi kohta praegu kivitatakse.Seega katkestuse teenindusrutiin PEAB tagama seda et KIK registrid kaasa arvatud SREG ei muutu. Miks?Ettevaatlust katkestustegaTahvli peal, mis toimub kui mitte salvestada registridTahvli peal, mis toimub kui mitte salvestada SREG.

Paar lihtsat lesannetTeha programm mis seadistab taimerit, ja lubab timer overflow katkestust. Selle katkestuse seest see flipib LEDi (kui ples siis kustutab ja vastupidi). Teha programm mis seadistab tiamerit, ja lubab timer compare match katkestust. Selle katkestuse seest ta flipib LEDi ja nullib TCNT0.Mille poolest teine programm erineb esimesest.Katkestused nagu teine limKuna seadmed vivad peaprogrammi katkestada igal hetkel, siis tekib probleem muutujatega, mida kasutatakse nii katkestuse seest kui ma peaprogrammist.Tpiline panga nideSnkroniseerimineSeega on olemas koodi kohad mida EI TOHI katkestada. Nende koodi jupide ees vetakse GIE lipp maha ja peale pannakse tagasi psti.Seega niikaua kui seda kivitatakse katkestusi toimuda ei saa.Ksimusi