Interrupt versus polling: werking en keuzecriteria vergeleken

Er zijn twee manieren waarop een processor te weten komt dat een device aandacht nodig heeft. Bij polling controleert de CPU in een lus steeds opnieuw de status van het device. Bij een interrupt stuurt het device een signaal naar de CPU, die haar werk onderbreekt, een kleine handler uitvoert en daarna terugkeert. Polling is eenvoudig en voorspelbaar, maar verspilt tijd. Interrupts zijn efficiënt en reageren snel, maar geven overhead en maken het gedrag van het programma moeilijker te doorgronden.

KenmerkPollingInterrupt
WerkingDe CPU leest herhaaldelijk een statusregister om te controleren of het device gereed isHet device geeft een signaal en de CPU onderbreekt haar werk om een interrupt handler (ISR) uit te voeren
CPU tijdens het wachtenBezig. Gebruikt cycli voor de controleVrij. Kan ander werk doen of slapen
ReactietijdBepaald door het interval tussen de controles in de lus. VoorspelbaarSnel (microseconden). Maar afhankelijk van maskering, prioriteit en het opslaan van de context
OverheadConstant, ook als er niets gebeurtKosten per gebeurtenis. Bij zeer veel gebeurtenissen kan de CPU het niet bijhouden (interrupt storm)
ComplexiteitEenvoudig te schrijven en te debuggenComplex. Handlers moeten kort zijn en gedeelde data met de hoofdcode vraagt zorg (volatile, atomaire toegang)
VermogensverbruikHoudt de CPU wakkerDe CPU kan op laag vermogen slapen tot een gebeurtenis haar wekt
Voorspelbaarheid van de timingGemakkelijk te overzienConcurrency-bugs tussen de handler en de hoofdcode zijn mogelijk
Belangrijkste toepassingenZeer snelle of continue gebeurtenissen, eenvoudige programma's, drivers voor snelle netwerkenTimers, knoppen, communicatiegebeurtenissen, sensoralarmen, wakker worden uit slaapstand

De getalswaarden zijn typische ordegroottes en variëren per procesgeneratie en product.

Wanneer welke variant?

Polling
Wanneer gebeurtenissen frequent zijn, of wanneer de lus eenvoudig is en voorspelbare timing gewenst is zonder de complexiteit van handlers.
Interrupt
Wanneer gebeurtenissen zeldzaam of onvoorspelbaar zijn, snelle reactie en laag vermogen gewenst zijn en de CPU ander werk heeft.
Samen gebruikt
Sommige systemen combineren beide. De eerste gebeurtenis wordt met een interrupt gemeld en zolang er veel verkeer is, doet de driver polling, zoals bij drivers voor snelle netwerken.

Veelgestelde vragen

Wat is beter, interrupts of polling?

Geen van beide is altijd beter. Interrupts reageren snel en laten de CPU slapen, polling is eenvoudig en voorspelbaar. Gebruik interrupts voor zeldzame gebeurtenissen en polling voor zeer frequente gebeurtenissen.

Wat moet een interrupt handler doen?

Kort zijn. Doe het minimale, zet een vlag of zet het werk in een wachtrij en keer terug. Lang werk of aanroepen die kunnen blokkeren in de handler schaden de reactiesnelheid.

Wat is een interrupt storm?

Een toestand waarin gebeurtenissen zo snel binnenkomen dat de CPU al haar tijd kwijt is aan het in- en uitgaan van handlers. Drivers voor snelle netwerken schakelen dan over op polling.

Waarom besparen interrupts vermogen?

Omdat de CPU kan slapen tot een gebeurtenis haar wekt, in plaats van voortdurend wakker te zijn om te controleren.

Test uw begrip

Wat is het juiste verschil tussen polling en interrupts als methoden om de toestand van een randschakeling te kennen?

  1. ABij polling gaat de CPU de toestand herhaaldelijk controleren en bij interrupts meldt de randschakeling aan de CPU wanneer de toestand verandert
  2. BPolling en interrupts zijn hetzelfde
  3. CEen interrupt is een methode waarbij de CPU de toestand herhaaldelijk controleert
Antwoord en toelichting tonen

Antwoord: A. Bij polling gaat de CPU de toestand herhaaldelijk controleren en bij interrupts meldt de randschakeling aan de CPU wanneer de toestand verandert

