Forum: Mikrocontroller und Digitale Elektronik Verständnisfrage Interrupts


von Lys A. (jazz_89)


Lesenswert?

Hallo allerseits,
ich habe eine generelle Frage zum Thema Interrupt Handling. An einem 
Standard-PC wird ja bekanntlich nicht zu jedem Zeitpunkt der Status 
jeder einzelner Tastatur-Taste abgefragt, da dies ernorm viel Ressourcen 
erfordern würde.
Soweit ich weiss generiert eine Taste einen Interrupt falls sich ihr 
Status ändert (gedrückt ja/nein). Doch wie werden diese Ereignisse vom 
Rechner verarbeitet? Es muss doch trotzdem zyklisch überprüft werden, ob 
welche Interrupts vorliegen und welches davon Priorität hat, oder? Gibt 
es eine Bezeichnung für diese Frequenz, bzw. für diesen Code-Abschnitt 
in einem Programm?

Vielen Dank & einen angenehmen Samstagabend:)

von c-logic (Gast)


Lesenswert?

Die Tastatur wird nicht vom PC gescannt.
Dafür ist ein eigener Controller in der Tastatur.
Daten kommen bei PS/2 über eine Serielle Schnittstelle und lösen einen 
Interrupt aus.
Die Daten sind Make oder Break-Code
mit folgendem Tastencode ob die Taste gedrückt oder losgelassen wird.

Bei USB läuft das ähnlich nur wird hier periodisch vom Hostcontroller 
gefragt ob was passiert ist.

von Thorsten (Gast)


Lesenswert?

bei USB gibt jedes Gerät an, mit welcher Frequenz/Intervall ein Gerät 
nach neuen Daten gefragt werden soll.

Der Vorgang nennt sich polling.

Es gibt bei USB aber auch echte CPU Interrupts - z.B. dann wenn der HOST 
Controller fertig mit der Datenübertagung ist. Das pollen kann ein USB 
HOST Controller auch automatisch machen und nur dann einen Interrupt 
auslösen, wenn wirklich Daten im Puffer sind oder wenn der Puffer voll 
ist - das kommt auf den HOST Controller an.

von Heinz V. (heinz_v)


Lesenswert?

Lys A. schrieb:
> Hallo allerseits,
> ich habe eine generelle Frage zum Thema Interrupt Handling. An einem
> Standard-PC wird ja bekanntlich nicht zu jedem Zeitpunkt der Status
> jeder einzelner Tastatur-Taste abgefragt, da dies ernorm viel Ressourcen
> erfordern würde.
Richtig, aber mit der Tastatur beschäftigt sich der Tastaturcontroller, 
der hat Zeit dafür, nicht der Hauptprozessor.

> Soweit ich weiss generiert eine Taste einen Interrupt falls sich ihr
> Status ändert (gedrückt ja/nein). Doch wie werden diese Ereignisse vom
> Rechner verarbeitet? Es muss doch trotzdem zyklisch überprüft werden, ob
> welche Interrupts vorliegen und welches davon Priorität hat, oder? Gibt
> es eine Bezeichnung für diese Frequenz, bzw. für diesen Code-Abschnitt
> in einem Programm?
>
> Vielen Dank & einen angenehmen Samstagabend:)
Der Tastaturcontroller registriert den Tastendruck, speichert den in der 
Tastaturwarteschlange und löst einen Hardwareinterrupt aus, ob dieser 
unmittelbar verarbeitet wird hängt vom Anwendungsprogramm ab.

Schau die Kombination Strg.+Alt.+Entf. löst einen Interrupt aus der auf 
0xfffe in der Interrupttabelle zeigt, zu Zeiten von MS-Dos lag da 
einfach der Warmstartvektor, daher wurde unmittelbar ein Reboot 
ausgelöst. Windows lädt diese Stelle der Tabelle mit einem Vektor der 
den Taskmanager startet.

von (prx) A. K. (prx)


Lesenswert?

Lys A. schrieb:
> Es muss doch trotzdem zyklisch überprüft werden, ob
> welche Interrupts vorliegen und welches davon Priorität hat, oder?

