amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Einklinken in Interruptroutinen [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

04.11.2002, 13:54 Uhr

DrNOP
Posts: 4118
Nutzer
Hallo erfahrene Programmierer.

Ich als eher passiv Interessierter bin über die Frage gestolpert, wie man es eigentlich anstellt sich in einer Betriebssystem-Umgebung in Interrupt-Serviceroutinen einzuklinken?

Ich bin eher im Embedded-Bereich unterwegs, und dort bin ich mein eigener Herr - ohne Betriebssystem. Wenn nicht ICH eine Interruptserviceroutine schreibe, reagiert niemand auf einen bestimmten Interrupt. Dazu weiß ich, an welche Adresse der Prozessor springt wenn ein bestimmter Interrupt auftritt und kann dem Compiler sagen, er soll genau diese Funktion an genau dieser Adresse compilieren.

In einem Betriebssystem sind ja aber schon von Haus aus Serviceroutinen für bestimmte Interrupts vorhanden, und/oder mehrere Applikationen sind auf denselben Interrupt angewiesen. Ich kann also sicher nicht dem Compiler sagen, er soll meine Applikation an die Sprungadresse des Interrupts legen, sonst sind alle schon vorhandenen Serviceroutinen überschrieben und vergessen.
Wie dann?

Gruß,
Dr.NOP

[ - Antworten - Zitieren - Direktlink - ]

04.11.2002, 19:31 Uhr

AC-FoX
Posts: 35
Nutzer
Für das AmigaOS gibt es die Befehle
AddIntServer()/RemIntServer() sowie
SetIntVector()
Hierbei ist zu beachten, daß ein Server, bei "geteilten" Interrupts eingesetzt wird, also mehrere Server auf ein und denselben Interrupt reagieren (z.B. VertBlank), und Vectoren exklusiv an einen Interrupt gebunden werden.
SetIntVector() gibt auch noch die Addresse des bisherigen Int-Vectors zurück, den man wieder einsetzen muß, wenn man den eigenen Int-Vector wieder entfernt.

Gruß


[ - Antworten - Zitieren - Direktlink - ]

05.11.2002, 08:41 Uhr

DrNOP
Posts: 4118
Nutzer
Ah ja. Seh ich das also richtig, daß mein Programm sich die Zieladresse der bestehenden Serviceroutinen holen muß und seine eigene an deren Stelle schreibt?
Und nachdem ich mit meiner Serviceroutine fertig bin, muß ich verzweigen zu den alten Routinen (die vor dem Start meines Programms schon bestanden)?
Klingt eigentlich richtig einfach :)
Nur, wer löscht dann das Interrupt-Flag?
Jaja - das soll die letzte Routine in der Schlange tun. Nur woher weiß man, daß man der letzte ist?

[ - Antworten - Zitieren - Direktlink - ]

05.11.2002, 09:11 Uhr

thomas
Posts: 7717
Nutzer
Zitat:
Original von DrNOP:
Ah ja. Seh ich das also richtig, daß mein Programm sich die Zieladresse der bestehenden Serviceroutinen holen muß und seine eigene an deren Stelle schreibt?
Und nachdem ich mit meiner Serviceroutine fertig bin, muß ich verzweigen zu den alten Routinen (die vor dem Start meines Programms schon bestanden)?
Klingt eigentlich richtig einfach :)
Nur, wer löscht dann das Interrupt-Flag?
Jaja - das soll die letzte Routine in der Schlange tun. Nur woher weiß man, daß man der letzte ist?



Es gibt zwei Möglichkeiten:

1. Interrupt Server. Dies ist noch einfacher, das OS übernimmt alle notwendigen Aufgaben für Interrupt-Flags etc., die Server werden als Unterprogramme gerufen (rücksprung mit RTS (return from subroutine) anstatt mit RTE (return from exception)). Es gibt beliebig viele Server pro Interrupt.

2. Interrupt Handler. Das läuft ungefähr so, wie du es beschrieben hast. Es gibt immer nur einen Handler, der alle Aufgaben erledigen muß. Er ist auch für die Interrupt-Flags zuständig. Auch hier wird das Programm als Unterprogramm gerufen, sodaß am Ende letzenendlich immer noch einmal das OS dran kommt.

Du kannst natürlich auch einfach selber die Interrupt-Vektoren des Prozessors verbiegen. Allerdings führt das meistens zu unangenehmen Nebenwirkungen (z.B. beim CIA wird das Interrupt-Register beim Lesen gelöscht, man kann es also nur einmal lesen, wenn du am Ende an den OS-Vektor springst, kann das OS nicht mehr erkennen, welcher Interrupt erzeugt wurde). Sprich: strengstens verboten !

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

05.11.2002, 19:44 Uhr

DrNOP
Posts: 4118
Nutzer
Ah ja, okay. Danke schön :)

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Einklinken in Interruptroutinen [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.