Polling is eenvoudig en voorspelbaar in gedrag omdat het controle-interval vaststaat, maar de CPU blijft controleren, ook als er niets gebeurt, wat tijd en vermogen verspilt. Bij interrupts reageert de CPU alleen als er een verandering is, zodat tijdens het wachten ander werk kan worden gedaan of de CPU kan slapen. Bij zeer veel interrupts neemt de verwerkingslast juist toe, dus het is belangrijk ze op de juiste plaats te gebruiken.

Wat moet in een interrupthandler het meest worden vermeden?

  1. AEen vlagvariabele op 1 zetten om het hoofdprogramma te informeren
  2. BHet bit wissen dat de oorzaak van de interrupt aangeeft
  3. CTijdrovende bewerkingen, zoals een lange tekenreeks uitvoeren met printf of een lus die blijft wachten tot er iets gebeurt
Antwoord en toelichting tonen

Antwoord: C. Tijdrovende bewerkingen, zoals een lange tekenreeks uitvoeren met printf of een lus die blijft wachten tot er iets gebeurt

Als een interrupthandler lang actief is, kan hij gedurende die tijd niet op andere interrupts reageren en staat ook het hoofdprogramma stil. Printf kost tijd tot de uitvoer klaar is en gebruikt intern soms interrupts, dus is bijzonder gevaarlijk. In de handler voert men alleen minimale bewerkingen uit, zoals gegevens ontvangen en in een buffer plaatsen of een vlag zetten, en zware verwerking laat men aan het hoofdprogramma of een taak over. Vergeet ook niet het bit te wissen dat de oorzaak aangeeft.

Bij een microcontroller waarbij interrupts een prioriteit kunnen krijgen, treedt een interrupt met hoge prioriteit op tijdens de uitvoering van de handler van een interrupt met lage prioriteit. Wat gebeurt er gewoonlijk (uitgaande van een instelling die nesten van interrupts toestaat)?

  1. ADe lage handler wordt onderbroken en de hoge handler wordt uitgevoerd, waarna wordt teruggekeerd naar de rest van de lage handler
  2. BDe hoge interrupt wordt genegeerd tot de lage handler klaar is
  3. CBeide handlers worden tegelijk parallel uitgevoerd op dezelfde CPU
Antwoord en toelichting tonen

Antwoord: A. De lage handler wordt onderbroken en de hoge handler wordt uitgevoerd, waarna wordt teruggekeerd naar de rest van de lage handler

Wanneer interrupts prioriteiten hebben, wordt een dringende interrupt afgehandeld door tussenbeide te komen, ook terwijl een andere handler draait. Geeft men bijvoorbeeld de detectie van motoroverstroom een hoge prioriteit en het ontvangen van communicatie een lage, dan kan direct op overstroom worden gereageerd, ook tijdens de verwerking van ontvangen gegevens. De NVIC van Arm Cortex-M en dergelijke hebben dit mechanisme. Interrupts met dezelfde of een lagere prioriteit moeten wachten tot de huidige handler klaar is.

  1. Wat is de juiste reden dat de verwerking van een interrupthandler wordt gesplitst in een kort deel dat direct wordt uitgevoerd en een rest die later in een gewone context wordt uitgevoerd?
  2. Terwijl het hoofdprogramma een registerbit bewerkt met "reg |= mask;" (lezen, wijzigen, schrijven), wijzigt een interrupthandler een ander bit van hetzelfde register. Welke combinatie van mogelijk probleem en tegenmaatregel is juist?
  3. Een klok van 16 MHz wordt door een prescaler door 16 gedeeld en daarmee telt een timer; de timer is zo ingesteld dat bij elke 1000 tellen een interrupt optreedt. Wat is het interval tussen de interrupts?

Oefenvragen over Embedded systemen en firmware

Belangrijke termen uitgelegd

Interrupt
CPU-mechanisme waarbij de lopende verwerking tijdelijk wordt onderbroken om op verzoek van bijvoorbeeld externe apparatuur voorrang te geven aan de bijbehorende afhandeling. Daarna keert de CPU terug naar de oorspronkelijke verwerking.
Polling
Methode waarbij de CPU herhaaldelijk de toestand van randschakelingen opvraagt om veranderingen te vinden. Eenvoudig, maar het blijft controleren ook als er niets gebeurt, wat tijd en energie kost.
Interrupt handler
Verwerking die de CPU uitvoert wanneer een interrupt of exception optreedt. Slaat de toestand van de onderbroken verwerking op, handelt af wat bij de oorzaak hoort en keert terug naar de oorspronkelijke verwerking. Het uitgangspunt is de verwerking zo kort mogelijk te houden.

Verwante vergelijkingen