Yep. Aber das passiert in Hardware. Bei einfachen Prozessoren wie AVR 
jeweils zwischen den Befehlen. Bei PCs ist es etwas komplizierter, aber 
ebenfalls spezialisierte Hardware im Prozessor.

Es gibt also keinen Programmabschnitt, der irgendwas abfragt. Wenn ein 
Signal "Interrupt" vorliegt, dann reagiert besagte Hardware und leitet 
den Befehlsstrom gezielt um.

von c-hater (Gast)


Lesenswert?

Lys A. schrieb:

> Doch wie werden diese Ereignisse vom
> Rechner verarbeitet? Es muss doch trotzdem zyklisch überprüft werden, ob
> welche Interrupts vorliegen

Nein, genau das ist dein Denkfehler. Interrupts werden eben NICHT 
"zyklisch geprüft". Interrupts sind nicht notwendigerweise zyklisch und 
sie werden insbesondere auch nicht "geprüft".

Sie passieren einfach, und zwar zu jedem beliebigen Zeitpunkt, eben 
genau dann, wenn das Ereignis passiert, welches durch sie gemeldet 
werden soll.

von Heinz V. (heinz_v)


Lesenswert?


von Lys An (Gast)


Lesenswert?

Danke für die zahlreichen Beiträge. Jetzt bin ich noch mehr verwirrt :)
Es war mir einfach nicht klar, wie ein und derselber Prozessor ein 
Programm ausführen kann und währenddessen von Interrupts unterbrechen 
werden kann.

Ich lese mich gerade durch die Labview-Dokumentation durch; es gibt dort 
tatsächlich Event-Interrupt Strukturen, die von bestimmten externen 
Signalen ausgelöst werden, z.B. wenn ein Analogeingang einen 
vordefinierten Spannungsbereich verlässt.

von Axel S. (a-za-z0-9)


Lesenswert?

Lys An schrieb:
> Ich lese mich gerade durch die Labview-Dokumentation durch; es gibt dort
> tatsächlich Event-Interrupt Strukturen, die von bestimmten externen
> Signalen ausgelöst werden, z.B. wenn ein Analogeingang einen
> vordefinierten Spannungsbereich verlässt.

Äpfel und Birnen. Labview ist kein Prozessor. Und das was Labview als 
"Interrupt" bezeichnet, hat nahezu nichts mit "richtigen" Interrupts auf 
der Hardware-Ebene zu tun.

Auf der Software-Ebene nennt man das üblicherweise "ereignisgesteuerte 
Programmierung". Siehe auch Wikipedia:

https://de.wikipedia.org/wiki/Ereignis_%28Programmierung%29

von Georg (Gast)


Lesenswert?

Lys An schrieb:
> es gibt dort
> tatsächlich Event-Interrupt Strukturen

Ja, die funktionieren aber tatsächlich so wie du dir das vorgestellt 
hast, indem z.B. eine Spannung überwacht, also ständig abgefragt wird. 
"Echte" Interrupts werden dagegen durch Hardware ausgelöst, z.B. wenn 
ein UART ein Zeichen empfangen hat, damit hat die CPU garnichts zu tun, 
erst wenn sie den Interrupt akzeptiert und die Interruptroutine 
ausführt.

Georg

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Lys An schrieb:
> Es war mir einfach nicht klar, wie ein und derselber Prozessor ein
> Programm ausführen kann und währenddessen von Interrupts unterbrechen
> werden kann.

Dafür gibt es den Stack ... Wenn ein Interrupt passiert, werden die 
Prozessor-Register, die der Interrupt verändert zusammen mit einer 
Rücksprungadresse (=wo die CPU vorher war, als der Interrupt passierte) 
auf dem Stack gespeichert. Der Interrupt wird ausgeführ und anschließend 
wird alles so restauriert, wie es vor dem Interrupt war und zur 
Programmstelle gesprungen, als der Interrupt passierte.

Bei x86ern mittlerweile wesentlich komplexer als das, aber das Prinzip 
an sich hat sich nicht verändert ...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.