home *** CD-ROM | disk | FTP | other *** search
- (**********************************************************)
- (* *)
- (* Filename UTILITY.PAS *)
- (* *)
- (* TOOLBOX-Spezial III Echtzeitverarbeitung *)
- (* *)
- (* (C) TOOLBOX und Thomas Lang 1988 *)
- (* *)
- (* Dieses File enthält eine Sammlung von Utilities, *)
- (* die vom Scheduler sowie von anderen Aufgaben auf- *)
- (* gerufen werden können. Für bestimmte Teilaufgaben, *)
- (* wie etwa Berechnung von Zeiten, ist es sogar *)
- (* nötig, daß diese mit den zur Verfügung gestellten *)
- (* Utilities bearbeitet werden, um keine Konflikte *)
- (* zu provozieren. Ein weiterer Vorteil ist, daß *)
- (* diese eventuelle Änderungen in den Utilities sofort *)
- (* bei allen Aufgaben wirksam werden und somit alle *)
- (* mit dem gleichen Stand arbeiten. *)
- (* *)
- (**********************************************************)
-
- Procedure PIncrDW;
- Begin
- If DW.AnteilNiedrig<MaxDWNiedrig Then
- DW.AnteilNiedrig:=DW.AnteilNiedrig+1
- Else Begin
- DW.AnteilHoch:=DW.AnteilHoch+1;
- DW.AnteilNiedrig:=0;
- End;
- End;
-
- Function DWinReal;
- Begin
- DWinReal:=(MaxDWNiedrig+1.0)*DW.AnteilHoch
- +DW.AnteilNiedrig;
- End;
-
- Procedure RealinDW;
- Var
- Hilf:Real;
- Begin
- DW.AnteilHoch:=Trunc(R/(MaxDWNiedrig+1));
- Hilf:=DW.AnteilHoch*(MaxDWNiedrig+1.0);
- DW.AnteilNiedrig:=Trunc(R-Hilf);
- End;
-
- Function TimeNow; (* muß angepasst werden *)
- Var Reg:Register8086; (* hier für MS-DOS, siehe *)
- Begin (* aber auch im Text *)
- Reg.AH:= $2c; (* GetTime=Funktion 2C *)
- MsDos(Reg); (* und Systemzeit lesen *)
- TimeNow:=Reg.DL+ (* Hundertstel sind Einer *)
- 100.0*(Reg.DH+ (* Sekunden *)
- 60.0*(Reg.CL+ (* Minuten *)
- 60.0*(Reg.CH))); (* Stunden *)
- End;
-
- Procedure PutHoch;
- Begin
- PLogPutHoch(HochNr);
- With Aufgabe Do Begin
- If Hoch[HochNr] Then (* Aufgabe steht schon an *)
- HochOverFlow:=HochOverFlow+1
- Else
- Hoch[HochNr]:=True;
- End;
- End;
-
- Procedure PutFifo;
- Begin
- PLogPutFifo(FifoNr,Param);
- With Aufgabe Do Begin
- If (FifoIndexIn=FifoIndexOut) (* leer oder voll *)
- And (FifoLeer=False) Then (* schon voll *)
- FifoOverFlow:=FifoOverFlow+1
- Else Begin
- Fifo[FifoIndexIn].Nummer:=FifoNr;
- Fifo[FifoIndexIn].Param:=Param;
- FifoLeer:=False; (* auf jeden Fall steht *)
- (* jetzt eine Aufgabe drin *)
- If FifoIndexIn=AnzahlFifo Then
- FifoIndexIn:=1 (* wieder vorne anfangen *)
- Else
- FifoIndexIn:=FifoIndexIn+1; (* sonst +1 *)
- End;
- End;
- End;
-
- Procedure PutPerAbs;
- Begin
- PLogPutPerAbs(PerNr,AbsZeit);
- With Aufgabe Do Begin
- If Periodic[PerNr].ZuTun Then (* Aufgabe noch drin *)
- PerOverFlow:=PerOverFlow+1
- Else Begin
- Periodic[PerNr].ZuTun:=True;
- Periodic[PerNr].Zeit:=AbsZeit;
- End;
- End;
- End;
-
- Procedure PutPerDelta;
- Begin
- PLogPutPerDelta(PerNr,DeltaZeit);
- With Aufgabe Do Begin
- If Periodic[PerNr].ZuTun Then (* Aufgabe noch drin *)
- PerOverFlow:=PerOverFlow+1
- Else Begin
- Periodic[PerNr].ZuTun:=True;
- Periodic[PerNr].Zeit:=TimeNow+DeltaZeit;
- End;
- End;
- End;
-
- Function FrageJN;
- Var
- T:Char;
- Begin
- Repeat
- Write(S); (* String ausgeben *)
- Write(' (J/N) ? '); (* und als Frage mit J *)
- (* oder N kennzeichnen *)
-
- Read(KBD,T); (* lese ohne Echo, evtl. *)
- (* ist hier Anpassung nötig *)
-
- T:=UpCase(T); (* Großbuchstabe machen *)
- If (Ord(T)>32) Then (* keine Escape-Folge *)
- WriteLn(T); (* also ausgeben *)
-
- If (T<>'J') And (T<>'N') Then (* Fehler melden *)
- WriteLn('Bitte nur J (=Ja) oder N (=Nein) eingeben');
-
- Until (T='J') Or (T='N'); (* so lange, bis O.k. *)
- (* dann Wert übergeben *)
- If T='J' Then
- FrageJN:=True
- Else
- FrageJN:=False;
- End; (* von FrageJN *)
-
- Function FrageInteger;
- Var
- I:Integer;
- Begin
- Repeat
- Write(S); (* String ausgeben *)
- Write(' (Wertebereich ist '); (* und Hinweis *)
- Write(Von);
- Write(' bis ');
- Write(Bis);
- Write('): ');
-
- ReadLn(I); (* einlesen, wobei keine *)
- (* Fehlerprüfung gemacht *)
- (* wird, also evtl. wieder *)
- (* ein Runtime Error auf- *)
- (* treten kann *)
-
- If (I<Von) Or (I>Bis) Then (* Fehler melden *)
- WriteLn('Wertebereich beachten!');
-
- Until (I>=Von) And (I<=Bis); (* so lange, bis O.k. *)
-
- FrageInteger:=I; (* dann Wert übergeben *)
- End; (* von FrageInteger *)