Přerušení v procesorech 65xx - Interrupts in 65xx processors

Řada mikroprocesorů 65xx , sestávající z technologie MOS 6502 a jejích derivátů, WDC 65C02 , WDC 65C802 a WDC 65C816 a CSG 65CE02 , zvládá přerušení podobným způsobem. Pro všechny procesory 65xx jsou společné tři signály přerušení hardwaru a jedno softwarové přerušení , instrukce BRK . WDC 65C816 přidává čtvrté hardwarové přerušení - ABORT , užitečné pro implementaci architektur virtuální paměti - a instrukci pro přerušení softwaru COP (také v 65C802), určené pro použití v systému s koprocesorem nějakého typu (např. S plovoucí desetinnou čárkou) procesor ).

Přerušit typy

65xx vektor přerušení lokality
Přerušit Vektor (hexadecimální)
LSB MSB
PŘERUŠIT FFF8 FFF9
POLICAJT FFF4 FFF5
IRQ / BRK FFFE FFFF
NMI FFFA FFFB
RESET FFFC FFFD

Všechny signály přerušení hardwaru jsou aktivní nízké a jsou následující:

RESET
reset signál , úroveň spouštěné
NMI
NMI , hrana spouštěné
IRQ
maskable přerušení , level-spustil
PŘERUŠIT
účelové, nemaskovatelné přerušení (pouze 65C816, viz níže), spuštěné na úrovni

Detekce signálu RESET způsobí, že procesor vstoupí do inicializační periody systému šesti hodinových cyklů, po které nastaví příznak deaktivace požadavku na přerušení ve stavovém registru a načte programový čítač s hodnotami uloženými ve vektoru inicializačního procesoru ( $ 00FFFC - $ 00FFFD ) před zahájením popravy. Pokud pracuje v nativním režimu, jsou 65C816/65C802 přepnuty zpět do emulačního režimu a zůstanou tam, dokud se nevrátí do nativního režimu pod softwarovou kontrolou.

Umístění vektoru přerušení 65C816/65C802 v nativním režimu
Přerušit Vektor (hexadecimální)
LSB MSB
PŘERUŠIT 00FFE8 00FFE9
BRK 00FFE6 00FFE7
POLICAJT 00FFE4 00FFE5
IRQ 00FFEE 00FFEF
NMI 00FFEA 00FFEB
RESET Žádný

Detekce signálu NMI nebo IRQ , stejně jako provedení instrukce BRK , způsobí stejný celkový sled událostí, které jsou v tomto pořadí:

  1. Procesor dokončí aktuální instrukci a podle potřeby aktualizuje registry nebo paměť, než odpoví na přerušení.
  2. 65C816/65C802 při provozu v nativním režimu: Registr banky programu ( PB , část adresní sběrnice A16-A23 ) je vložen do zásobníku hardwaru .
  3. Nejvýznamnější bajt (MSB) čítače programu ( PC ) je vložen do zásobníku.
  4. Nejméně významný bajt (LSB) čítače programu je vložen do zásobníku.
  5. Stavový registr ( SR ) je vložen do zásobníku.
  6. Příznak deaktivace přerušení je nastaven ve stavovém registru.
  7. 65C816/65C802: PB je nabito 00 USD .
  8. PC se načte z příslušného vektoru (viz tabulky).

Chování 65C816, když je uplatněn ABORT, se v některých ohledech liší od výše uvedeného popisu a je samostatně diskutováno níže.

Všimněte si, že procesor netlačí registry akumulátorů a indexů do zásobníku - kód v obsluze přerušení musí provést tento úkol a také obnovit registry při ukončení zpracování přerušení, podle potřeby. Všimněte si také, že vektor pro IRQ je stejný jako pro BRK ve všech osmibitových procesorech 65xx, stejně jako v 65C802/65C816 při provozu v emulačním režimu. Při provozu v nativním režimu poskytují 65C802/65C816 oddělené vektory pro IRQ a BRK .

