De uitvoering van een timer-interruptprogramma wordt geactiveerd doordat een hardwaretimer een vooraf gedefinieerde waarde bereikt. Hier is een overzicht van het proces:
1. Hardwaretimer instellen:
* Initialisatie: De timer wordt geïnitialiseerd met een specifieke waarde (telling) die het gewenste tijdsinterval vertegenwoordigt. Dit kan het instellen van registers in de hardware van de timer inhouden. De timer moet ook zijn modus configureren (bijvoorbeeld eenmalig voor een enkele trigger, periodiek voor herhaalde interrupts).
* Klokbron: De timer is verbonden met een klokbron (bijvoorbeeld een systeemklok). Deze klok verhoogt de teller van de timer.
2. Timer Onderbreking Generatie:
* Teller bereikt nul: Terwijl de klok de teller van de timer verhoogt, bereikt deze uiteindelijk nul (of een gespecificeerd aantal terminals). Deze gebeurtenis activeert een hardware-interruptsignaal.
* Onderbrekingsverzoek (IRQ): De hardwaretimer stuurt een interruptverzoek (IRQ) naar de processor. Dit verzoek geeft aan dat een gebeurtenis onmiddellijke aandacht nodig heeft.
3. Afhandeling door de CPU onderbreken:
* Onderbreken bevestigen: De CPU erkent de interrupt en schort de huidige uitvoering ervan op. De prioriteit van de timer-interrupt bepaalt of deze onmiddellijk wordt afgehandeld of na interrupts met een hogere prioriteit.
* Context opslaan: De CPU slaat de huidige programmastatus (registers, programmateller, enz.) op een stapel op. Dit is van cruciaal belang om de uitvoering later te hervatten.
* Interrupt-vectortabel: De CPU raadpleegt de interruptvectortabel om het geheugenadres te lokaliseren van de Interrupt Service Routine (ISR) die is geassocieerd met de timer-interrupt.
* Ga naar ISR: De CPU springt naar de geheugenlocatie van de ISR van de timer-interrupt.
4. Uitvoering van serviceroutine (ISR) onderbreken:
* ISR-code: Dit is het specifieke stukje code dat is ontworpen om de timer-interrupt af te handelen. Zijn taken kunnen onder meer zijn:
* Een teller bijwerken: Het bijhouden van de verstreken tijd.
* Een uitvoer schakelen: Een LED of ander randapparaat bedienen.
* Taken plannen: Het uitvoeren van andere programmafuncties met specifieke tussenpozen.
* Sensorgegevens lezen: Bemonstering van gegevens van sensoren met regelmatige tussenpozen.
* Communicatie: Gegevens verzenden/ontvangen via een netwerk of seriële poort.
* Houd het kort: ISR's moeten zo kort mogelijk worden gehouden om de tijd dat het hoofdprogramma wordt onderbroken tot een minimum te beperken. Langlopende taken moeten naar het hoofdprogramma worden overgebracht nadat de ISR een vlag heeft ingesteld of een gedeelde datastructuur heeft bijgewerkt.
5. Terugkerend van onderbreken:
* Context herstellen: De ISR herstelt de eerder opgeslagen status van de CPU (registers, programmateller, enz.).
* Retour na onderbreking (IRET of RTI): Er wordt een speciale instructie (IRET of RTI, afhankelijk van de architectuur) uitgevoerd om de besturing terug te geven aan het hoofdprogramma. De CPU hervat de uitvoering vanaf het punt waar deze was gebleven vóór de interrupt.
Voorbeeld (conceptuele C-achtige code):
```c
// Timer-ISR
ongeldige timer_isr() {
statische, niet-ondertekende int-teller =0; // Teller voor het bijhouden van de tijd
teller++;
if (counter ==1000) {// Controleer of er 1000 timer-interrupts zijn opgetreden
teller =0;
// Voer een actie uit, bijvoorbeeld een LED schakelen
toggle_led();
}
}
```
Belangrijke overwegingen:
* Interruptie latentie: De tijd die verstrijkt tussen het interruptverzoek en het begin van de ISR is de interruptlatentie. Het is van cruciaal belang om dit laag te houden voor realtime toepassingen.
* Prioriteiten onderbreken: Er kunnen meerdere interrupts tegelijk optreden. De CPU verwerkt deze op basis van de toegewezen prioriteiten.
* Herintreding: ISR's moeten opnieuw binnenkomen; wat betekent dat ze opnieuw kunnen worden onderbroken voordat ze worden uitgevoerd zonder gegevenscorruptie te veroorzaken.
* Gedeelde bronnen: Zorgvuldige synchronisatiemechanismen (bijvoorbeeld semaforen, mutexen) zijn nodig als de ISR toegang krijgt tot gedeelde bronnen die ook door het hoofdprogramma worden gebruikt.
Dit proces is van toepassing op een breed scala aan microcontrollers en embedded systemen. De specifieke details (registernamen, instructies) variëren afhankelijk van de hardwarearchitectuur. |