Dĺžka impulzu prerušenia i8080
Z PMD 85 Infoserver
Dĺžka impulzu prerušenia i8080
Mikroprocesor i8080 poskytuje maskovateľné prerušenie, čo mu umožňuje spracovávať asynchrónne udalosti, ktoré prichádzajú "zvonku". K tomu slúži vstupný pin INT
mikroprocesora, ktorý je citlivý na úroveň H.
Mikroprocesor testuje INT
v dvoch prípadoch:
- po ukončení aktuálne vykonávanej inštrukcie
- ak je μP v stave
HALT
, teda po vykonaní inštrukcieHLT
V oboch prípadoch je prerušenie akceptované iba v prípade, že je prerušenie povolené inštrukciou EI
.
Signál INT
nie je testovaný v dvoch prípadoch:
- ak je μP v stave
NOT READY
- vstupný pinREADY
je na úrovni L - využívalo sa obvykle pri pomalých pamätiach, ktoré potrebovali väčší čas na vystavenie/spracovanie dát na zbernici - ak je μP v stave
HOLD
- rovnomenný vstupný pinHOLD
je na úrovni H - využíva sa pre DMA
Ak μP zaregistruje požiadavku na prerušenie a zároveň je prerušenie povolené, μP potvrdzuje túto požiadavku vyslaním stavového slova INTERRUPT ACKNOWLEDGE
. V prípade, že je ako budič zbernice použitý obvod i8228 (tiež prípad PMD 85), tak je požiadavka na prerušenie potvrdzovaná signálom -INTA
. Obvod, ktorý prerušenie vyvolal, musí počas aktivity signálu -INTA
dodať na zbernicu kód inštrukcie, ktorá prerušenie "spracuje" (obvykle je to jedna z Restart inštrukcií RST x
). i8228 umožňuje pripojením signálu -INTA
na pull-up +12V zabezpečiť automatické dodanie inštrukcie RST 7.
Aby bolo prerušenie akceptované, musí byť, okrem vyššie uvedeného, splnená ešte jedna dôležitá podmienka. Prerušovací impulz na pine INT
musí trvať dostatočnú dobu a zároveň by tento impulz nemal byť príliš dlhý.
Ak nie je μP v stavoch HALT
, HOLD
a NOT READY
, tak je pin INT
testovaný počas posledného taktu inštrukčného cyklu. Teoreticky by teda stačilo, aby mal prerušovací impulz dĺžku jedného taktu procesora (≈ 0,5μs). To by ale znamenalo, že by tento impulz musel prísť vždy presne na konci inštrukcie, čo je aj vzhľadom na rôzne trvanie jednotlivých inštrukcií prakticky nemožné. Prerušenie je asynchrónna udalosť a tak môže prísť kedykoľvek, aj uprostred vykonávania inštrukcie. Takýto krátky impulz by bol v tomto prípade vlastne "ignorovaný", čo je nežiadúce.
Prerušovací impulz by mal byť teda aspoň taký dlhý, aby bol akceptovaný, ak by prišiel počas vykonávania ktorejkoľvek inštrukcie. Z toho plynie, že by mal mať dĺžku aspoň ako najdlhšie trvajúca inštrukcia. Tou je inštrukcia XTHL
, ktorá trvá 18T a to je ≈ 9μs.
Dĺžka prerušovacieho impulzu by zároveň nemala byť príliš dlhá, pretože by mohlo dôjsť k opätovnému vyvolaniu prerušenia pokiaľ by impulz neskončil pred opätovným povolením prerušenia.
Majme kód, ktorý využíva prerušenie iba na presné časovanie. Prerušenie je vyvolávané pravidelne napr. každých 20ms.
; Hlavná slučka programu. EI ; povol prerušenie Loop: HLT ; čakaj na prerušenie ... ; pravidelne vykonávaný kód ... JMP Loop ; návrat do slučky ; Rutina obsluhy prerušenia. Vyvolanie prerušovacej rutiny je pomocou ; inštrukcie RST 7 (viď. vyššie), ktorá trvá 11T. Intr: EI ; 4T RET ; 10T
Rutina obsluhy prerušenia v tomto prípade nerobí nič, iba opätovne povolí prerušenie (ktoré bolo zakázané automaticky pri akceptovaní prerušenia) a prevedie návrat z tejto rutiny. Pomocou inštrukcie HLT sa čaká na prerušenie. Po akceptovaní prerušenia, trvá obsluha prerušenia minimálne 1+11+4+10=26T a to je ≈ 12,7μs. Ak by mal prerušovací impulz dĺžku väčšiu, ihneď po inštrukcii RET
, by bolo prerušenie opäť vyvolané.
Prerušovací impulz by mal teda mať dĺžku asi 9μs až 12,5μs. Ak je využívaný mechanizmus pozastavovania procesora pomocou signálov READY
alebo HOLD
, tak by mala byť dĺžka prerušovacieho impulzu predĺžená pomerne k dobe pozastavovania.