Přerušovací systém u microřadiče 80C196 a jeho obsluha
Popis systému
- vnitřní přerušení je od vestavěných periferií (HSI, HSO, T1 a T2, Sériový kanál, ADC), celkem jej jich 14(zdrojů) (viz blokové schéma)
- vnější přerušení – jsou 4(zdroje) (NMI, EXINT, …)
Do řadiče přerušení přijde žádost(může jich být více). Řadič pošle už jen jednu vybranou žádost do CPU. CPU tuto žádost zpracuje.
Do řadiče přerušení přijde nějaké přerušení. Toto přerušení se zaznamená do jednoho z registrů INT PENDING (v něm má každý typ přerušení svůj bit). V tuto chvíli víme, jaký typ žádosti o přerušení nastal. Zdrojů přerušení je však více než je typů (1 typ může mít třeba 3 zdroje – např. typ ST v reg. IntPending má tři zdroje – viz blokové schéma). To od jakého zdroje dotyčný typ přerušení nastal se pozná podle nahozeného bitu v registru IOS, který se otestuje. V registru IOC si programátor nastaví k danému typu žádaný zdroj přerušení(např. k typu EXINT si mohu zvolit zdroj od bitu P2.2 nebo P0.7). Toto nastavení se porovná s registrem IOS (toto je vlastně softwarově udělaný přepínač, který je na blokovém schématu).
Maskování přerušení
Maskování přerušení se provádí pomocí registru INT MASK, který má shodné bity jako registr INT PENDING. Pokud je vůbec přerušení obecně povoleno v registru PSW, porovná se registr INT MASK s registrem INT PENDING (provede se jejich logický součin – &) => Pokud není přerušení maskováno (v registru INT MASK je na odpovídajícím bitu log1) a zároveň toto přerušení nastalo, je ve výsledném slově, které se posílá dále do PRIORITNÍHO KODÉRU, na daném místě (odpovídajícím bitu v registru IntPending) log1.
INT_PEND 0 0 0 1 1 0 0 1
INT_MASK 0 1 0 1 0 0 0 1
&
Výsledné slovo 1 1
Priotity
Výsledné slovo přejde do prioritního dekodéru. Priority jsou pevně dány, nelze je programovat (každý typ má pevně danou prioritu). Dle toho se určí, co půjde dále do GENERÁTORU VEKTORU PŘERUŠENÍ.
Vektor přerušení
V Generátoru vektoru přerušení se vygeneruje daný vektor přerušení (adresa začátku podprogramu pro obsluhu daného přerušení). Každý typ přerušení má v paměti pevně danou adresu (např. EXINT má 200Eh – viz blokové schéma), na které je uložen vektor přerušení tohoto typu. Generátor vektoru přerušení z této adresy vektor přečte (vektor přerušení na adresu uloží programátor, některé vektory jsou předdefinovány i s obslužnými ppgr. (NMI-nemaskovatelné(pokles napájení,…), TRAP-krokování, UO-neznámý kód ). Tento vektor přerušení předá řadič CPU. Jakmile řadič vygeneruje vektor přerušení, automaticky nuluje příslušný bit v registru INT_PENDING.
CPU i ŘADIČ testuje žádost o přerušení na konci každého instrukčního cyklu (po skončení každé instrukce).
Podprogram
Při skoku do podprogramu se automaticky uloží jen návratová adresa. Ostatní musí programátor obstarat sám. Uložení PSW, INT_MASK, INT_PENDING a WSR se provádí pomocí instrukce PUSHF, vyjmutí pak POPF.
Na začátku obslužného programu by měl programátor zakázat všechna přerušení (pomocí instrukce DI), na konci je zase povolit (pomocí instrukce EI).
Pokud programátor použije v ppgr. Instrukce PUSH, musí použít stejný počet instrukcí POP – aby při skončení ppgr. Byla na vrcholu zásobníku návratová adresa.
Poslední instrukce musí být RET – vyzvedne ze zásobníku návratovou adresu a uloží ji zpět do čítače PC (něco jako IP u 86) – poté se pokračuje v běhu přerušeného programu.
-poznámka : instrukce PUSH by měla automaticky zakázat přerušení (jako DI) a POP zase povolit (jako EI), ale stalo se nám, že tomu tak nebylo => není to jisté
SP je ukazatel zásobníku, automaticky se mění při instrukcích POP, PUSH