home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / multtsk / cpmult / doku / v24pipe.dok < prev   
Encoding:
Text File  |  1990-04-23  |  16.3 KB  |  450 lines

  1. .. //////////////////////////////////////////////////////////////////
  2. .. /// Dokumentation zum Multi-Tasking Subsystem V2.10 / April 1990
  3. .. /// Modul V24PIPE
  4. .. /// Format: DOCLIST 1.00-Format
  5. .. //////////////////////////////////////////////////////////////////
  6. .. /// Bitte passen Sie die nachfolgenden Zeile ggf. für Ihren
  7. .. /// Drucker an. Die Voreinstellung paßt auf einen EPSON FX-85
  8. .. /// mit Papierformat 12"
  9. .. //////////////////////////////////////////////////////////////////
  10. .PL 72      Seitenlänge 72 Zeilen
  11. .LL 80      Zeilenlänge 80 Zeichen
  12. .ID 5       Einrücken um 5 Zeichen vom linken Rand
  13. .RM 5       5 Zeichen bis zum rechten Rand Platz lassen -> 70
  14. ..          Zeichen Text je Zeile
  15. .HS =       Zeichen für Kopf-/Fuß-Trenner
  16. .RS -       Zeichen für Trennung von Referenz-Einträgen
  17. .CO (c) Copyright 1988..1990 Ch.Philipps Software-Technik
  18. .. //////////////////////////////////////////////////////////////////
  19. .SE Multi-Tasking Subsystem für Turbo-Pascal 5.x Version 2.10
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.             Turbo Pascal 5.x  Multi-Tasking Subsystem
  29.  
  30.  
  31.                    V24PIPE - Benutzerhandbuch
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.                  (c) Copyright 1988, 1989, 1990
  41.  
  42.                Christian Philipps Software-Technik
  43.  
  44.                      alle Rechte vorbehalten
  45.  
  46.  
  47.                    Version 2.10  / April 1990
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.          Anschrift:  Christian Philipps
  61.                      Software-Technik
  62.                      Düsseldorfer Str. 316
  63.  
  64.                      D-4130 Moers 1
  65.  
  66.          Telefon..:  02841 / 35932
  67.          Fido-Netz:  509/3.4
  68.  
  69. .SE Lizenzvereinbarung, Garantie- und Haftungsausschluß, Warenzeichen
  70. siehe hierzu CPMULTI.DOK
  71. .SE V24PIPE / Leistungsbeschreibung
  72. 1. Leistungsbeschreibung
  73.  
  74. Die Units V24 und V24Pipe ermöglichen in Kombination den
  75. Datentransfer von und zur seriellen Schnittstelle Ihres PC mit
  76. Geschwindigkeiten bis zu 115200 baud.
  77. Hereinkommende Daten werden interruptgesteuert entgegengenommen.
  78.  
  79. Die Höchstgeschwindigkeit von 115200 baud konnte auf einem 12 MHz AT
  80. kompatiblen PC problemlos eingesetzt werden; ein 8 MHz XT
  81. kompatibler Rechner kam immerhin auf 19200 baud.
  82.  
  83. Die Verbindung zum Anwendungsprogramm erfolgt über Pipes, wodurch
  84. die Schnittstelle mit den Pascal-Standardprozeduren Read/ReadLn und
  85. Write/Writeln bearbeitet werden kann.
  86.  
  87. Die Unit V24 habe ich auf Basis eines PD-Produktes von Mike
  88. Halliday, das er damals für Turbo Pascal 3.0 geschrieben hat,
  89. entwickelt und bereits vor längerer Zeit als Public Domaine
  90. freigegeben. Sie ist nun zur Basis der Unit V24Pipe geworden und
  91. somit auch im Lieferumfang des Multi-Tasking Subsystems enthalten.
  92. Sie ist nach wie vor Public Domaine und steht Ihnen im Quellcode zur
  93. Verfügung.
  94.  
  95.  
  96. Hinweis für registrierte Anwender des Multi-Tasking Subsystems
  97. --------------------------------------------------------------
  98.  
  99. Bitte beachten Sie, daß für diese Unit gleichfalls die Lizenzver-
  100. einbarungen gelten, die in der Dokumentation zum Multi-Tasking Sub-
  101. system aufgeführt sind.
  102. Insbesondere bedeutet dies, daß Sie die lizenzierte Version dieses
  103. Produktes, seine Dokumentation und seinen Quellcode unter keinen
  104. Umständen an Dritte weitergeben dürfen, weder auszugsweise, noch
  105. vollständig. Diese Unit einschließnlich ihrer Dokumentation ist, wie
  106. auch CPMulti, in der lizenzierten Version KEINE ShareWare, sondern
  107. ausschließlich gemäß den Lizenzvereinbarungen (siehe CPMULTI.DOK) zu
  108. behandeln.
  109. .SE V24PIPE / Einbindung der Unit
  110. 2. Einbindung der Unit in eigene Programme
  111.  
  112. Wie beim Multi-Tasking-Subsystem selbst, gestaltet sich auch hier die
  113. Einbindung unproblematisch. Durch Eintragung der Units V24 und
  114. V24Pipe in Ihr USES-Statement, wird die Unterstützung für die
  115. serielle Schnittstelle in Ihr Programm integriert.
  116.  
  117. Die Unit V24 initialisiert sich durch die Einbindung automatisch und
  118. installiert insbesondere eine eigene Exit-Routine. Diese sorgt
  119. dafür, daß die Verbindung zur Schnittstelle bei Beendigung Ihres
  120. Programmes oder bei einem Programmabbruch ordnungsgemäß getrennt wird.
  121.  
  122. Eine Initialisierung der Unit V24Pipe findet nicht statt; die
  123. Verbindung zur Schnittstelle wird erst durch Aufruf einer speziellen
  124. Prozedur durch das Anwendungsprogramm hergestellt.
  125.  
  126. Beispiel:  USES CPMULTI, V24, V24Pipe;
  127.  
  128. Bitte beachten Sie die Reihenfolge der Einbindung, die in Kapitel 8
  129. des Handbuches zu CpMulti angegeben ist.
  130. .SE V24PIPE / Konzept
  131. 3. Konzept
  132.  
  133. Nachdem ich die Unit V24 bereits einigen registrierten Benutzern des
  134. Multi-Tasking Subsystems separat zur Verfügung gestellt hatte, habe
  135. ich mich nun dazu entschlossen, sie künftig zusammen mit dem
  136. Subsystem auszuliefern.
  137.  
  138. Die Routinen dieser Unit ermöglichen die Programmierung jeweils
  139. einer der beiden Schnittstellen Com1 und Com2 mit Geschwindigkeiten
  140. von 110 bis 115200 baud. Hereinkommende Daten werden interruptge-
  141. steuert in einem internen Ringpuffer zur Abholung bereitgestellt. Um
  142. derart hohe Geschwindigkeiten erreichen zu können, wurde auf die
  143. Auswertung des Modem-Statusregisters und des Leitungs-Status-
  144. registers verzichtet. Das Kabel zur Datenübertragung benötigt daher
  145. nur drei Adern: Transmit-Data, Receive-Data und Signal-Ground.
  146. Ein Nachteil dieser Vorgehensweise ist, daß die Programmierung
  147. komplexer Terminalprogramme, die in der Regel den Status der
  148. einzelnen Steuerleitungen abfragen bzw. manipulieren, nicht ohne
  149. Modifikation möglich ist.
  150. Diese Unit kann jedoch als Basis für Eigenentwicklungen dienen,
  151. da sie Ihnen ja im Quellcode vorliegt und somit leicht erweitert
  152. werden kann.
  153.  
  154. Wenngleich sich diese Dokumentation in erster Linie mit der Unit
  155. V24Pipe befaßt, werde ich doch an einigen Stellen auf Teile der Unit
  156. V24 eingehen müssen. Letztere wird jedoch nicht im Detail behandelt.
  157.  
  158. Die Schnittstellenroutinen der Unit V24 waren ursprünglich nicht für
  159. den Multi-Tasking Einsatz gedacht und sind daher nicht vom
  160. Multi-Tasking Subsystem abhängig. Selbstverständlich fehlt dadurch
  161. auch jegliche Unterstützung der Synchronisations- und Kommunikations-
  162. mechanismen des Subsystems.
  163. Um V24 in Verbindung mit dem Subsystem einsetzen zu können, entstand
  164. damals das "Ereignis". Auf Basis dieses Ereignisses (ab Version 2.02
  165. des Subsystems unter der Bezeichnung "MemoryEvent" geführt) und in
  166. Verbindung mit den Routinen der Unit MtPipe, entstand die Unti
  167. V24Pipe.
  168.  
  169. V24Pipe reduziert die zur Schnittstellenbehandlung erforderlichen
  170. Routinen auf ein Minimum und ermöglicht die gepufferte
  171. Datenübertragung von und zur Schnittstelle über Turbo Pascal
  172. TEXT-Dateien.
  173.  
  174. Nach Eröffnen der Schnittstelle stehen zwei Pipes bereit, von denen
  175. eine (AuxIn) zum Lesen von der Schnittstelle, und die zweite
  176. (AuxOut) zum Schreiben auf die Schnittstelle verwendet werden. Die
  177. Anwendung greift auf diese Pipes wie auf TEXT-Dateien zu.
  178.  
  179. Beispiel: Writeln(AuxOut,'Ich sende über die Schnittstelle');
  180.  
  181.   oder    Read(AuxIn,C);  {lies ein Zeichen}
  182.           Write(C);       {und gib es aus  }
  183.  
  184. Mit wie wenig Aufwand die Programmierung der Schnittstelle verbunden
  185. ist, beweist das Demoprogramm GLASSTTY, ein sehr einfaches Terminal-
  186. programm.
  187.  
  188. Ein weiteres Demoprogramm, V24PTEST, programmiert die Schnittstelle
  189. so, daß die gesendeten Daten in einer Prüfschleife sofort wieder
  190. empfangen werden. Es sendet sich also in einer Schleife selbst Daten
  191. mit verschiedenen Geschwindigkeiten. Das Programm V24PTEST ist
  192. jedoch nicht auf allen Computern lauffähig. Je nach Architektur
  193. Ihrer Schnittstellenkarte, funktioniert die Prüfschleifenfunktion
  194. nicht einwandfrei. In diesem Fall werden keine Daten empfangen.
  195. .SE V24PIPE / Realisierung
  196. 4. Realisierung
  197.  
  198. Wie bereits erwähnt, basiert V24Pipe auf der Unit MtPipe, dem
  199. TEXT-Datei Gerätetreiber für Pipes.
  200.  
  201. Pipes sind ja, wie in der Dokumentation zu MtPipe beschrieben,
  202. Einweg-Kommunikationskanäle. Dies war im Fall des Print-Spoolers
  203. aus vollkommen ausreichend. Nun aber muß eine Kommunikation in zwei
  204. Richtungen stattfinden.
  205. Aus diesem Grunde sind auch zwei Pipes erforderlich.
  206.  
  207. Sobald die Schnittstelle mittels der Prozedur "OpenAux" eröffnet
  208. wurde, kann das Anwendungsprogramm auf diese Pipes über die globalen
  209. Variablen "AuxIn" und "AuxOut" zugreifen.
  210. Innerhalb der Unit V24Pipe wird die jeweils andere Seite dieser
  211. Pipes von einem Hintergrundprozeß überwacht; es existieren also zwei
  212. zusätzliche Prozesse im System.
  213.  
  214. Der Pipe "AuxIn", auf die das Anwendungsprogramm lesend zugreift,
  215. steht die Task "AuxInTask" der Unit V24Pipe gegenüber, die den
  216. Ringpuffer der Unit V24 entleert und diese Daten in die Pipe
  217. einspeist. Diese Task wird von "OpenAux" mit der Priorität
  218. Pri_Kernel gestartet, damit sie möglichst schnell hereinkommende
  219. Daten bearbeiten kann. Dennoch kann es bei der Übertragung sehr
  220. großer Datenblöcke (> 2KB) zum Überlauf des Ringpuffers in der Unit
  221. V24 kommen. In diesem Fall sollten sie letzeren vergrößern und die
  222. Unit neu übersetzen.
  223.  
  224. Die Schreibseite, vertreten durch die Dateivariable "AuxOut", wird
  225. innerhalb von V24Pipe von der Task "AuxOutTask" bearbeitet. Diese
  226. liest die Daten der Anwendung aus der Pipe und sendet sie
  227. zeichenweise über die Schnittstelle hinaus. Sie bedient sich dabei
  228. der Ausgaberoutine der Unit V24. Die Task "AuxOutTask" besitzt die
  229. Priorität Pri_Kernel-1, ist also nicht ganz so wichtig wie ihr
  230. Gegenstück. Dennoch sorgt die hohe Priorität dafür, daß auch
  231. Sendeaufträge möglichst bald abgearbeitet werden.
  232.  
  233. Ein Wort noch zum Verbindungsaufbau. Sollte während des Öffnens der
  234. Schnittstelle ein Fehler auftreten, so wird das Programm mit einer
  235. Fehlermeldung abgebrochen. Ich habe mich für diesen radikalen Weg
  236. entschieden, weil der saubere Abbau der Kommunikation nicht ganz
  237. unkritisch und ein sinnvolles Weiterarbeiten bei Nichtzustande-
  238. kommen der Verbindung in der Regel nicht möglich ist.
  239.  
  240. Nach getaner Arbeit, kann die Anwendung die Verbindung zur
  241. Schnittstelle wieder lösen. Dies ist jedoch nicht unbedingt
  242. erforderlich, da auch durch das Beenden der Anwendung automatisch
  243. die Interruptbehandlung der Schnittstelle deaktiviert wird
  244. (Exit-Routine von V24). Dennoch wollte ich Ihnen eine Möglichkeit an
  245. die Hand geben, ggf.  im laufenden Programm die Schnittstellen-
  246. behandlung wieder abschalten zu können. Das Demoprogramm GLASSTTY,
  247. z. B. macht auch von dieser Möglichkeit Gebrauch.
  248.  
  249. Der Abbau der Verbindung zur Schnittstelle, und damit das Entfernen
  250. der Pipes und Beenden der Hintergrundprozesse, ist eine nicht ganz
  251. triviale Angelegenheit. Insbesondere verstößt das Schließen aller
  252. Pipe-Kanäle von einer einzigen Prozedur aus gegen die in den Pro-
  253. grammierhinweisen zu Pipes gegebenen Ratschläge.
  254. Zum Zeitpunkt des "Schließens" der Schnittstelle mittels der
  255. Prozedur "CloseAux", sind mindestens zwei Prozesse aktiv, die auf
  256. die Pipes zugreifen, nämlich die Hintergrundprozesse. Im Regelfall
  257. wird es auch noch einen dritten Prozeß geben, nämlich eine Task der
  258. Anwendung (siehe GLASSTTY), die versucht, Daten aus der Pipe zu
  259. lesen und die höchstwarscheinlich blockiert ist, da gerade keine Daten
  260. empfangen werden.
  261.  
  262. "CloseAux" muß daher schrittweise vorgehen und die Verbindung unter
  263. ständiger Überwachung trennen. Hierbei wird auch ein evtl.
  264. blockierter Anwendungsprozeß einbezogen, dessen Task-Id der Prozedur
  265. "CloseAux" übergeben werden kann. Es muß jedoch sichergestellt sein,
  266. daß außer diesem keine weiteren Prozesse auf die Pipes zugreifen.
  267. Genauere Anweisungen finden Sie noch im Referenzteil bei der
  268. Beschreibung von "CloseAux".
  269.  
  270. Problematisch ist zudem, daß diejenige Hintergrundtask, die den
  271. Ringpuffer der seriellen Schnittstelle bearbeitet, von einem
  272. externen Ereignis abhängig ist und daher den größten Teil ihres
  273. Daseins mit Warten auf dessen Eintreten verbringt. Diese Task
  274. zu beenden, ist schon ein recht gewagtes Unterfangen und nur bedingt
  275. zur Nachahmung empfohlen.
  276. .SE V24/V24PIPE / Exportierte Typ- und Datendefinitionen
  277. 5. Exportierte Typ- und Datendefinitionen
  278.  
  279. Typdefinitionen der Unit V24
  280.  
  281. ComType      = (Com1,Com2);
  282.  
  283.   Mittels dieser symbolischen Namen wird die zu eröffnende
  284.   Schnittstelle im "OpenAux"-Aufruf angegeben.
  285.  
  286.  
  287. BaudType     = (b110,b150,b300,b600,b1200,b2400,b4800,b9600,b19200,
  288.                 b38400,b57600,b115200);
  289.  
  290.   Der Datentyp "BaudType" dient zur Auswahl der zu verwendenden
  291.   Übertragungsgeschwindigkeit.
  292.  
  293.  
  294. ParityType   = (Space,Odd,Mark,Even,None);
  295.  
  296.   "ParityType" gibt die zu benutzende Parität an; normalerweise wird
  297.   man den Wert "None" wählen.
  298.  
  299.  
  300. DataBitsType = (d5,d6,d7,d8);
  301.  
  302.   Dieser Datentyp gibt an, wieviele Bits je Zeichen übertragen
  303.   werden. Die häufigsten Werte sind "d7" (nur Zeichen von 0-127)
  304.   und "d8" (alle Bits eines Bytes).
  305.  
  306.  
  307. StopBitsType = (s1,s2);
  308.  
  309.   Die Anzahl Stopbits je übertragenem Zeichen wird durch einen
  310.   Parameter vom Typ "StopBitsType" angegeben.
  311.  
  312.  
  313. Variablen der Unit V24Pipe
  314.  
  315. AuxIn, AuxOut : Text;
  316.  
  317.   Dies sind die Dateivariablen, über die auf die serielle
  318.   Schnittstelle zugegriffen werden kann.
  319.   AuxIn dient zur Dateineingabe; AuxOut zur Datenausgabe. Es ist zu
  320.   beachten, daß Zugriffe auf diese Variablen erst nach erfolgreichem
  321.   Aufruf von "OpenAux" zulässig sind.
  322. .SE V24PIPE / Referenzteil
  323. 6. Funktionsbeschreibung (alphabetisch)
  324.  
  325.  
  326. .RE AuxSendTimeout
  327. Deklaration
  328.  
  329.   FUNCTION  AuxSendTimeout:BOOLEAN;
  330.  
  331. Funktion
  332.  
  333.   Die Unit V24 pflegt eine Variable mit Namen "V24Timeout", die den
  334.   Wert TRUE enthält, wenn bei der letzten Sendeoperation ein
  335.   Timeout-Fehler aufgetreten ist.
  336.   "AuxSendTimeout" liefert lediglich den Inhalt dieser Variablen
  337.   zurück, kann also auch durch direkte Abfrage von "V24Timeout"
  338.   ersetzt werden.
  339.  
  340. Beispiel
  341.  
  342.       ......
  343.  
  344.   IF AuxSendTimeout
  345.      THEN BEGIN
  346.             Writeln('Zeitfehler beim Senden!');
  347.             Halt(1);
  348.           END;
  349.  
  350.       ......
  351. .EE
  352. ────────────────────────────────────────────────────────────────────
  353. .RE CloseAux
  354. Deklaration
  355.  
  356.   PROCEDURE CloseAux(Reading:TaskNoType);
  357.  
  358. Funktion
  359.  
  360.   Schließen der Schnittstelle; Abbau der Verbindung.
  361.   Die Hintergrundtasks werden beendet und die Pipes entfernt,
  362.   nachdem die Interruptbehandlung der Schnittstelle deaktiviert wurde.
  363.   Der Parameter "Reading" enthält die ID einer Task, die Daten über
  364.   die Dateivariable "AuxIn" entgegennimmt. Diese Task muß derart
  365.   programmiert sein, daß sie das Beenden der Kommunikation über
  366.   IOResult erkennt und sich anschließend beendet.
  367.  
  368.   Ist sichergestellt, daß zum Zeitpunkt des Aufrufes von "CloseAux"
  369.   keine Tasks mehr auf die Schnittstelle zugreifen, so kann der Wert
  370.   0 in "Reading" übergeben werden. "CloseAux" verläßt sich dann
  371.   allerdings auf die Richtigkeit Ihrer Angabe!!!!
  372.  
  373. Beispiel
  374.  
  375.  
  376.   VAR V24InTask : TaskNoType;
  377.  
  378.       ......
  379.  
  380.   {$F+}
  381.   PROCEDURE V24Input(P:Pointer);
  382.  
  383.   VAR  C : Char;
  384.  
  385.   BEGIN
  386.     Read(AuxIn,C);
  387.     WHILE Not Ende AND (IoResult = 0) DO
  388.     BEGIN
  389.       Write(C);
  390.       Read(AuxIn,C);
  391.     END;
  392.   END;
  393.   {$F-}
  394.  
  395.       ......
  396.  
  397.   V24InTask := CreateTask(V24Input,NIL,Pri_User+1,500);
  398.  
  399.       ......
  400.  
  401.   CloseAux(V24InTask);
  402.  
  403.       ......
  404.  
  405. Kommentar
  406.  
  407.   ACHTUNG!!! "CloseAux" wartet auf das Ende der Task, deren ID
  408.              übergeben wurde!! Beendet sich diese Task nicht,
  409.              hängt "CloseAux" in einer Endlosschleife!!!
  410.  
  411.   Weiterhin muß sichergestellt sein, daß keine weiteren Tasks auf
  412.   die Schnittstelle zugreifen. Wird dies nicht beachtet, sind die
  413.   Ergebnisse unvorhersehbar!!!
  414. .EE
  415. ────────────────────────────────────────────────────────────────────
  416. .RE OpenAux
  417. Deklaration
  418.  
  419.   PROCEDURE OpenAux(ComPort:ComType;Baudrate:BaudType;
  420.                     Parity:ParityType;Bits:DataBitsType;
  421.                     Stop:StopBitsType;BufSize:Word);
  422.  
  423. Funktion
  424.  
  425.   Initialisieren der Schnittstelle entsprechend den übergebenen
  426.   Parametern, Starten der Hintergrundprozesse und Eröffnen der Pipes.
  427.   Zu den Parametern "ComPort", "Baudrate", "Parity", "Bits" und "Stop"
  428.   läßt sich nicht sehr viel sagen. Die symbolischen Namen der
  429.   Datentypen sprechen für sich selbst.
  430.   "BufSize" bezeichnet die Anzahl Bytes, die für den Datenbereich
  431.   der beiden Pipes auf dem Heap reserviert werden.
  432.  
  433. Beispiel
  434.  
  435.   OpenAux(Com2,b300,none,d8,s1,2048);
  436.  
  437.   Diese Zeile initialisiert die Schnittstelle COM2: mit 300 Baud,
  438.   ohne Paritätsprüfung, 8 Datenbits,, 1 Stopbit und einem
  439.   Pipe-Puffer von 2 KB (4 KB Heap gesamt).
  440.  
  441. Kommentar
  442.  
  443.   Verläuft der Verbindungsaufbau nicht erfolgreich, wird das
  444.   Programm mit einer Fehlermeldung abgebrochen.
  445.  
  446. siehe auch
  447.  
  448.   Typdefinitionen ComType, ParityType, BaudType, DataBitsType,
  449.                   StopBitsType
  450.