Je -li nastaveno, příznak deaktivace požadavku na přerušení ( bit I ve stavovém registru) zakáže detekci signálu IRQ , ale nebude mít žádný vliv na žádná jiná přerušení (viz níže však část o instrukci WAI implementované v procesorech WDC CMOS) . Navíc u 65 (c) 02 nebo 65C816/65C802 pracujících v emulačním režimu bude mít kopie stavového registru, která je zasunuta do zásobníku, nastaven příznak B, pokud byla příčinou BRK ( softwarové přerušení ) přerušení nebo zrušeno, pokud bylo příčinou IRQ . Rutina služby přerušení proto musí načíst kopii uloženého stavového registru, odkud byl vložen do zásobníku, a zkontrolovat stav příznaku B , aby bylo možné rozlišovat mezi IRQ a BRK . Tento požadavek je eliminován při provozu 65C802/65C816 v nativním režimu, kvůli odděleným vektorům pro dva typy přerušení.

PŘERUŠENÍ přerušení

Vstup přerušení ABORTB 65C816 má poskytnout prostředky pro přesměrování spuštění programu, když je detekována hardwarová výjimka, jako je chyba stránky nebo narušení přístupu do paměti . Odezva procesoru, když je vstup ABORTB uplatněn (negován), je tedy odlišný od toho, když je uplatněn IRQB a/nebo NMIB . Rovněž dosažení správného provozu v reakci na ABORTB vyžaduje, aby k přerušení došlo ve správný čas během cyklu stroje , zatímco pro IRQB nebo NMIB takový požadavek neexistuje .

Když je ABORTB uplatněn během platného cyklu paměti, to znamená, když procesor uplatnil stavové výstupy VDA a/nebo VPA , dojde k následující posloupnosti událostí:

  1. Procesor dokončí aktuální instrukci, ale žádným způsobem nezmění registry ani paměť - výsledky výpočtu dokončené instrukce budou vyřazeny. Přerušení přerušení doslova nezruší pokyn.
  2. Programová banka ( PB , viz výše) je zasunuta do zásobníku.
  3. Nejvýznamnější bajt (MSB) adresy přerušené instrukce je vložen do zásobníku.
  4. Nejméně významný bajt (LSB) adresy přerušené instrukce je vložen do zásobníku.
  5. Stavový registr je vložen do zásobníku.
  6. Příznak deaktivace přerušení je nastaven ve stavovém registru.
  7. PB je nabito 00 USD .
  8. Čítač programu je načten z vektoru ABORT (viz tabulky).

Vzhledem k tomu, adresa posune do zásobníku je to, že z chybného instrukci spíše než obsah čítače programu, že vykoná Rti ( R e T urnu od I nterrupt) v návaznosti na ABORT přerušení způsobí, že procesor k návratu do chybného instrukce, spíše než další instrukce, jako by tomu bylo u ostatních přerušení.

Aby procesor správně reagoval na přerušení, musí logika systému uplatnit (negovat) vstup ABORTB , jakmile byla na sběrnici umístěna platná adresa a bylo zjištěno, že adresa představuje poruchu stránky, narušení přístupu do paměti nebo jinou anomálií (např. pokus o provedení privilegované instrukce). Logika tedy nesmí prosazovat ABORTB, dokud procesor nepotvrdí signály VDA nebo VPA . Také ABORTB musí zůstat prosazen až do pádu hodin fáze-dva a poté musí být okamžitě uvolněn. Pokud tato časová omezení nejsou dodržena, samotný obslužný program přerušení přerušení může být přerušen, což způsobí, že registry a/nebo paměť budou změněny možná nedefinovaným způsobem.

Přerušte anomálie

V NMOS 6502 a jeho deriváty (např, 6510), současné tvrzení o hardware přerušení vedení a provádění BRK nebyla zohledněna v designu-the BRK instrukce budou ignorovány v takovém případě. Také stav příznaku desítkového režimu ve stavovém registru procesoru se po přerušení jakéhokoli druhu nezmění. Toto chování může potenciálně vést k obtížně lokalizovatelné chybě v obsluze přerušení, pokud je v době přerušení aktivován desítkový režim. Tyto anomálie byly opraveny ve všech verzích procesoru CMOS .

Aspekty přerušení obsluhy

