1 / 31

Mikroprotsessorid : Katkestused

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.

nijole
Download Presentation

Mikroprotsessorid : Katkestused

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Mikroprotsessorid: Katkestused ArturAbels

  2. Praegu • Selleks et saada teada et IO seade on midagi ära teinud või mingisse seisundisse läinud me peame pidevalt seda kontrollima…

  3. Kuidas me tegime siiamaani • Anname UARTile käsu saata midagi ja ootame kuni see saab tehtud, pidevalt kontrollides selle seisundit. Ainult siis teeme midagi edasi. Või siis vastupidi et ootame kuni saab saadetud enne uue baidi saatmist. • See tähendab et sel ajal me ei saa teha midagi muud. Näiteks me ei saa samal ajal mõõta ADC abil pinget, teha taimeriga midagi kavalat, väljastada reaalajas LCD ekraanile midagi ja saata andmed läbi UARTi. • Kuigi tegelikult iga neist seadmetest sisuliselt ei vaja meie koguaegset sekkumist.

  4. Kuidas me tegime siiamaani • See tähendab et enamus protsessoriajast meil läheb raisku mõttetu ootamise peale. • Rääkimata sellest et progemine muutub koledaks kui meil vaja paralleelselt suhelda mitme seadmega ja paralleelselt oodata mitme seadme töö lõpetamist.

  5. Näide • Näiteks raske oleks teha sellist asja et me paralleelselt tahame teha järgmised operatsioonid: • kasutame taimerit, selleks et vilgutada LEDi mingi madala sagedusega (et peaksime ootama päris kaua) • Võtame vastu ja dekodeerime telekapuldi signaali (suhteliselt keeruline järjestikprotokoll) • Saadame midagi üle UARTi • See sisuliselt tähendaks et meil peaks olema üks tsükkel kus sees me pidevalt kontrollime kõikide seadmete seisu ja koordineerime nende tööd.

  6. Kuidas see umbes näeks välja? CPU: “Hei, ADC! Kas sa oled midagi tehtud saanud?” ADC: “!@#$, eiole jõudnud” CPU: “Hei, UART! Kas sa oled midagi ära saatnud?” UART: “Sa küsid iga 10 takti tagant, EI OLE VEEL!” CPU: “Hei, UART! Oot, kas sa pole midagi vastu võtnud?” UART: “äkki ise oskad kiiremini vastu võtta?” CPU: “Hei, PORTB! Ega sul 5nda jala seis ei muutunud?” PORTB: “NO” CPU: nüüd on mul 5 takti et midagi kasuliku arvutada, ja RJMP BEGIN. Muidu mingi tähtis sündmus jääb kahe silma vahel…. :S

  7. Mida me tahaks? Teeme rahulikult enda tööd, küll mulle antakse teada kui midagi juhtub Loeme rahulikult, midagi ei juhtu

  8. Mida me tahaks? Teeme rahulikult enda tööd, küll mulle antakse teada kui midagi juhtub HM! Mul hakkab tekkima overflow.. PROOSEEEE!!! MUL ON OVERFLOW!!!!

  9. Mida me tahaks? Rahu! Loe edasi! Hm… Nii tal on overflow… peame tegema xxxxx….. HM! Mul hakkab tekkima overflow.. PROOSEEEE!!! MUL ON OVERFLOW!!!!

  10. Mida me tahaks? Teeme rahulikult enda tööd, overflow on töödeldud Loeme rahulikult, prose ütles et kõik on korras

  11. See ongi katkestuste mõte • Selle asemel et prose kogu aeg peaks seadmeid pollima, nemad annavad talle märku ise kui on toimunud mingi tähtis sündmus.

  12. Sama aga riistvaraliselt • Kui seadmetel toimub mingi sündmus, siis nad annavad sellest CPUle märku. • Selle peale CPU automaatselt peatab põhilise programmi täitmist ja käivitab protseduuri mis oskab seda sündmust teenindada (katkestuse teenindusrutiin == interrupthandler).

  13. Sama aga riistvaraliselt • AVR arhitektuuris on iga seadme iga sündmuse jaokseraldi katkestus. • Katkestuse teenindusrutiini aadressi nimetatakse katkestusvektoriks (InterruptVector).

  14. Katkestusvektorite tabel • Küsimus: Kuidas CPU teab kus asub mingi katkestuse teenindusrutiin ? • Vastus: katkestusvektorite tabel. (datasheet lk. 47)

  15. Katkestusvektorite tabel • Iga katkestuse jaoks on kindlalt määratud aadress mida kutsutakse selle katkestuse puhul. • Need aadressid asuvad programmimälu alguses (aadressid 0x0002 kuni 0x002C). Tabel 22, lk 46. • Juhul kui me EI KASUTA KATKESTUSI ÜLDSE, siis nendel aadressitel võib asuda meie programm • Juhul kui me KASUTAME katkestusi, siis antud aadressiltelPEAVAD olema instruktsioonid JMP antud_katkestuse_teenindusrutiini_aadress

  16. Interrupthandler • Iga katkestust teenindav rutiin PEAB lõppema instruktsiooniga RETI (mitte mingil juhul RET) • Instruktsiooni RETI EI TOHI kasutada RET asemel tavalistes protseduurides • Katkestust teenindav rutiin PEAB salvestama KÕIK registrid mille väärtust ta muudab, ja lõpus nende registrite originaalsisu taastama • Katkestust teenindav rutiin PEAB salvestama SREG juhul kui on olemas kas või üks instruktsioon mis seda muudab. Loomulikult selleks, et lõpus SREG taastada.

  17. Silmad tahvli peale

  18. Kuidas näeks välja Taimer0 ületäitmiskatkestust kasutav programm

  19. Kuidas toimub katkestuste kutsumine • Iga katkestuse kohta on olemas 2 lipu: XX_interrupt_enableja XX_interrupt_flag • XX_interrupt_enablepanakse programmis püsti et lubada antud katkestuse tekkimist. Kui vastav interrupt_enable lipp on maas, siis seda katkestust ei toimu isegi kui seadmel tekis vastav sündmus. • XX_interrupt_flag paneb püsti IO SEADE kui tal on tekkinud vastav sündmus. Katkestus XX toimub siis kui XX_interrupt_enable ja XX_interrupt_flag on korraga püsti.

  20. Kuidas toimub katkestuste kutsumine • Lisaks sellele on olemas STATUS registris lipp GLOBAL INTERRUPT ENABLE (GIE) • Kui GIE on maas, siisühtegi katkestust ei toimu. • Selleks et toimuks mingi katkestus ennekõige see peab olema lubatud. Lubatud nii GIE poolt kui ka XX_interrupt_enable poolt. • Näiteks selleks et lubada timer0 overflow katkestus on vaja TIMSK0 (timerinterrupt mask 0) registris panna püsti lipp TOIE0 (timeroverflowinterruptenable). Ja loomulikult peab püsti olema ka GIE.

  21. Näide: taimer0 ületäitmise katkestus • Timer0 ületäitmise puhul paneb Timer0 lipu TOV0 (timeroverflow0 flag) registris TIFR0 (timerinterruptflags register 0) püsti. • Juhul kui igal pool on taimeri ületäitmise katkestus on lubatud, toimub see KOHE kui TOV0 bitis tekib 1.

  22. Kuidas toimub katkestuste kutsumine • Kui mingi katkestuse lipp tuleb püsti, siis sisuliselt automaatselt toimub CALL vastava katkestusvektorite tabeli koha peale (kus omakorda asub JMP tegeliku katkestusteeninduse rutiini peale) • See tähendab et katkestuse käivitamisel pannakse stacki tagasipöördumisaadress. • Katkestus lõpeb RETI instruktsiooniga mis käitub peaaegu nagu RET – võtab stackist tagasipöördumise aadressi ja hüppab sinna. • NB!! JÄRELDUS – selleks et kasutada katkestusi STACK PEAB OLEMA INITSIALISEERITUD!!!

  23. Katkestuse tekkimisel AUTOMAATSELT võetakse 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 püsti.

  24. Korduvad katkestused • Küsimus: miks peale katkestusest väljumist ei teki teist korda sama katkestust? • Vastus: katkestuse teenindusrutiin peab tegema selleks vajalikud toimingud, et ei tekiks topelt katkestusi. See, mis toimingud need on sõltub sellest, mis katkestusega tegu on. Mõnede katkestuste puhul vastava interrupt_flag lipu võetakse maha automaatselt katkestusrutiini käivitamisel, mõnede puhul tuleb midagi teha selle lipu maha võtmiseks. • Kui peale katkestusrutiinist väljumist vastav katkestuse lipp on ikka veel püsti siis kutsutakse katkestus jälle.

  25. Küsimusi

  26. NB! • Te EI KUTSU katkestusi.. Te ainult LUBATE neid, kutsub aga IO seade millel on toimunud mingi sündmus. • Seega katkestuse kutse võib osutuda ükskõik mis ajahetkel vaatamata sellele mis teie programmi kohta praegu käivitatakse. • Seega katkestuse teenindusrutiin PEAB tagama seda et KÕIK registrid kaasa arvatud SREG ei muutu. Miks?

  27. Ettevaatlust katkestustega • Tahvli peal, mis toimub kui mitte salvestada registrid • Tahvli peal, mis toimub kui mitte salvestada SREG.

  28. Paar lihtsat ülesannet • Teha programm mis seadistab taimerit, ja lubab timeroverflow katkestust. Selle katkestuse seest see flipib LEDi (kui põles siis kustutab ja vastupidi). • Teha programm mis seadistab tiamerit, ja lubab timercomparematch katkestust. Selle katkestuse seest ta flipib LEDi ja nullib TCNT0. • Mille poolest teine programm erineb esimesest.

  29. Katkestused nagu teine lõim • Kuna seadmed võivad peaprogrammi katkestada igal hetkel, siis tekib probleem muutujatega, mida kasutatakse nii katkestuse seest kui ma peaprogrammist. • Tüüpiline “panga näide”

  30. Sünkroniseerimine • Seega on olemas koodi kohad mida EI TOHI katkestada. Nende koodi jupide ees võetakse GIE lipp maha ja peale pannakse tagasi püsti. • Seega niikaua kui seda käivitatakse katkestusi toimuda ei saa.

  31. Küsimusi

More Related