Funkioniert Interrupt-Sharing nun grundsätzlich mit Polling oder mit Level-Triggering

Tamatebako

Lieutenant
Registriert
Feb. 2006
Beiträge
641
Schönen guten Abend,

da ich abermals gwillt bin meine IT-Kenntnisse eigenständing aufzufrischen/zu verbesseren/zu vertiefen, bin ich nun auf folgendes Problem gestoßen, wobei mich meine sämtlich angeeignete Literatur im Stich lässt. Dort steht zwar alles über Maskierung/Demaskierung/Interrupt-Vektortabellen/Interrupt-Service-Routinen usw. Aber rein gar nichts über Interrupt-Sharing. Ich könnte schon wieder an die Decke gehen. Im Internet bin ich da zwar auf nähere Infos gestoßen. Da haben mich aber nun 2 Infos erheblich irritiert.

Mir geht es vor allem darum, woran der μP bei Interrupt-Sharing mit PCI erkennt, von welcher Karte die Interruptmeldung kommt, falls mehere Karten denselben IRQ benutzen.

Einerseits wird gesagt, es geschieht durch Polling (habe ich durchaus vollkommen verstanden),

andererseits wird hier geschrieben es geschähe durch "Level-Triggering" (Habe ich überhaupt nicht verstanden).

Mir geht es nun um folgendes: Welcher dieser beiden Theorien nun richtig ist.

Für zweckdienliche, aufklärererische Hinweise wäre ich der hiesigen Community sehr sehr verbunden und bedanke mich schon einmal im voraus.

mfg

Tamatebako
 
Zuletzt bearbeitet:
Polling ist in diesem Fall bezogen auf das Abfragen der Geräte, für die dieser Interrupt registriert wurde. Normalerweise wird der Begriff für interrupt-loses Peripheriehandling benutzt (I/O Polling). Dabei wird das Peripheriegerät in bestimmten Zeitabständen abgefragt, ob Daten vorliegen.
Das Abrageintervall wird dabei meist durch einen Zeitgeber bestimmt, dieser verfügt dann über einen Interrupt (Zeitatom). Ist aber heute eine Seltenheit, bzw. nur bei sehr kleinen Prozeßrechnern noch vorhanden.

Interrupt Sharing hat eigentlich nichts mit Level oder Edge-Triggerrung zu tun.
Bei Level-Triggerung wird durch Halten der Interrupt-Leitung durch das Peripherie-Gerät die Unterbrechungsanforderung signalisiert.
Bei Edge-Triggerung ist es ein Impuls. Demnach kann dort ein Interrupt verloren gehen, wenn für eine gewisse Zeit der Interrupt ausgeblendet (maskiert) ist. Das hängt aber von den Fähigkeiten des Programmieres und der Hardware ab.
Um Probleme mit Edge-Triggern zu umgehen kann durch entsprechende Zusatzhardware die Anforderung zwischengespeichert werden, oder die CPU bzw der PIC macht das.

Sharing ist mit beiden Verfahren möglich. Tritt ein Interrupt auf, dann wird dieser behandelt, sobald die Priorität "erlaubt" ist. Dabei springt die CPU auf vorher festgelegte Adressen und führt den dort hinterlegten Code aus.
Um Probleme mit Edge-Triggern zu umgehen kann durch entsprechende Zusatzhardware die Anforderung zwischengespeichert werden.

Dort werden dann die hinterlegten Geräte abgefragt (Polling) und dessen Interruptanforderungen gelöscht. Die Geräte speichern dazu selbständig, ob sie ein Interrupt angefordert haben.

Wie das genau geschieht, hängt stark von der verwendeten Hardware ab. Bei mancher muß der aktuelle IRQ bis zum Ende der Serviceroutine maskiert werden, um eine Schachtelung zu vermeiden, bei vielen geschieht das automatisch.

Bei einfacher Hardware wird meistens kein Sharing betrieben. Dann haben Edge getriggerte IRQ's den Vorteil, das die CPU die Anzahl der Anforderungen speichern kann. Das Peripheriegerät ist dann ziemlich simpel und muß eigenlich nur den Impuls erzeugen (bspw. Zeitgeber, Watchdog).
 
Ich bedanke mich für die erklärenden Worte, die mir vorerst sehr geholfen haben, sehr herzlich bei Dir und wünsche Dir noch ein schönes Wochendende.
 
Zurück
Oben