Dobře navržený a stručný popisovač přerušení nebo rutina služby přerušení (ISR) nejenže bude rychle obsluhovat jakoukoli událost, která způsobí přerušení, bude to dělat, aniž by jakýmkoli způsobem zasahoval do přerušeného úkolu v popředí-ISR musí být „transparentní“, aby přerušený úkol (i když ve specializovaných případech mohou platit výjimky). To znamená, že ISR musí zachovat stav mikroprocesoru (MPU) a nerušit nic v paměti, co by rušit nemělo. ISR by navíc měl být plně reentrantní , což znamená, že pokud se dvě přerušení dostaví v těsném sledu za sebou, ISR bude moci pokračovat ve zpracování prvního přerušení po provedení servisu druhého. Reentrancy je obvykle dosaženo použitím pouze hardwarového zásobníku MPU pro ukládání (i když existují i ​​jiné možné metody).

Zachování stavu MPU znamená, že ISR musí zajistit, aby jakékoli hodnoty, které byly v registrech MPU v době přerušení, byly tam, když ISR skončí. Část procesu uchování je automaticky zpracována MPU, když potvrdí přerušení, protože před spuštěním ISR posune čítač programu (a programovou banku v 65C816/65C802) a stavový registr do zásobníku. Po dokončení ISR, když je vykonána instrukce RTI , MPU proces obrátí. Žádný člen rodiny 65xx nevkládá do zásobníku žádné jiné registry.

Ve většině ISR musí být akumulátorové a/nebo indexové registry zachovány, aby byla zajištěna transparentnost, a později je obnovit jako konečné kroky před provedením RTI . V případě 65C816/65C802 je třeba vzít v úvahu, zda je v době přerušení provozován v emulačním nebo nativním režimu. Pokud jde o druhou možnost, může být také nutné zachovat registry datové banky ( DB ) a přímé (nulové) stránky ( DP ), aby byla zaručena transparentnost. Operační systém 65C816 v nativním režimu také může dobře používat jiné umístění zásobníku než aplikační software, což znamená, že ISR by musel zachovat a následně obnovit ukazatel zásobníku ( SP ). Dále komplikuje záležitost s 65C816/65C802 to, že velikosti akumulátorů a indexových registrů mohou být buď 8 nebo 16 bitů při provozu v nativním režimu, což vyžaduje, aby jejich velikosti byly zachovány pro pozdější obnovu.

Metody, kterými je stav MPU zachován a obnoven v rámci ISR, se budou lišit podle různých verzí rodiny 65xx. U procesorů NMOS (např. 6502, 6510, 8502 atd.) Může existovat pouze jeden způsob, kterým jsou zachovány registry akumulátorů a indexů, protože do zásobníku lze zatlačit a vytáhnout pouze akumulátor. Proto je typický následující vstupní kód ISR:

        PHA                     ; save accumulator
        TXA
        PHA                     ; save X-register
        TYA
        PHA                     ; save Y-register
        CLD                     ; ensure binary mode by clearing decimal flag

CLD instrukce je nutné, protože, jak již bylo uvedeno, NMOS verzí 6502 nerušte na D (režim desítkové) příznak ve stavovém registru, když dojde k přerušení.

Jakmile jsou registry akumulátorů a indexů zachovány, ISR je může použít podle potřeby. Když ISR dokončí svou práci, obnoví registry a poté obnoví přerušenou úlohu v popředí. Opět je typický následující kód NMOS:

        PLA
        TAY                     ; restore Y-register
        PLA
        TAX                     ; restore X-register
        PLA                     ; restore accumulator
        RTI                     ; resume interrupted task

Důsledkem instrukce RTI je, že se MPU vrátí do desítkového režimu, pokud to byl jeho stav v době přerušení.

65C02 a 65C816 / 65C802 při provozu v režimu emulace, vyžaduje méně kódu, protože jsou schopny tlačit a táhnout registrů indexů bez použití akumulátoru jako prostředník. Před provedením ISR také automaticky vymažou desetinný režim. Typické je následující:

        PHA                     ; save accumulator
        PHX                     ; save X-register
        PHY                     ; save Y-register

Po dokončení by ISR proces obrátil:

        PLY                     ; restore Y-register
        PLX                     ; restore X-register
        PLA                     ; restore accumulator
        RTI                     ; resume interrupted task

