Die Ausführung eines Timer -Interrupt -Programms wird durch einen Hardware -Timer ausgelöst, der einen vordefinierten Wert erreicht. Hier ist eine Aufschlüsselung des Prozesses:
1. Hardware -Timer -Setup:
* Initialisierung: Der Timer wird mit einem bestimmten Wert (Count) initialisiert, der das gewünschte Zeitintervall darstellt. Dies kann das Einstellen von Registern in die Hardware des Timers einstellen. Der Timer benötigt auch seinen Modus konfiguriert (z. B. One-Shot für einen einzelnen Auslöser, periodisch für wiederholte Interrupts).
* Uhr Quelle: Der Timer ist mit einer Uhrquelle (z. B. einer Systemuhr) verbunden. Diese Uhr erhöht den Timerschalter.
2. Timer Interrupt -Generierung:
* Zähler erreicht Null: Wenn die Uhr den Zähler des Timers erhöht, erreicht er schließlich Null (oder eine angegebene Anschlusszahl). Dieses Ereignis löst ein Hardware -Interrupt -Signal aus.
* Interrupt -Anforderung (IRQ): Der Hardware -Timer sendet eine Interrupt -Anforderung (IRQ) an den Prozessor. Diese Anfrage signalisiert, dass ein Ereignis sofortige Aufmerksamkeit erfordert.
3. Interrupt -Handhabung der CPU:
* Interrupt bestätigen: Die CPU erkennt den Interrupt an und setzt ihre aktuelle Ausführung aus. Die Priorität des Timer-Interrupts bestimmt, ob er sofort oder nach Interrupts mit höherer Priorität behandelt wird.
* Kontext sparen: Die CPU speichert den Status des aktuellen Programms (Register, Programmzähler usw.) auf einem Stapel. Dies ist entscheidend, um die Ausführung später wieder aufzunehmen.
* Vektortabelle unterbrechen: Die CPU konsultiert die Interrupt -Vektor -Tabelle, um die Speicheradresse der Interrupt -Dienstroutine (ISR) zu lokalisieren, die dem Timer -Interrupt zugeordnet ist.
* Spring zu ISR: Die CPU springt zum Speicherort des ISR des Timer Interrupt.
4. Interrupt Service Routine (ISR) Ausführung:
* ISR -Code: Dies ist der spezifische Code, der für den Timer -Interrupt ausgelegt ist. Zu seinen Aufgaben könnten:
* Aktualisieren eines Zählers: Verfolgerung der verstrichenen Zeit.
* Ein Ausgang umschalten: Steuerung einer LED oder eines anderen Peripherers.
* Planungsaufgaben: Ausführung anderer Programmfunktionen in bestimmten Intervallen.
* Sensordaten lesen: Probenahme Daten von Sensoren in regelmäßigen Abständen.
* Kommunikation: Senden/Empfangen von Daten über ein Netzwerk oder einen seriellen Port.
* kurz halten: ISRS sollte so kurz wie möglich gehalten werden, um die Zeit zu minimieren, die das Hauptprogramm unterbrochen wird. Langzeitaufläufe sollten nach dem ISR-Programm in das Hauptprogramm ausgeladen werden, nachdem das ISR ein Flag festgelegt oder eine gemeinsam genutzte Datenstruktur aktualisiert wird.
5. Rückkehr von Interrupt:
* Kontext restaurieren: Der ISR stellt den zuvor gespeicherten Staat der CPU wieder her (Register, Programmzähler usw.).
* Rückkehr von Interrupt (Iret oder RTI): Eine spezielle Anweisung (IRET oder RTI, abhängig von der Architektur) wird ausgeführt, um die Kontrolle an das Hauptprogramm zurückzugeben. Die CPU nimmt die Ausführung wieder auf, wo sie vor dem Interrupt aufgehört hat.
Beispiel (konzeptioneller C-ähnlicher Code):
`` `c
// Timer isr
void timer_isr () {
statische unsignierte Int -Zähler =0; // Zähler für die Verfolgung der Zeit
Zähler ++;
if (counter ==1000) {// Überprüfen Sie, ob 1000 Timer -Interrupts aufgetreten sind
Zähler =0;
// Führen Sie eine Aktion durch, z. B. eine LED umschalten
Toggle_led ();
}
}
`` `
Wichtige Überlegungen:
* Latenz unterbrechen: Die Zeit zwischen der Interrupt -Anfrage und dem Beginn des ISR ist die Interrupt -Latenz. Es ist entscheidend, dies für Echtzeitanwendungen niedrig zu halten.
* Priorisierung unterbrechen: Mehrere Interrupts können gleichzeitig auftreten. Die CPU behandelt diese basierend auf ihren zugewiesenen Prioritäten.
* Wiedereinzug: ISRs müssen wieder eingetreten sein; Dies bedeutet, dass sie vor Abschluss ihrer Ausführung erneut unterbrochen werden können, ohne dass eine Datenversorgung verursacht wird.
* Shared Resources: Sorgfältige Synchronisationsmechanismen (z. B. Semaphoren, Mutexes) werden benötigt, wenn der ISR -Zugriff auf gemeinsame Ressourcen zugreift, die auch vom Hauptprogramm verwendet werden.
Dieser Prozess gilt für eine Vielzahl von Mikrocontrollern und eingebetteten Systemen. Die spezifischen Details (Registrierungsnamen, Anweisungen) variieren je nach Hardwarearchitektur.