Rob's web

Interrupts

Inleiding

In de computertechniek is een interrupt (letterlijk onderbreking) een verzoek om aandacht van een hardwarecomponent aan een andere component, meestal een processor. 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

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

IRQ

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

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.

Arduino

Poorten

Interrupt poorten
 INT 0INT 1INT 2INT 3INT 4INT 5
Uno23     
Nano23     
Mini23     
Mega2120191823pins 20 & 21 are not available to use for interrupts while they are used for I2C communication

attachInterrupt()

[External Interrupts]

Description

Digital Pins With Interrupts

The first parameter to attachInterrupt() is an interrupt number. Normally you should use digitalPinToInterrupt(pin) to translate the actual digital pin to the specific interrupt number. For example, if you connect to pin 3, use digitalPinToInterrupt(3) as the first parameter to attachInterrupt().

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode) (recommended)
attachInterrupt(interrupt, ISR, mode) (not recommended)

Parameters

interrupt: the number of the interrupt. Allowed data types: int.

pin: the Arduino pin number.

ISR: the ISR to call when the interrupt occurs; this function must take no parameters and return nothing. This function is sometimes referred to as an interrupt service routine.

mode: defines when the interrupt should be triggered. Four constants are predefined as valid values:

interrupts()

Beschrijving

Schakelt interrupts weer in (nadat ze zijn uitgeschakeld door noInterrupts(). Interrupts staan toe dat bepaalde belangrijke taken op de achtergrond worden uitgevoerd en zijn standaard ingeschakeld. Sommige functies werken niet als interrupts zijn uitgeschakeld en inkomende communicatie kan worden genegeerd. Interrupts kan de timing van de code echter enigszins verstoren en kan worden uitgeschakeld voor bijzonder kritieke delen van de code.

Syntax

interrupts();

noInterrupts()

Beschrijving

Schakelt interrupts uit (u kunt ze opnieuw inschakelen met interrupts()). Onderbrekingen zorgen ervoor dat bepaalde belangrijke taken op de achtergrond kunnen worden uitgevoerd en zijn standaard ingeschakeld. Sommige functies werken niet als onderbrekingen zijn uitgeschakeld en inkomende communicatie wordt mogelijk genegeerd. Onderbrekingen kunnen de timing van de code echter enigszins verstoren en kunnen worden uitgeschakeld voor bijzonder kritieke delen van de code.

Syntax

noInterrupts();