Jak již bylo uvedeno dříve, s 65C816/65C802 je při provozu v nativním režimu trochu složitější kvůli variabilním velikostem registrů a nutnosti účtování registrů DB a DP . V případě indexových registrů je lze zasílat bez ohledu na jejich velikosti, protože změna velikostí automaticky nastaví nejvýznamnější bajt (MSB) v těchto registrech na nulu a při obnovení posunuté hodnoty nebudou ztracena žádná data. rejstříky rejstříků mají stejnou velikost, jakou měly při tlačení.

Akumulátorem jsou však ve skutečnosti dva registry: označené .A a .B . Stisknutím akumulátoru, když je nastaven na 8 bitů, se nezachová .B , což by mohlo vést ke ztrátě průhlednosti, pokud by ISR jakýmkoli způsobem změnil .B . Proto akumulátor musí být vždy nastaven na 16 bitů, než bude tlačen nebo tažen, pokud ISR bude používat .B . Je také efektivnější nastavit rejstříky indexů na 16 bitů, než je zatlačíte. V opačném případě musí ISR poslat další kopii stavového registru, aby mohl obnovit velikosti registrů před jejich vytažením ze zásobníku.

U většiny ISR dosáhne cíle transparentnosti následující vstupní kód:

        PHB                     ; save current data bank
        PHD                     ; save direct page pointer
        REP #%00110000          ; select 16 bit registers
        PHA                     ; save accumulator
        PHX                     ; save X-register
        PHY                     ; save Y-register

Ve výše uvedeném fragmentu kódu, symbol % je MOS technologie a WDC standardní assembler syntaxe pro bitový operand .

Pokud má ISR své vlastní přiřazené umístění zásobníku, musí dojít k zachování ukazatele zásobníku ( SP ) v paměti poté, co došlo k výše uvedeným pushům - mělo by být zřejmé, proč tomu tak je. Následující kód, přidaný do výše uvedené sekvence, by tento požadavek zvládl:

        TSC                     ; copy stack pointer to accumulator
        STA stkptr              ; save somewhere in safe RAM
        LDA isrptr              ; get ISR's stack pointer &...
        TCS                     ; set new stack location

Po dokončení ISR by se výše uvedené procesy obrátily následovně:

        REP #%00110000          ; select 16 bit registers
        TSC                     ; save ISR's SP...
        STA isrptr              ; for subsequent use
        LDA isstkptr            ; get foreground task's SP &...
        TCS                     ; set it
        PLY                     ; restore Y-register
        PLX                     ; restore X-register
        PLA                     ; restore accumulator
        PLD                     ; restore direct page pointer
        PLB                     ; restore current data bank
        RTI                     ; resume interrupted task

Všimněte si toho, že po spuštění RTI 65C816/65C802 automaticky obnoví velikosti registru tak, jak byly, když došlo k přerušení, protože vytažením dříve uloženého stavového registru se nastaví nebo smaže oba bity velikosti registru na to, jaké byly v době přerušení .

I když je možné přepnout 65C816/65C802 z nativního režimu do emulačního režimu v rámci ISR, je to plné nebezpečí. Kromě vynucení registru akumulátorů a rejstříku na 8 bitů (což způsobí ztrátu nejvýznamnějšího bajtu v rejstřících rejstříků), vstup do režimu emulace zkrátí ukazatel zásobníku na 8 bitů a přemístí samotný zásobník na RAM 1 stránky 1 . Výsledkem je, že zásobník, který existoval v době přerušení, bude nepřístupný, pokud nebyl také na stránce 1 RAM a nebyl větší než 256 bajtů. Přepínání režimů při údržbě přerušení obecně není doporučený postup, ale může být nutné v konkrétních provozních prostředích.

Pomocí BRK a COP

Jak již bylo uvedeno výše, BRK a COP jsou softwarová přerušení a jako taková mohou být použita různými způsoby k implementaci funkcí systému.

Historickým využitím BRK bylo pomáhat při opravách PROM, když byly ve firmwaru systému objeveny chyby . Typickou technikou často používanou při vývoji firmwaru bylo zařídit, aby vektor BRK ukazoval na neprogramovanou „oblast oprav“ v PROM. V případě, že bude objevena chyba, oprava bude provedena „odpálením“ všech pojistek na adresu, kde se nacházela chybná instrukce, čímž se změní operační kód instrukce na $ 00 . Po provedení výsledné BRK by byla MPU přesměrována do oblasti opravy, do které by byl zapsán vhodný kód opravy. Kód oblasti opravy často začínal „čicháním zásobníku“, aby se určila adresa, na které byla chyba zjištěna, což potenciálně umožnilo přítomnost více než jedné opravy v PROM. Použití BRK pro opravu PROM se zmenšilo, jakmile byly EPROM a EEPROM běžně dostupné.

