amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > Einklinken in Interruptroutinen [ - Search - New posts - Register - Login - ]

-1- [ - Post reply - ]

2002-11-04, 13:54 h

DrNOP
Posts: 4118
User
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

[ - Answer - Quote - Direct link - ]

2002-11-04, 19:31 h

AC-FoX
Posts: 35
User
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ß


[ - Answer - Quote - Direct link - ]

2002-11-05, 08:41 h

DrNOP
Posts: 4118
User
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?

[ - Answer - Quote - Direct link - ]

2002-11-05, 09:11 h

thomas
Posts: 7717
User
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/

[ - Answer - Quote - Direct link - ]

2002-11-05, 19:44 h

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

[ - Answer - Quote - Direct link - ]


-1- [ - Post reply - ]


amiga-news.de Forum > Programmierung > Einklinken in Interruptroutinen [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved.
.