# 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