Další použití BRK při vývoji softwaru je jako pomoc při ladění ve spojení s monitorem strojového jazyka . Přepsáním operačního kódu BRK ( $ 00 ) a nasměrováním hardwarového vektoru BRK do vstupního bodu monitoru lze způsobit zastavení programu v libovolném požadovaném bodě, což umožní monitoru převzít kontrolu. V té době lze prozkoumat paměť, zobrazit hodnoty registru procesoru, opravný kód atd. Ladění, jak tvrdí Kuckes a Thompson, lze usnadnit liberálním posypáním něčího kódu pokyny NOP (opcode $ EA ), které lze nahradit Pokyny BRK beze změny skutečného chování laděného programu.

Charakteristikou instrukcí BRK a COP je, že procesor zachází buď jako dvoubajtová instrukce: samotný operační kód a následující byte, který se označuje jako „podpis“. Po provedení BRK nebo COP procesor přidá dva do čítače programu, než jej posune do zásobníku. Z tohoto důvodu, když Rti ( R e T urnu od I nterrupt) je proveden, přerušený program bude pokračovat na adresu bezprostředně po podpisu. Pokud je jako ladicí zařízení použit BRK , může být nutné upravit čítač programu tak, aby ukazoval na podpis, aby bylo možné pokračovat v provádění tam, kde se očekávalo. Alternativně může být NOP vložen jako podpisový „zástupný symbol“, v takovém případě nebude vyžadována žádná úprava čítače programu.

Skutečnost, že BRK a COP dvakrát zvýší čítač programu, než jej posune do zásobníku, usnadňuje techniku ​​jejich zpracování jako instrukcí pro volání supervizora , jak je lze nalézt na některých sálových počítačích . Obvyklým postupem je považovat podpis za index služby operačního systému. Obslužný program BRK nebo COP operačního systému načte hodnotu čítače programu zaslaného do zásobníku, sníží jej a načte z výsledného umístění paměti, aby získal podpis. Po převodu podpisu na index založený na nule lze pomocí jednoduché vyhledávací tabulky načíst čítač programu s adresou správné servisní rutiny. Po dokončení servisní rutiny by instrukce RTI byla použita k vrácení řízení programu, který vyvolal volání operačního systému. Všimněte si toho, že podpis pro BRK může mít libovolnou hodnotu, zatímco podpis pro COP by měl být omezen na rozsah $ 00 - $ 7F .

Použití BRK a/nebo COP k vyžádání služby operačního systému znamená, že uživatelské aplikace nemusí znát vstupní adresu každé funkce operačního systému, pouze správný podpisový byte pro vyvolání požadované operace. Přemístění operačního systému do paměti tedy nenaruší kompatibilitu se stávajícími uživatelskými aplikacemi. Také, protože provádění BRK nebo COP vždy vektoruje procesor na stejnou adresu, může být použit jednoduchý kód pro zachování registrů v zásobníku před přepnutím kontroly na požadovanou službu. Tento programovací model však bude mít za následek poněkud pomalejší provádění ve srovnání s voláním služby jako podprogramu , primárně v důsledku činnosti zásobníku, ke které dochází při jakémkoli přerušení. Také požadavky na přerušení budou deaktivovány spuštěním BRK nebo COP , což vyžaduje, aby je operační systém znovu povolil.

Pokyny WAI a STP

WAI ( WA it for I nterrupt, opcode $ CB ) je instrukce dostupná u WDC verze 65C02 a 65C816/65C802 mikroprocesorů (MPU), která zastaví MPU a uvede ji do semi-katatonického stavu, dokud hardwarové přerušení vyskytuje se jakýkoli druh. Primární využití pro WAI je v nízkoenergetických vestavěných systémech, kde MPU nemá co dělat, dokud nenastane očekávaná událost a je požadována minimální spotřeba energie, protože systém čeká a/nebo je vyžadována rychlá reakce. Typický příklad kódu, který by využíval WAI, je následující:

        SEI                     ; disable IRQs
        WAI                     ; wait for hardware interrupt
        ; ... execution resumes here

