Hi,
eine ganz grundsätzliche Frage möchte ich gerne stellen. Ich frage mich,
was eigentlich der Sinn von sog. Interrupts ist. Im Wikipedia-Artikel
steht dazu, dass der Sinn eines Interrupts darin bestehen würde, dass
dadurch die CPU auf äußere Ergeignisse schneller reagieren kann.
Warum ist das so? Aus dem Wikipedia-Artikel werde ich da nicht richtig
schlau.
http://de.wikipedia.org/wiki/Interrupt
Gruß
Basti
Folgende Analogie:
Stell dir eine Arzt vor. Der arbeitet in seinem Zimmer und regelmäßig,
so alle halbe Stunde, öffnet er mal die Tür um Nachzusehen ob nicht
eventuell ein Patient auf Behandlung wartet. In Computer-Speak
würde man sagen: "Er pollt das Wartezimmer". Solange du mit einem
Schnupfen im Wartezimmer sitzt, ist die Wartezeit auch kein
Problem.
Aber, jetzt fehlt dir etwas Gröberes, dein Anliegen ist wichtig
genug, daß du an die Tür klopfst und zum Arzt reingehts. Du
machst einen Interrupt und unterbrichst den Arzt bei seiner
momentanen Tätigkeit, weil du sonst die nächste halbe Stunde
nicht überleben würdest.
Polling: Der Computer sieht regelmässig nach, ob es etwas zu
tun gibt und bearbeitet das dann. Folge: Durch das Zeitraster
gibt es möglicherweise eine Wartezeit. Das Zeitraster kann sich
auch mal verlängern, wenn der Computer gerade beschäftigt ist.
Interrupt: Ein Ereignis unterbricht den Computer bei seiner
momentanen Tätigkeit. Die Unterbrechung wird sofort bearbeitet.
Man kann beim Polling das Zeitraster minimieren, so daß die Reaktion
unter Umständen schneller ist als bei einem Interrupt. Allerdings kann
der Prozessor während der Wartezeit dann nichts anderes machen. Das
warten lastet ihn schon voll aus. Bei der obigen Analogie wäre das so,
als ob der Arzt sich ins Wartezimmer setzt und da wartet, bis ein
Patient kommt. Wenn er zwei Wartezimmer hat, kann es dann sein, daß er
ewig wartet, obwohl im anderen Wartezimmer schon die ersten Verluste zu
vermelden sind.
Neben der Reaktion auf äußere Ereignisse dient der Interrupt häufig auch
der Erfüllung präziser Timing-Aufgaben (Timer-Interrupt). Hier kommt es
weniger auch die schnelle Reaktion als vielmehr auf auf eine genau
definierte Reaktionszeit an. Das ist dann wichtig, wenn die CPU neben
ihren Rechenarbeit noch streng regelmäßige Sequenzen wie z.B.
Softwareuhr, Displayausgabe und/oder Tonerzeugung ausführen muß.
Jörg
Vielleicht ist auch noch wichtig zu erwähnen, wenn wir mal bei dem
Analogon mit der Arztpraxis bleiben, daß der Arzt bei der Unterbrechung
seiner Tätigkeit sein momentanes Arbeitsumfeld gegen ein neues
austauscht, er also seine Geräte beiseite legt, und einen neuen Satz
Geräte (Spritzen, Skalpell) benutzt und nach der Unterbrechung - die im
allgemeinen kurz sein sollte (insofern hinkt der Vergleich etwas) -
wieder an dem Punkt fortfährt, an dem er unterbrochen wurde.
Das bedeutet, bei einer CPU mit Stack-Architektur, daß die CPU ihre
Register in der Interrupt-Routine auf den Stack sichert und nach
Verlassen wieder
vom Stack restauriert.
Die in einer Interruptroutine erforderliche Aktion sollte kurz sein im
Vergleich zur Haupttätigkeit.
Typisches Beispiel (stammt aus der Zeit der seriellen UARTs):
Ein Ausgabeprozeß sendet Zeichen aus einem Ram-Puffer an den UART.
Während das Zeichen am UART seriell ausgegeben wird, braucht die CPU
nicht zu warten, sondern kann etwas anderes machen in den vielen
Millisekunden. Ist der UART-Puffer leer, sendet er einen Interrupt an
die CPU und diese kann das nächste Zeichen in den UART-Sendepuffer
laden. usw.
Karl heinz Buchegger wrote:
> Polling: Der Computer sieht regelmässig nach, ob es etwas zu> tun gibt und bearbeitet das dann. Folge: Durch das Zeitraster> gibt es möglicherweise eine Wartezeit. Das Zeitraster kann sich> auch mal verlängern, wenn der Computer gerade beschäftigt ist.
Das Zeitraster kann sogar ein echtes Problem werden, wenn ein Ereignis
kürzer als das Zeitraster ist: dann besteht die Gefahr, daß es nicht
wahrgenommen wird. In der Analogie: Während der Arzt mit einem Patienten
beschäftigt ist, kann er das Wartezimmer nicht pollen. Jetzt aber kommt
der Pharmareferent rein und will Schmier^H^H^H^H^H^H
Produktinformationen vorbeibringen, weil aber nur wenig Zeit hat geht er
bald wieder, ohne den Arzt "informieren" zu können.
Und wenn der Arzt mal kurz ungestört mit seiner Sprechstundenhilfe ...
äh, sagen wir mal, den weiteren Arbeitsablauf besprechen möchte, dann
kann er das Behandlungszimmer abschließen, so dass du auch als
Schwerkranker keinen Zutritt hast. Sobald er fertig ist, lässt er dich
aber sofort herein, da er dein Klopfen trotz abgeschlossener Tür
gehört und noch in Erinnerung hat.
Das nennt sich dann Interruptsperre (Abschließen der Tür) und
Zwischenspeichern oder Latchen des Interrupts (sich merken, wenn
jemand bei abgeschlossener Tür anklopft).
Interrupts sollten, wenn überhaupt, immer nur für sehr kurze Zeit
gesperrt werden, sonst geht der Vorteil der kurzen Reaktionszeit
verloren, und dem Arzt sterben die Notfallpatienten weg.
Das Zwischenspeichern von kurzen Signalen wird oft auch im
Pollingbetrieb praktiziert. Da die meisten µC dafür aber keine
Hardwareunterstützung bieten, muss der Zwischenspeicher extern,
bspw.in Form eines RS-Flipflops, angebaut werden.
Das RS-Flipflop entspricht dann den Helferinnen an der "Rezeption" ..
die speichern Anfragen zwischen und sagen dem pollenden Arzt was er zu
tun hat.. :D
Vielen Dank für die teils sehr originellen Erklärungen!
Jörg R. hat darauf hingewiesen, dass Interrupts auch zu präzisen
Timing-Aufgaben eingesetzt werden. So wie ich es bisher kennengelernt
habe, zählt dabei ein Timer eine ganz bestimmte Zeit vor sich hin und
verursacht nach Ablauf der Zeitspanne einen Interrupt. Inwiefern ist
denn der Interrupt für die exakte Zeitmessung notwendig?
Gruß
Basti
>Inwiefern ist>denn der Interrupt für die exakte Zeitmessung notwendig?
Was heißt "exakte Zeitmessung"? Der Interrupt ist nur die Aufforderung
an die CPU, unmittelbar, in einer determinierten Zeitspanne, auf das
Ereignis ,z.B. "Zählerunterlauf", zu reagieren. Der Programmierer kennt
das Zeitintervall, das durch den Zählerablauf durchschritten wurde und
kann entsprechend kalkulieren. Da es sich oft im periodische Prozesse
handelt, subtrahiert sich die Interrupt-Latenzzeit heraus.
Die Interrupt-Routine kann beispielsweise benutzt werden, um den Zähler
neu zu initialisieren, auch mit einem anderen Wert (PWM) und so weiter
und so fort.