home *** CD-ROM | disk | FTP | other *** search
- (**********************************************************)
- (* *)
- (* Filename SCHEDUL.PAS *)
- (* *)
- (* TOOLBOX-Spezial III Echtzeitverarbeitung *)
- (* *)
- (* (C) TOOLBOX und Thomas Lang 1988 *)
- (* *)
- (* Dieses File enthält den eigentlichen Scheduler. *)
- (* Mit ihm werden die anstehenden Aufgaben entspre- *)
- (* chend ihrer jeweiligen Priorität bearbeitet. *)
- (* Die notwendigen Deklarationen sind in einem extra *)
- (* File (SCHEDUL.DCL) vorhanden, das vom Hauptprogramm *)
- (* vor diesem Scheduler mit der Include Anweisung *)
- (* eingebunden werden muß. Alle sonst noch notwendigen *)
- (* Deklarationen von Prozeduren, die der Scheduler *)
- (* aufruft, müssen ebenfalls vor diesem eingebunden *)
- (* werden. *)
- (* *)
- (**********************************************************)
-
- Procedure InitSchedul; (* Prozedur zur Initiali- *)
- Var (* sierung des Schedulers *)
- Zaehler:Integer;
- Begin
- Ende:=False; (* Ende nicht erreicht *)
-
- For Zaehler:=1 To AnzahlHoch Do
- Aufgabe.Hoch[Zaehler]:=False;
- (* keine Aufgabe mit *)
- (* hoher Priorität *)
-
- For Zaehler:=1 To AnzahlPeriodic Do
- Aufgabe.Periodic[Zaehler].ZuTun:=False;
- (* keine Aufgabe aus *)
- (* Periodic steht an *)
-
-
- FifoIndexIn:=1; (* Fifo initialisieren *)
- FifoIndexOut:=1; (* also Indizes gleich und *)
- FifoLeer:=True; (* Fifo ist leer *)
-
- PeriodicIndexOut:=1; (* bei 1. beginnen *)
-
- HochOverFlow:=0;
- FifoOverFlow:=0;
- PerOverFlow:=0;
-
- BelastungsZaehler.AnteilHoch:=0;
- BelastungsZaehler.AnteilNiedrig:=0;
-
- End; (* von InitSchedul *)
-
- Procedure Schedul;
- (* lokale Funktionen von *)
- (* Schedul zur Verzweigung *)
- (* entsprechend der an- *)
- (* stehenden Aufgaben *)
-
- Function VerzweigHoch:Boolean;
- Var
- HochFound:Boolean;
- Index:Byte;
- Begin
- With Aufgabe Do Begin
- HochFound:=False;
- Index:=1;
-
- Repeat (* Aufgabe suchen *)
- If Hoch[Index] Then
- HochFound:=True (* eine gefunden *)
- Else
- Index:=Index+1;
- Until (HochFound) Or (Index>AnzahlHoch);
-
- If HochFound Then Begin
- (* falls gefunden, dann *)
- (* entsprechend aufrufen *)
- Hoch[Index]:=False; (* wieder löschen *)
- PLogHoch(Index); (* für Debug *)
- If Index=1 Then PHoch1 (* umständlich, *)
- Else If Index=2 Then PHoch2 (* aber immer *)
- Else If Index=3 Then PHoch3 (* korrekt, dazu *)
- Else If Index=4 Then PHoch4 (* siehe Text *)
- Else PHoch5 (* hier Index=5 *)
- End (* hohe Priorität *)
- End; (* zu With Aufgabe *)
-
- VerzweigHoch:=HochFound; (* Ergebnis übergeben *)
-
- End; (* von VerzweigHoch *)
-
- Function VerzweigFifo:Boolean;
- Var
- Index:Byte;
- Begin
- With Aufgabe Do Begin
-
- If (FifoLeer=False) Then Begin
- Index:=FifoIndexOut; (* zwischenspeichern *)
- If FifoIndexOut=AnzahlFifo Then
- FifoIndexOut:=1
- Else
- FifoIndexOut:=FifoIndexOut+1;
- If FifoIndexOut=FifoIndexIn Then
- FifoLeer:=True;
- PLogFifo(Fifo[Index].Nummer,Fifo[Index].Param);
- (* wieder nur für Debug *)
-
- (* die folgenden Abfragen *)
- (* sind wieder umständlich *)
- (* dafür aber richtig, *)
- (* siehe wieder Text *)
- If Fifo[Index].Nummer>4 Then
- If Fifo[Index].Nummer>6 Then
- If Fifo[Index].Nummer=8 Then
- PFifo8(Fifo[Index].Param)
- Else
- PFifo7(Fifo[Index].Param)
- Else (* Fifo[Index].Nummer<=6 *)
- If Fifo[Index].Nummer=6 Then
- PFifo6(Fifo[Index].Param)
- Else
- PFifo5(Fifo[Index].Param)
- Else (* Fifo[Index].Nummer<=4 *)
- If Fifo[Index].Nummer>2 Then
- If Fifo[Index].Nummer=4 Then
- PFifo4(Fifo[Index].Param)
- Else
- PFifo3(Fifo[Index].Param)
- Else (* Fifo[Index].Nummer<=2 *)
- If Fifo[Index].Nummer=2 Then
- PFifo2(Fifo[Index].Param)
- Else
- PFifo1(Fifo[Index].Param);
-
- VerzweigFifo:=True;
- End (* FifoLeer=False *)
-
- Else (* jetzt ist Fifo leer *)
- VerzweigFifo:=False;
- End; (* zu With Aufgabe *)
-
- End; (* von VerzweigFifo *)
-
- Function VerzweigPeriodic:Boolean;
- Var
- PerTime:Real;
- Index,IndexFound:Byte;
- Begin
- With Aufgabe Do Begin
- Index:=PeriodicIndexOut; (* zwischenspeichern *)
- PerTime:=FastUnendlich;
-
- Repeat (* suche Aufgabe *)
- If Periodic[Index].ZuTun Then
- If Periodic[Index].Zeit<PerTime Then Begin
- (* Aufgabe soll zuerst dran *)
- (* weil sie kleinere Soll- *)
- (* zeit hat *)
- PerTime:=Periodic[Index].Zeit;
- IndexFound:=Index;
- End;
- If Index=AnzahlPeriodic Then
- Index:=1
- Else
- Index:=Index+1;
- Until Index=PeriodicIndexOut;
-
- (* Index für nächste Per. *)
- If PeriodicIndexOut=AnzahlPeriodic Then
- PeriodicIndexOut:=1
- Else
- PeriodicIndexOut:=PeriodicIndexOut+1;
-
- If PerTime<=TimeNow Then Begin
- (* Zeit ist erreicht, zu *)
- (* der Aufgabe erfüllt sein *)
- (* sollte *)
- Periodic[IndexFound].ZuTun:=False;
- PLogPeriodic(IndexFound); (* für Debug *)
-
- (* für die folgenden Ab- *)
- (* fragen siehe wieder Text *)
- If IndexFound=1 Then PPeriodic1
- Else If IndexFound=2 Then PPeriodic2
- Else If IndexFound=3 Then PPeriodic3
- Else If IndexFound=4 Then PPeriodic4
- Else PPeriodic5; (* hier IndexFound=5 *)
-
- VerzweigPeriodic:=True;
- End (* PerTime<=TimeNow *)
-
- Else (* keine Aufgabe *)
-
- VerzweigPeriodic:=False;
-
- End; (* zu With Aufgabe *)
-
- End; (* von VerzweigPeriodic *)
-
- (* damit sind lokale Funk- *)
- (* tionen beendet *)
- Begin (* von Schedul *)
-
- (* Initialisierung des *)
- (* Schedulers muß erfolgt *)
- (* sein und mindestens *)
- (* eine Aufgabe anstehen *)
-
- BeginZeit:=TimeNow; (* rette Zeit, wann Schedul *)
- (* beginnt *)
-
- Repeat (* hier beginnt Scheduling *)
-
- (* zuerst hohe Priorität *)
- If VerzweigHoch=False Then
- (* nur weiter suchen, falls *)
- (* keine Aufgabe mit hoher *)
- (* Priorität zu erledigen *)
-
- (* dann Fifo *)
- If VerzweigFifo=False Then
- (* nur weiter suchen, falls *)
- (* keine Aufgabe in Fifo zu *)
- (* erledigen *)
-
- (* dann Periodic *)
- If VerzweigPeriodic=False Then
- (* sonstige Aufgaben nur *)
- (* machen, falls keine in *)
- (* Periodic gefunden *)
-
- (* Belastungszähler *)
- PIncrDW(Belastungszaehler);
-
- Until Ende; (* Ende des Scheduling *)
-
- EndeZeit:=TimeNow; (* EndeZeit von Schedul *)
-
- PLogSchedul; (* eine Art Statistik *)
-
- End; (* von Schedul *)