Ve výše uvedeném fragmentu kódu se MPU zastaví po provedení WAI a přejde do stavu velmi nízké spotřeby energie. Navzdory tomu, že požadavky na přerušení (IRQ) byly deaktivovány před instrukcí WAI , MPU bude reagovat na jakékoli přerušení hardwaru během čekání. Po obdržení přerušení se MPU „probudí“ v jednom hodinovém cyklu a obnoví provádění podle pokynů bezprostředně následujících po WAI . Proto latence přerušení bude velmi krátká (70 nanosekund při 14 MHz), což vede k větší rychlé reakce možné na vnější události.

Podobně v některých ohledech WAI je instrukce STP ( ST o P , opcode $ DB ), která zcela vypne MPU při čekání na jeden vstup přerušení. Když je vykonán STP , MPU zastaví své vnitřní hodiny (ale zachová všechna data ve svých registrech) a přejde do stavu nízké spotřeby. MPU je vyveden z tohoto stavu vytažením jeho resetovacího vstupního kolíku ( RESB , který je klasifikován jako vstup přerušení) nízko. Provádění se pak obnoví na adrese uložené na místech $ 00FFFC- $ 00FFFD , vektor resetování hardwaru. Stejně jako u WAI je STP určen pro použití v aplikacích s nízkým výkonem, kde může mezi událostmi vyžadujícími pozornost MPU uplynout dlouhá doba a není vyžadováno žádné další zpracování. V normálním programování by se STP nepoužívalo, protože by to mělo za následek úplné zastavení zpracování.

Poznámky pod čarou

  1. ^ a b Vstup ABORT je k dispozici pouze u W65C816S.
  2. ^ B The COP výuky je k dispozici v obou provozních režimech.
  3. ^ 65C816/65C802 nemá žádný vektor přerušení nativního režimu prosignál RESET , protože reset vždy vrátí procesor do režimu emulace.
  4. ^ Hodnotapříznaku B v samotném stavovém registru je vždy 1 , bez ohledu na typ přerušení.  B má smysl pouze v kopii stavového registru, která je vložena do zásobníku v reakci na přerušení, a ve skutečnosti v registru příznaků neexistuje.

Reference

  1. ^ a b c d e J. S. Anderson (1994). Mikroprocesorová technologie . Butterworth-Heinemann. s. 143–144. ISBN 9780750618397.
  2. ^ a b c d e f g h i j k l m n o p q r s t u v w x y z aa David Eyes a Ron Lichty (1992-04-28). „Programování 65816“ (PDF) . The Western Design Center, Inc. Archivováno z originálu (PDF) dne 2012-07-23 . Citováno 2012-11-29 . Citační deník vyžaduje |journal=( nápověda )
  3. ^ a b „Základní architektura“ . 6502 . 2002-01-02.
  4. ^ a b Leo J. Scanlon (1980). 6502 Softwarový design . HW Sams. s.  172–173 . ISBN 9780672216565.
  5. ^ a b c Lance A. Leventhal (1986). 6502 Programovací jazyk sestavení . Osborne/McGraw-Hill. ISBN 9780078812163.
  6. ^ Ronald J. Tocci a Lester P. Laskowski (1979). Mikroprocesory a mikropočítače: Hardware a software . Prentice-Hall. p. 379 . ISBN 9780135813225.
  7. ^ Arthur F. Kuckes a BG Thompson (1987). Apple II v laboratoři . UP archiv. p. 93. ISBN 9780521321983.
  8. ^ Harrod, Dennette A. (říjen 1980). „6502 dostává mikroprogramovatelné pokyny“ . BYTE . Sv. 5 č. 10. McGraw Hill . s. 282–285. Archivovány od originálu na 2006-05-25 . Citováno 2009-05-31 .
  9. ^ Richard R. Smardzewski (1984). Programování a aplikace mikroprocesorů pro vědce a inženýry . Elsevier. p. 125 . ISBN 9780444424075.

Další čtení