Interrupt

Uit Wikipedia, de vrije encyclopedie
Ga naar: navigatie, zoeken

In de computertechniek is een interrupt (letterlijk onderbreking) een verzoek om aandacht van een hardwarecomponent aan een andere. De interrupt werd voor het eerst toegepast in de X1-computer van Electrologica, en werd toen nog ingreep genoemd. De afkorting IRQ komt van interrupt request, een aanvraag voor een onderbreking.

Op een fysiek niveau zijn verschillende onderdelen van een elektronisch toestel verbonden met een aantal lijnen. Door zo'n lijn te activeren, geeft een component (bijvoorbeeld ethernetchip) door dat hij aandacht van de ander wil. Deze verandering van de toestand gebeurt typisch door het inverteren van de spanning (+3V naar 0V of omgekeerd). De interrupt-ingang kan gevoelig zijn voor het niveau, of voor verandering van niveau (flank).

In het geval van een processor, reageert deze door een interrupt service routine (ISR) uit te voeren. Deze ISR wordt bij voorkeur zo kort mogelijk gehouden, zodat de processor ook aan het hoofdprogramma toekomt en klaar is om nieuwe interrupts af te handelen.

Veel digitale systemen, zoals personal computers, zijn interruptgebaseerd. Wanneer bijvoorbeeld een toets wordt ingedrukt op een toetsenbord, dan genereert dit een interrupt die er uiteindelijk voor gaat zorgen dat een bepaalde letter op het scherm wordt getoond of een bepaalde opdracht wordt uitgevoerd. Ook op meer voor de gebruiker verborgen manieren ligt dit mechanisme aan de basis: een netwerkinterface genereert bij het binnenkomen van nieuwe data interrupts aan de processor om aan te duiden dat nieuwe data beschikbaar zijn. Op deze manier is de processor in veel gevallen voornamelijk bezig met het wachten op interrupts en het uitvoeren van de opdrachten die bij deze interrupts horen.

IRQ en NMI[bewerken]

Een moderne microprocessor heeft twee interruptingangen, te weten IRQ (interrupt request) en NMI (non-maskable interrupt).

IRQ[bewerken]

IRQ kan door de hardware van de microprocessor gemaskeerd worden, zodat er niet op een interrupt gereageerd wordt. De IRQ-ingang is niveaugevoelig (level sensitive). Zodra de microprocessor op een interrupt reageert, wordt IRQ gemaskeerd, zodat de nog steeds actieve IRQ-ingang niet opnieuw een interrupt veroorzaakt.

NMI[bewerken]

NMI kan niet gemaskeerd worden en wordt alleen gebruikt voor zeer dringende gevallen. NMI is flankgevoelig (edge sensitive), dat wil zeggen dat een interrupt optreedt als NMI actief wordt, en daarna niet meer als NMI actief blijft. Zou NMI niveaugevoelig zijn, dan zou een actieve NMI-ingang voortdurend tot interrupts leiden, zodat de microprocessor niet meer toekomt aan het afhandelen van de interrupts.

Afhandeling van IRQ[bewerken]

Meestal zijn er meerdere apparaten die interrupts kunnen geven. Er wordt daarom een interruptcontroller (IRC - een aparte chip) gebruikt om de interrupts aan de processor door te geven. De IRC heeft bijvoorbeeld acht ingangen, elk met een verschillende prioriteit, en een uitgang die verbonden is met de IRQ-ingang van de processor.

Komt er een interrupt binnen bij de IRC, dan geeft de IRC dat door aan de IRQ-ingang van de processor. De processor maskeert interrupts en de huidige toestand van de processor (registers) wordt opgeslagen. De processor vraagt aan de IRC welke ISR moet worden uitgevoerd. De IRC antwoordt daarop en maakt IRQ inactief. De ISR zal interrupts zo snel mogelijk demaskeren - dat kan ongestraft omdat IRQ weer inactief is. Nadat de ISR voltooid is, wordt dat gemeld aan de IRC en wordt de oorspronkelijke toestand van de processor hersteld, zodat het oorspronkelijke programma vervolgd wordt.

Komt er tijdens het uitvoeren van de ISR een interrupt met een lagere prioriteit binnen, dan houdt de ISR die interrupt tegen. Zodra gemeld is dat de ISR voltooid is, wordt de nieuwe interrupt naar de processor gestuurd.

Komt er tijdens het uitvoeren van de ISR een interrupt met een hogere prioriteit binnen, dan zal de ISR die interrupt aan de processor doorgeven. Als IRQ niet meer gemaskeerd is, zal de processor eerst de nieuwe interrupt afhandelen.

Alternatieven voor interrupts[bewerken]

Polling[bewerken]

Tegenover het gebruik van interrupts staat de pollingtechniek. Bij polling controleert een component regelmatig of een bepaalde gebeurtenis al heeft plaatsgevonden. De snelheid waarmee deze controles plaatsvinden, bepaalt in grote mate de reactietijd. Met deze techniek gaat veel tijd verloren, omdat de uitslag van de test meestal negatief is, bovendien dient er in het programma rekening mee gehouden te worden. Een interrupt garandeert daarentegen (bijna altijd) de kortste reactietijd op een gebeurtenis met een minimale verwerkingsbelasting voor het ontvangende toestel. In gevallen waar sommige componenten echter niet beschikken over interruptlijnen (of die worden gebruikt voor een ander doel), kan polling een oplossing bieden. Ook kan polling een oplossing zijn als de programmamaker alleen op bepaalde momenten een gebeurtenis wil controleren, zodat de maker niet rekening hoeft te houden dat de gebeurtenis al gebeurd is op een bepaald moment in het programma.

DMA[bewerken]

Een nog efficiëntere manier van het afhandelen van in- en uitvoer dan de interrupt is Direct Memory Access, waarbij het in- of uitvoerapparaat zelfstandig zijn gegevens met stukken van het geheugen uit kan wisselen. Als het geheugenblok afgehandeld is, kan er alsnog een interrupt gegeven worden om een nieuwe opdracht aan te vragen.