Ett timeravbrottsprograms exekvering utlöses av en hårdvarutimer som når ett fördefinierat värde. Här är en uppdelning av processen:
1. Hårdvarutimerinställning:
* Initialisering: Timern initialiseras med ett specifikt värde (räkning) som representerar önskat tidsintervall. Detta kan innebära att inställningsregister inom timerens hårdvara. Timern behöver också sitt läge konfigurerat (t.ex. en-shot för en enda trigger, periodisk för upprepade avbrott).
* Klockkälla: Timern är ansluten till en klockkälla (t.ex. en systemklocka). Denna klocka ökar timerens räknare.
2. Timeravbrottsgenerering:
* räknare når noll: När klockan ökar timerens räknare når den så småningom noll (eller ett specifikt terminalantal). Denna händelse utlöser en hårdvaruavbrottssignal.
* avbrottsförfrågan (IRQ): Hårdvarutimern skickar en avbrottsförfrågan (IRQ) till processorn. Denna begäran signalerar att en händelse behöver omedelbar uppmärksamhet.
3. Avbrottshantering av CPU:
* Avbrottsbekräftelse: CPU erkänner avbrottet och avbryter sitt nuvarande utförande. Timernavbrottets prioritering avgör om den hanteras omedelbart eller efter avbrott med högre prioriteringar.
* Sparande sammanhang: CPU sparar det nuvarande programmets tillstånd (register, programräknare etc.) på en stack. Detta är avgörande att återuppta avrättningen senare.
* Interrupt Vector Table: CPU konsulterar avbrottsvektortabellen för att hitta minnesadressen för avbrottstjänstrutinen (ISR) associerad med timeravbrottet.
* Hoppa till ISR: CPU hoppar till minnesplatsen för timern Interrupt's ISR.
4. Interrupt Service Routine (ISR) Exekvering:
* ISR -kod: Detta är den specifika kodstycket som är utformat för att hantera timeravbrottet. Dess uppgifter kan inkludera:
* Uppdatera en räknare: Hålla reda på förfluten tid.
* växling av en utgång: Kontrollerar en LED eller annan perifer.
* schemaläggningsuppgifter: Utföra andra programfunktioner med specifika intervall.
* Läsningssensordata: Provtagningsdata från sensorer med regelbundna intervall.
* Kommunikation: Skicka/ta emot data över ett nätverk eller serieport.
* håller det kort: ISR:er bör hållas så kort som möjligt för att minimera tiden huvudprogrammet avbryts. Långvariga uppgifter bör lossas till huvudprogrammet efter att ISR har ställt in en flagga eller uppdaterar en delad datastruktur.
5. Återvänder från avbrott:
* Återställ sammanhang: ISR återställer CPU:s tillstånd som sparades tidigare (register, programräknare etc.).
* Return från avbrott (IRET eller RTI): En speciell instruktion (IRET eller RTI, beroende på arkitekturen) körs för att returnera kontrollen till huvudprogrammet. CPU:erna återupptar exekveringen där den slutade före avbrottet.
Exempel (konceptuell C-liknande kod):
`` `c
// timer ISR
void timer_isr () {
statisk osignerad int -räknare =0; // räknare för spårningstid
Counter ++;
if (counter ==1000) {// Kontrollera om 1000 timeravbrott har inträffat
Counter =0;
// Utför lite åtgärder, till exempel att växla en LED
TOGGLE_LED ();
}
}
`` `
Viktiga överväganden:
* Avbrottslatens: Den tid det tar mellan avbrottsbegäran och början av ISR är avbrottslatensen. Det är avgörande att hålla detta lågt för realtidsapplikationer.
* Interrupt prioritering: Flera avbrott kan inträffa samtidigt. CPU hanterar dessa baserat på deras tilldelade prioriteringar.
* reentrancy: ISR:er måste vara reentrant; vilket innebär att de kan avbrytas igen innan de slutför sin körning utan att orsaka datakorruption.
* delade resurser: Noggrann synkroniseringsmekanismer (t.ex. semaforer, mutexer) behövs om ISR -åtkomsterna delade resurser också som används av huvudprogrammet.
Denna process gäller ett brett utbud av mikrokontroller och inbäddade system. De specifika detaljerna (registernamn, instruktioner) kommer att variera beroende på hårdvaruarkitekturen.