Wat is 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.
Japanse benaming: 割り込み
“Interrupt” komt voor in 26 oefenvragen uit 6 onderwerpen, bijv. Embedded systemen en firmware, Besturingssysteem en hardware, CPU en architectuur.
Vakgebied: CPU en architectuur
Wat er gebeurt bij een interrupt
Wanneer een device, timer of andere bron een interrupt geeft en die is ingeschakeld, slaat de CPU het adres van de volgende instructie op, samen met toestand zoals de privilegemodus en de interrupt-enable-bit, in daarvoor bestemde registers. Hij verkrijgt een vectornummer voor de oorzaak, leest het startadres van de handler uit de interruptvectortabel die het besturingssysteem heeft ingericht, en springt daarheen. De handler bewaart de registers die hij gebruikt, bedient het device, wist de interruptbron, herstelt de toestand en keert terug met een speciale instructie zoals mret of sret bij RISC-V, die modus en terugkeeradres atomair herstelt.
Interrupts, exceptions en polling
Interrupts zijn asynchroon: een timertick of netwerkpakket komt binnen, ongeacht welke instructie er wordt uitgevoerd. Exceptions zoals page faults, deling door nul of een bewuste systeemaanroep (ecall bij RISC-V) zijn synchroon en worden door een specifieke instructie veroorzaakt. Polling, waarbij de CPU herhaaldelijk de status van een device uitleest, is het alternatief voor interrupts. Interrupts zijn beter als gebeurtenissen zeldzaam zijn of de CPU moet slapen, maar elke interrupt kost het opslaan van toestand en een sprong, dus bij zeer hoge gebeurtenisfrequenties, zoals bij snelle netwerken, kan gebundelde polling efficiënter zijn.
Prioriteiten, maskering en latentie
Een interruptcontroller arbitreert tussen gelijktijdige verzoeken, vaak met een prioriteitsencoder, en bij nesting kan een interrupt met hogere prioriteit een handler met lagere prioriteit onderbreken, zoals bij de NVIC van Arm Cortex-M. Software kan interrupts maskeren, maar een non-maskable interrupt (NMI) is gereserveerd voor ernstige gebeurtenissen zoals niet-corrigeerbare geheugenfouten of watchdog-time-outs. De worst-case interruptlatentie wordt grotendeels bepaald door de langste sectie die met uitgeschakelde interrupts draait, dus besturingssystemen splitsen de afhandeling op in een kort, urgent deel en uitgesteld werk dat later met ingeschakelde interrupts wordt gedaan. PCI Express-devices geven interrupts via geheugenschrijfacties (MSI) in plaats van via aparte draden.
Valkuilen in embedded code
Handlers moeten kort zijn: geen printf of wachtlussen, alleen data naar een buffer verplaatsen of een vlag zetten voor de hoofdlus. Variabelen die met een handler worden gedeeld, moeten als volatile worden gedeclareerd, anders leest de compiler ze mogelijk maar één keer. Read-modify-write-bewerkingen zoals reg |= mask kunnen een bit verliezen die tussendoor door een handler is gewijzigd, en een 8-bitmicrocontroller die een 32-bitteller leest, kan half bijgewerkte bytes zien; interrupts kort uitschakelen lost beide op. Een periodieke timerinterrupt, bijvoorbeeld 16 MHz gedeeld door 16 en tellend tot 1000 voor 1 ms, levert de systeemtick.
Veelgestelde vragen
Wat is het verschil tussen een interrupt en een exception?
Een interrupt is asynchroon en komt van buiten de instructiestroom, zoals van een timer of I/O-device. Een exception is synchroon en wordt veroorzaakt door het uitvoeren van een bepaalde instructie, zoals bij een page fault, een ongeldige instructie of een systeemaanroep.
Wat is een interruptvectortabel?
Dat is een tabel, ingericht door het besturingssysteem of de firmware, die elk interrupt- of exceptionnummer koppelt aan het startadres van de bijbehorende handler. De CPU gebruikt die om voor elke oorzaak naar de juiste routine te springen.
Waarom moet een interrupthandler kort worden gehouden?
Terwijl een handler draait, worden interrupts met dezelfde of lagere prioriteit meestal tegengehouden en staat het hoofdprogramma stil, dus een lange handler verhoogt de latentie voor al het andere. Zwaar werk wordt uitgesteld naar een taak of hoofdlus die met ingeschakelde interrupts draait.