•  Back 
  •  Kernelfunktionen für ein XFS 
  •  Index 
  •  Tree View 
  •  Cross references 
  •  Help page 
  •  Show info about hypertext 
  •  View a new file 
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:  -