2. Potek izvajanje zunanje maskirne prekinitve IRQ1
4. Ostale prekinitve - notranje prekinitve
Prekinitve
predstavljajo mehanizem, ki omogoča, da procesna enota za krajši ali daljši
čas prekine opravilo (program), ki ga trenutno izvaja, in prične izvajati
prekinitveni strežni program (interrupt service routine). Po izvedbi tega
programa se prekinjeni program spet normalno nadaljuje na mestu, kjer je prišlo
do prekinitve.
Do
prekinitev prihaja zaradi:
zahtev
vhodno-izhodnih enot po prekinitvi, ker potrebujejo neko strežno akcijo
(npr.: branje sprejetega znaka, branje stanj vhodnih signalov, itd.)
Do prekinitve pride tako, da vhodno-izhodne enote aktivirajo posebne
vhodne signale v CPE (IRQ, NMI) v kateremkoli trenutku, torej asinhrono glede na program, ki se trenutno izvaja.
programske
zahteve (SWI) po prekinitvi
programa, ki se trenutno izvaja (pogosto se uporablja v razhroščevalnih
(debug) programih za prenos kontrole iz programa, ki se izvaja, v monitorski
program).
Sprejem
prekinitvene zahteve, skok v prekinitveni program in vrnitev v prekinjeni
program potekajo avtomatsko ob
podpori aparaturne opreme.
Glede
na način reagiranja na prekinitveno zahtevo bi lahko prekinitve razdelili v dve
skupini:
maskirne prekinitve:
zunanja prekinitev IRQ1, ki jo zahtevajo zunanje vhodno-izhodne enote
notranje prekinitve, ki jih povzročajo interne vhodno-izhodne enote v mikrokontrolerju MC603
Vse te prekinitve lahko programsko onemogočimo s postavitvijo I bita v CCR registru (npr. z ukazom SEI). V takem primeru CPE nanje ne reagira kljub zunanji zahtevi z aktiviranjem ustreznega signala. Prekinitev ponovno omogočimo z brisanjem I bita (npr. z ukazom CLI).
nemaskirne
prekinitve NMI: so tiste, ki
se brezpogojno izvedejo, če pride zahteva po prekinitvi. Običajno se
izvedejo ob izjemnih dogodkih kot npr. ob detekciji izpada napajalne
napetosti (da lahko CPE še pravočasno shrani določene vsebine in se
pripravi na popoln izpad) itd.
Potek
izvajanja zunanje maskirne prekinitve IRQ1:
zunanja vhodno-izhodna enota postavi linijo IRQ1v aktivno stanje (logična "0"), v katerem mora ostati, dokler CPE ne sprejme zahteve po prekinitvi
CPE enota zazna ta signal kot zahtevo po prekinitvi (preverja ob koncu vsakega ukaznega cikla)
CPE testira tudi prekinitvene zahteve ostalih notranjih enot in sprejme tisto z najvišjo prioriteto, če prekinitev ni onemogočena (I bit v CCR mora biti v stanju 0). Če je onemogočena (I bit je 1), nadaljuje z izvajanjem osnovnega programa.
Na sklad se zaporedoma shranijo tekoče vsebine registrov: PC (High, Low), X (High, Low), A, B, CCR - skupaj torej 7 zlogov.
I bit zavzame vrednost 1.
PC prevzame vrednosti z naslovov $FFF8 in nato $FFF9. Na teh dveh naslovih je shranjen začetni naslov prekinitvenega strežnega programa.
Izvaja se prekinitveni strežni program, dokler CPE ne naleti na ukaz RTI , ki opozori na vrnitev v prvotni program.
CPE s sklada pobere vsebine registrov kot so bile pred prekinitvijo (vse, vključno z vsebino CCR in PC. PC prevzame naslov, kjer je prišlo do prekinitve programa).
I bit ponovno zavzame vrednost 0 in tako omogoči sprejem novih prekinitvenih zahtev.
Prekinjeni
program se spet normalno nadaljuje od mesta prekinitve naprej.
V
času izvajanja prekinitvenega programa mora vhodno-izhodna enota, ki je
zahtevala prekinitev, umakniti signal IRQ1 v neaktivno stanje. Tako bodo po
vrnitvi iz strežnega programa prekinitve spet možne.
Ker
se ob resetu postavi I bit v CCR, so maskirne prekinitve onemogočene. Na
začetku programa, ko izvedemo začetno nastavitev vseh vhodno-izhodnih enot,
zato vnesemo ukaz CLI, s čimer omogočimo izvajanje omenjenih prekinitev.
Je
tudi zunanja prekinitev, vendar je ne
moremo onemogočiti (maskirati).
Medtem
ko je vhod IRQ1 občutljiv nivojsko, vhod NMI deluje na zadnjo strmino
(če to ne bi bilo tako, bi se prekinitve izvajale druga za drugo že v času
izvajanja strežnega programa in bi prihajalo do gnezdenja prekinitev).
Sicer
pa poteka razvoj dogodkov pri NMI po istem zaporedju kot pri IRQ1, le da v tem
primeru leži prekinitveni vektor na naslovih $FFFC in $FFFD.
Ostale
prekinitve - notranje prekinitve
V
spodnji tabeli je prikazan pregled prekinitvenih vektorjev in s tem tudi vseh
prekinitev, ki jih srečamo pri MC6803. Opazimo, da so trije prekinitveni
vektorji namenjeni vgrajenemu časovniku (ICF, OCF in TOF), eden pa serijsko
komunikacijskemu vmesniku SCI.
Po
resetu so vse te enote v neaktivnem stanju in njihove prekinitve onemogočene
(vsaka zase), zato z enoto, ki je ne uporabljamo, nimamo težav.
SWI
v bistvu ni prekinitev v klasičnem smislu, ker je pod programsko kontrolo, se
pa obnaša in izvaja enako kot ostale prekinitve. Je nemaskirna in ima višjo
prioriteto kot vse maskirne prekinitve.
Naslova,
na katerih se nahajaprekinitveni
vektor |
Prekinitvena
zahteva |
|
MSB |
LSB |
|
$FFFE |
$FFFF |
Reset |
$FFFC |
$FFFD |
NMI
(zunanja) |
$FFFA |
$FFFB |
SWI
(programska) |
$FFF8 |
$FFF9 |
IRQ
(zunanja) |
$FFF6 |
$FFF7 |
ICF
(notranja-časovnik) |
$FFF4 |
$FFF5 |
OCF
(notranja-časovnik) |
$FFF2 |
$FFF3 |
TOF
(notranja-časovnik) |
$FFF0 |
$FFF1 |
SCI
(notranja-serijski vmesnik) |
Prioriteta
posameznih prekinitev je razvidna iz zgornje tabele prekinitvenih vektorjev.
Prioritete so fiksne in jih ne moremo spreminjati programsko. Najvišjo
prioriteto ima RESET, ki je v bistvu tudi neke vrste prekinitev, sledi ji NMI,
itd. Če je več zahtev po prekinitvah postavljenih hkrati, se najprej začne
izvajati prekinitveni program na enoti, ki ima najvišjo prioriteto.
Prekinitve
se lahko izvedejo uspešno le, če je definiran skladovni kazalec, oz določen
prostor za sklad! (to
naj se zgodi kar v začetnih ukazih v programu, da ne bi prišlo prej do
prekinitvene zahteve)