Ett avbrott är när en mikroprocessor gör något som den inte har fått order om att göra på grund av saker som händer utanför det som programmet ska göra. Avbrott sker oftast för att processorn får en signal från hårdvara, men de kan också komma från programvara som körs tillsammans med programmet. Bland de många saker som kan orsaka avbrott är att man trycker på tangenter på ett tangentbord, att den inbyggda timern går igång, att en dataöverföring äger rum eller någon annan händelse som kräver en åtgärd från processorn på en gång. Avbrott kan ske när som helst när processorn kör ett program, oavsett var i programmets källkod det sker.
Vad är ett avbrott och varför används det?
Ett avbrott (interrupt) är ett sätt för hårdvara eller mjukvara att informera processorn om att något kräver omedelbar uppmärksamhet. Istället för att processorn ständigt kontrollerar alla enheter (polling) så kan enheter meddela processorn när de behöver service, vilket sparar CPU-tid och ger snabbare responstid.
Typer av avbrott
- Hårdvaruavbrott – kommer från externa enheter (t.ex. tangentbord, nätverkskort, timrar, ADC).
- Mjukvaruavbrott – genereras av programvara, till exempel systemanrop eller exceptions (t.ex. division med noll).
- Maskerbara avbrott – kan blockeras eller maskeras av programvara så att vissa avbrott tillfälligt ignoreras.
- Icke-maskerbara avbrott (NMI) – kritiska avbrott som inte kan stängas av, används för allvarliga fel.
- Synkrona avbrott – inträffar som ett direkt resultat av instruktioner (t.ex. en felsituation), ofta kallade exceptions.
- Asynkrona avbrott – inträffar oberoende av den aktuella instruktionen, t.ex. externa signaler.
Hur hanteras ett avbrott?
- Registrera och prioritera: När ett avbrott inträffar kontrollerar processorn vilken typ det är och vilken prioritet det har.
- Spara tillstånd: Processorn sparar vanligtvis programräknare (PC), statusregister och andra nödvändiga register i stacken så att det normala programmet kan återupptas senare.
- Hoppa till avbrottsrutin (ISR): Processorn utför en särskild rutin, ofta kallad Interrupt Service Routine eller avbrottshanterare, som är ansvarig för att hantera händelsen.
- Återställning: När avbrottsrutinen är klar återställer processorn det sparade tillståndet och återupptar huvudprogrammet (ofta via en speciell instruktion som IRET/RETI).
Viktiga mekanismer och begrepp
- Avbrottstabell (interrupt vector table): En tabell som innehåller pekare till avbrottsrutiner för olika avbrottskällor.
- Prioritering och nästling: System kan tillåta att högre prioriterade avbrott avbryter en redan pågående avbrottsrutin (nästling). Detta kräver noggrann hantering av sparat tillstånd.
- Maskering/avaktivering: Programvara kan tillfälligt inaktivera vissa avbrott under kritiska sektioner för att undvika inkonsekventa tillstånd.
- Edge vs level–triggade: Edge-triggade avbrott reagerar på förändring (t.ex. stigande flank), level-triggade reagerar medan en signal hålls på en viss nivå. Val av läge påverkar hur avbrott debounceras och delas.
- Delade avbrottslinjer: På vissa system delar flera enheter samma fysiska avbrottslinje. Avbrottsrutinen måste då avgöra vilken enhet som utlöste avbrottet.
Praktiska exempel
- Tangenter på ett tangentbord genererar avbrott så att systemet kan läsa tangentryckningar utan ständig polling.
- En inbyggd timer (timern) skickar regelbundna avbrott för att skapa klockslagen i operativsystemet eller för tidskritiska uppgifter.
- I/O-enheter (seriell port, nätverk) använder avbrott för att meddela när data är klar att läsas eller skrivas.
- Programvaruavbrott kan användas för systemanrop eller för att signalera undantag inom programmet.
Fördelar och nackdelar
- Fördelar: Snabb respons, effektivare CPU-användning jämfört med polling, bättre realtidsbeteende.
- Nackdelar: Komplexare programlogik, risk för race conditions, kan öka systemets determinismproblem om inte latens garanteras.
Programmera säkert med avbrott
- Håll ISR korta: Utför minimal arbete i avbrottsrutinen — sätt flaggor eller lägg uppgifter i köer och bearbeta dem i huvudprogrammet eller en separat tråd.
- Undvik blockerande operationer: Anropa inte funktioner som kan blockera (t.ex. väntan på I/O eller lås) inuti ISR.
- Synkronisering: Använd atomiska operationer, volatile-variabler eller andra synkroniseringsmekanismer när delad data uppdateras av både ISR och huvudprogram.
- Rensning av avbrottsflagga: Kontrollera och rensa hårdvarans avbrottsflagga korrekt för att förhindra upprepade avbrott.
Sammanfattning
Avbrott är en central mekanism i mikroprocessorer och inbyggda system för att hantera externa och interna händelser effektivt. Genom att spara tillstånd, hoppa till en avbrottsrutin och sedan återgå kan processorn reagera snabbt utan onödig CPU-användning. Rätt design av avbrottshantering — inklusive prioritering, maskering och korta ISR — är viktig för stabilitet och prestanda i både realtids- och allmänna system.
