# Přerušení - při výskytu určité události procesor přeruší vykonávání programu a začne vykonávat obslužnou proceduru pro danou událost - po dokončení procedury program pokračuje **Přerušení** (Interrupt) - událost nastane mimo procesor (např. v IO řadiči) - indikace vzniku události je do procesoru zavedena speciálním přerušovacím signálem **Výjimky** (Exceptions) - událost nastane přímo v procesoru (dělení nulou, trap, výpadek stránky, programové přerušení, ...) **Maskovatelná přerušení** - lze je programově (nastavením registru/instrukcí) povolit či zakázat - u nemaskovatelných to nelze **Požadavky na přerušovací systém** 1. globální povolení/zákaz všech přerušení (kromě NMI) 2. selektivní povolování/zákaz jednotlivých přerušení 3. prioritní systém - povolení pouze přerušení s určitou prioritou 4. prioritní systém - při současném vzniku více přerušení se nejprve obslouží to s nejvyšší prioritou 5. vazba každého přerušení na příslušný obslužný program 6. možnost vytvoření vnořených přerušení **Řadič přerušení** - řadič vnějších přerušení může být - kompletně vestavěn v procesoru (např. H8S) - připojen jako samostatný obvod **Uplatnění přerušení** - aktivita požadavku na přerušení se testuje vždy po dokončení instrukce - není-li požadavek na přerušení aktivní, procesor pokračuje další instrukcí - je-li požadavek na přerušení aktivní (a přerušení jsou povolena), zahájí se operace pro jeho obsluhu - ve speciálních případech (výpadek stránky, porušení ochrany paměti, ...) může přerušení/výjimka nastat i v průběhu provádění instrukce **Přerušovací systém procesoru H8S** - několik desítek přerušení od periferních řadičů přímo na čipu - 8 vnějších přerušení (/IRQ7-/IRQ0) - nemaskovatelné přerušení (/NMI) - registry přerušovacího systému - ISR – (Interrupt Status Register) - registr aktivních žádostí o přerušení - nastavuje se automaticky, ale lze jej modifikovat i programově - IER – (Interrupt Enable Register) - povolení jednotlivých přerušení (0/1) - nastavuje se programově podle potřeby - IPR – (Interrupt Priority Register) - priorita přerušení (0-7) - nastavuje se programově podle potřeby - EXR - úroveň povolených přerušení (aktivní jsou pouze ty s IPR > EXR) - nastavuje se programově, při obsluze přerušení se modifikuje automaticky **Určení adresy obslužného programu (H8S)** - na začátku paměti je tabulka s adresami obslužných programů (přerušovací vektory) - každé přerušení má pevně přidělenou položku v tabulce **Obsluha přerušení (H8S)** 1. inicializace přerušovacího systému - nastavení přeruš. vektorů (před spuštěním nebo za běhu) - nastavení periferních řadičů - nastavení priorit - povolení přerušení - obecně instrukce Enable Interrupt, u H8S zápisem priority do EXR 2. hardwarové provedení operace při vzniku přerušení - uložení PC (3 byte), CCR (1 byte) a EXR (1 byte) do zásobníku - nastavení hodnoty IPR do EXR - přečtení přerušovacího vektoru a nastavení PC 3. softwarové provedení operace v obslužné proceduře - uloženích používaných registrů do zásobníku - obsluha přerušení (IO řadič, ...) - při obsluze přerušení mohou být ostatní přerušení - zakázána, povolena všechna nebo ta s vyšší prioritou - obnovení obsahu uložených registrů 4. provedení instrukce RTE na konci obslužného programu - ze zásobníku se postupně vybere a obnové původní stav EXR, CCR, PC (hardwarově) **Vnořená přerušení** - obslužný program přerušení je znovu přerušen - při akceptování přerušení se nastaví hodnota IPR do EXR - další přerušení musí mít vyšší priotitu než to obsluhované - po dokončení obsluhy druhého přerušení pokračuje obsluha prvního přerušení **Interrupt pending** - pokud má přerušení nízkou prioritu, tak se nemůže okamžitě obsloužit - přerušení se obslouží až po nastavení EXR na předchozí hodnotu **Vnější řadič přerušení** - obsahuje masky pro jednotlivá přerušení - řadí vnější přerušení podle priorit **Použití přerušení k řízení IO operací** - IO řadič může přerušením indikovat připravenost speciálním signálem zavedeným na přerušovací vstup procesoru - v obslužné proceduře se provede zápis/čtení dat do/z IO řadiče - není potřeba periodicky testovat stav IO systému - vhodné pro pomalé přenosy