Interrupts blokkeren
Het is niet altijd gewenst dat het programma zomaar onderbroken kan worden. Dit mag bijvoorbeeld niet bij tijd-kritische acties. Maar ook als de stackpointer nog niet geladen is, mag een interrupt niet afgehandeld worden. In dat geval zou de processor alle registers wegschrijven naar het adres waar de stackpointer toevallig op staat, en na 'reset' kan dat van alles zijn.
Er zijn twee principiëel verschillende soorten interrupts:
- Interrupts die naar wens geblokkeerd kunnen worden via instructies
- Interrupts die niet geblokkeerd kunnen worden via instructies.
De interrupts van het eerste type (naar wens met behulp van instructies te blokkeren, ofwel 'maskable') worden in de 68HC11 'IRQ' genoemd (van 'Interrupt ReQuest'.)
De interrupts van het tweede type (niet blokkeerbaar via instructies, ofwel 'non-maskable') worden in de 68HC11 'XIRQ' genoemd (van 'eXternal Interrupt ReQuest'.)
Non-maskable interrupts worden meestal alleen gebruikt voor gebeurtenissen in de buitenwereld die onder alle omstandigheden afgehandeld moeten worden door de processor. Bijvoorbeeld voor een signaal dat aangeeft dat de voeding van het systeem op het punt staat uit te gaan (power-down signaal.) De processor kan dan alle uitgangen op een 'veilige' stand zetten en wachten totdat de voeding echt uit gaat. Of voor een ander belangrijk alarm signaal waarbij het absoluut gegarandeerd moet zijn dat de processor hierop snel actie onderneemt.
Nadat de processor uit 'reset' komt, zijn beide typen interrupts standaard geblokkeerd. De IRQ interrupts kunnen dan worden vrijgegeven en opnieuw geblokkeerd, door middel van instructies in het programma. De XIRQ interrupts kunnen slechts éénmaal worden vrijgegeven, en daarna niet meer worden geblokkeerd. Er zijn geen instructies waarmee deze XIRQ interrupts opnieuw geblokkeerd kunnen worden.
Of een interrupt wordt afgehandeld of is geblokkeerd, wordt bepaald door twee vlaggen in het CCR register.
I
De I-vlag geeft aan of IRQ interrupts worden toegestaan (I is een '0'), of worden tegengehouden (I is een'1'.)
X
De X-vlag geeft aan dat de processor geen XIRQ interrupts toelaat die binnenkomen op een speciale pin, die op de SIMPLEX uitgevoerd is op de uitbreidings poort (poort D.) In een programma kan dit bit éénmalig op '0' gezet worden, om dit soort interrupts vanaf dat moment toe te staan.
Dus als I of X een '1' is worden de betreffende interrupts tegengehouden. De I-vlag kan met speciale instructies geset of gereset worden:
CLI
Clear Interrupt flag.
Zet het I-bit uit het status-register op '0'. Hierdoor worden de IRQ interrupts toegelaten.
SEI
Set interrupt flag.
Zet het I-bit uit het status-register op '1'. Hierdoor worden de IRQ interrupts geblokkeerd.
Voor het resetten van de X-vlag is geen speciale instructie. Dit moet gebeuren via de 'TAP' instructie, waarmee de inhoud van accumulator A naar het CCR wordt gekopiëerd:
TAP
Transfer A to Processor status.
Zet de inhoud van accumulator A in het conditie-code register.
Als bit 6 van accumulator A een '0' is, en de TAP instructie wordt uitgevoerd, dan zal het X-bit in het CCR een '0' worden (het X-bit zit in het CCR op bitpositie 6.) Het is niet mogelijk het X-bit in het CCR een '1' te maken als het eenmaal een '0' is.
Wanneer een IRQ interrupt optreedt, worden de registers op de stack gezet. Meteen daarna wordt het I-bit in het conditie-code register een '1' gemaakt. Nieuwe interrupts die door het I-bit geblokkeerd worden kunnen dus niet afgehandeld worden als de micro-controller bezig is een eerdere IRQ interrupt af te handelen, tenzij in de interrupt routine het I-bit op '0' wordt gezet. Aan het eind van de interrupt routine worden de registers weer opgehaald van de stack, waarmee dus ook het I-bit weer in de oude toestand wordt gebracht. Op dat moment kan weer een nieuwe IRQ interrupt afgehandeld worden.
Wanneer een XIRQ interrupt optreedt, worden eveneens de registers op de stack gezet. Meteen daarna wordt het X-bit in het conditie-code register een '1' gemaakt. De XIRQ interrupt kan niet opnieuw gestart worden als de
micro-controller bezig is een eerdere XIRQ interrupt af te handelen, tenzij in de interrupt routine het X-bit op '0' wordt gezet. Aan het eind van de interrupt routine worden de registers weer opgehaald van de stack, waarmee dus ook het X-bit weer in de oude toestand wordt gebracht. Op dat moment kan weer een nieuwe XIRQ interrupt afgehandeld worden.
|