Topic : TOS - das Betriebssystem Author : Version : tos.hyp (5. März 2013) Subject : Programmieren/Atari Nodes : 3001 Index Size : 93602 HCP-Version : 5 Compiled on : Atari @charset : atarist @lang : @default : Titel @help : @options : +g -i -s +x +zz -t4 @width : 70 View Ref-File11.21.5.14 mxk_evnt_IO TOS Name: »evnt_IO« Parameter: d0 = long ticks_50hz a0 = void *unsel Beschreibung: evnt_IO ermöglicht es, auf EIN externes Ereignis zu warten. Als externes Ereignis kommt entweder ein Interrupt oder eine andere Applikation (die etwa zum Aufwecken in eine Pipe schreibt) in Frage. Die Funktion wird zum Erstellen von Gerätetreibern verwendet: Vorgehensweise (siehe DEV_LPT1 als Beispiel): 1. Interrupts sperren 2. Abfrage, ob das Ereignis (im Fall DEV_LPT1 lautet das Ereignis: "centronics busy off" eingetroffen ist. 3. Wenn ja, Interrupts freigeben und Aktion durchführen (im Fall DEV_LPT1: Zeichen drucken) 4. Wenn nein, Interruptroutine aufsetzen (im Fall DEV_LPT1: MFP-I0, d.h. Centronics Busy Interrupt aktivieren) und diesem die aktuelle Applikation (act_appl) sowie eine Langwortadresse zugänglich machen, in die die Interruptroutine Rückmeldungen schreiben kann. Diese Adresse ist mit der Adresse einer Routine zu beschreiben, die den Interrupt wieder abmeldet, dahinter können nach eigenen Anforderungen z.B. noch weitere Daten folgen. Die Unselect-Routine bekommt später einen Zeiger auf alle diese Daten und kann z.B. die optionalen Parameter auswerten. Der ganze Mechanismus ist notwendig, um ein korrektes Deinitialisieren des Interrupts in jedem Fall zu garantieren. 5. Interrupts freigeben 6. evnt_IO aufrufen. In d0.w die Anzahl der 50Hz- Ticks für den Timeout angeben, 0 heißt "kein Timeout". In a0 die Adresse des Langworts angeben, in dem die Adresse der Aufräumroutine steht, die den Interrupt wieder abmeldet (dahinter folgen optional weitere Parameter, falls die Unselect- Routine diese versteht). Im Fall des Einbindens von Gerätetreibern für Fselect() ist nur ein optionales Langwort möglich. Die Interruptroutine schreibt bei Eintreffen des Interrupts einen Status < 0L (Fehler) oder 1L (OK) statt der Deinitialisierungsroutine in das Statuslangwort (in dem vorher ihre eigene Startadresse stand). Anschließend deinstalliert sich die Routine selbst bzw. stellt sicher daß bei folgenden Interrupts keine Aktionen ausgeführt werden. Schließlich weckt die Interruptroutine die dem Interrupt zugeordnete Applikation auf, und zwar über den Aufruf appl_IOcomplete() mit der Applikation als Parameter. 7. evnt_IO() liefert als Rückgabewert 0L (Timeout, der Interrupt ist nicht eingetroffen) oder < 0 (der Interrupt hat Fehlermcode ins Statuslangwort geschrieben) oder 1L (der Interrupt hat eine 1L ins Statuslangwort geschrieben). Eine Deinstallierung des Interrupts ist nicht mehr notwendig, dies hat der Kernel erledigt, falls die Interruptroutine dies nicht selbst beim Eintreffen des Interrupts getan hat. Gruppe: Kernelfunktionen Querverweis: -