home *** CD-ROM | disk | FTP | other *** search
- (**********************************************************)
- (* *)
- (* Filename DEBUG.PAS *)
- (* *)
- (* TOOLBOX-Spezial III Echtzeitverarbeitung *)
- (* *)
- (* (C) TOOLBOX und Thomas Lang 1988 *)
- (* *)
- (* Dieses File enthält den Debugger. Mit ihm ist es *)
- (* möglich, ansonsten in Echtzeit laufende Aufgaben *)
- (* auf ihr Verhalten zu untersuchen. Dadurch wird *)
- (* natürlich das Laufzeitverhalten des gesamten *)
- (* Systems verlangsamt, aber die Relationen bleiben *)
- (* etwa erhalten. Für besonders zeitkritische und *)
- (* bereits ausgetestete Systeme können die hier *)
- (* enthaltenen Prozeduren durch Dummies ersetzt *)
- (* werden, aber im allgemeinen ist es nicht nötig. *)
- (* Die notwendigen Deklarationen sind in einem extra *)
- (* File (DEBUG.DCL) vorhanden, das vom Hauptprogramm *)
- (* vor diesem Debugger mit der Include Anweisung *)
- (* eingebunden werden muß. *)
- (* *)
- (**********************************************************)
-
- Procedure InitDebug;
- Var
- I:Integer;
- FT:Boolean;
- FrageString:Str40; (* für Abfragen benutzt *)
- Begin
- If Frage Then Begin
- WriteLn;
- SchirmLog:=FrageJN('Logging auf Bildschirm');
- DruckerLog:=FrageJN('Logging auf Drucker');
- DateiLog:=FrageJN('Logging in File');
- If DateiLog Then Begin
- Write('FileName für LogFile eingeben: ');
- ReadLn(LogFileName);
- End;
- (* jetzt Preset für Logging *)
- (* abfragen *)
- FT:=FrageJN('Voreinstellung alle Aufgaben loggen');
- (* nur bei Abfragen werden *)
- (* jetzt die Flags, was *)
- (* geloggt werden soll, *)
- (* zuerst mit abgefragtem *)
- (* Wert vorbelegt *)
- For I:=1 To AnzahlHoch Do
- HochLog[I]:=FT;
- For I:=1 To VerschFifo Do
- FifoLog[I]:=FT;
- For I:=1 To AnzahlPeriodic Do
- PeriodicLog[I]:=FT;
- (* jetzt Text für Abfrage *)
- (* vorbereiten, welche *)
- (* der Voreinstellungen *)
- (* geändert werden sollen *)
- (* nur wegen Zeilenbreite *)
- (* hier aufgeteilt *)
- If FT Then
- FrageString:=', welche Aufgaben nicht loggen'
- Else
- FrageString:=', welche Aufgaben loggen';
- FrageString:=FrageString+' (Ende=0)';
-
- (* jetzt abfragen, welche *)
- (* der Voreinstellungen *)
- (* geändert werden sollen *)
- Repeat
- I:=FrageInteger('Hohe Priori'+FrageString,
- 0,AnzahlHoch);
- If I>0 Then
- HochLog[I]:=(Not HochLog[I]);
- Until (I=0);
-
- Repeat
- I:=FrageInteger('Fifo'+FrageString,0,VerschFifo);
- If I>0 Then
- FifoLog[I]:=(Not FifoLog[I]);
- Until (I=0);
-
- Repeat
- I:=FrageInteger('Periodic'+FrageString,
- 0,AnzahlPeriodic);
- If I>0 Then
- PeriodicLog[I]:=(Not PeriodicLog[I]);
- Until (I=0);
- End
- Else Begin
- SchirmLog:=Schirm;
- DruckerLog:=Drucker;
- DateiLog:=Datei;
- LogFileName:=Name;
- End;
- If DateiLog Then Begin (* bei Fehler gibt es hier *)
- Assign(LogFile,LogFileName); (* Runtime Error, da *)
- (* keine IO Fehler extra *)
- (* überprüft werden. *)
-
- Rewrite(LogFile); (* falls dieses File schon *)
- (* existiert, so wird es *)
- (* hier gelöscht !! *)
-
- End; (* wenn keine Abfrage, *)
- (* dann muß vom Programm *)
- (* direkt angegeben sein, *)
- (* welche Aufgaben geloggt *)
- (* werden sollen *)
-
- End; (* von InitDebug *)
-
- Procedure PLogLn;
- Begin
- If SchirmLog Then
- WriteLn;
- If DruckerLog Then
- WriteLn(Lst);
- If DateiLog Then
- WriteLn(LogFile);
- End;
-
- Procedure PLogText;
- Begin
- If SchirmLog Then
- Write(S);
- If DruckerLog Then
- Write(Lst,S);
- If DateiLog Then
- Write(LogFile,S);
- End;
-
- Procedure PLogInteger;
- Begin
- If SchirmLog Then
- Write(I);
- If DruckerLog Then
- Write(Lst,I);
- If DateiLog Then
- Write(LogFile,I);
- End;
-
- Procedure PLogReal;
- Begin
- If SchirmLog Then
- Write(R:7:0); (* Format ist so besser *)
- If DruckerLog Then (* lesbar, da fast alles *)
- Write(Lst,R:7:0); (* nur Zeiten sind *)
- If DateiLog Then
- Write(LogFile,R:7:0);
- End;
-
- Procedure PLogHoch;
- Begin
- If HochLog[Index] Then Begin
- PLogText('Hohe Priorität Nr. ');
- PLogInteger(Index);
- PLogLn;
- End;
- End;
-
- Procedure PLogFifo;
- Begin
- If FifoLog[FifoNr] Then Begin
- PLogText('Fifo, Aufgabe ');
- PLogInteger(FifoNr);
- PLogText(' mit Parameter ');
- PLogInteger(Param);
- PLogLn;
- End;
- End;
-
- Procedure PLogPeriodic;
- Begin
- If PeriodicLog[Index] Then Begin
- PLogText('Periodic Nr. ');
- PLogInteger(Index);
- PLogText(' SollZeit ');
- PLogReal(Aufgabe.Periodic[Index].Zeit);
- PLogText(' IstZeit ');
- PLogReal(TimeNow);
- PLogLn;
- End;
- End;
-
- Procedure PLogSchedul;
- Var
- Delta,NichtBelastung,MaxDelta,Belastung,
- PromillBelastung:Real;
- Begin
- PLogLn;
- PLogText('Scheduling begonnen: ');
- PLogReal(BeginZeit);
- PLogText(' beendet: ');
- PLogReal(EndeZeit);
- PLogText(' Dauer: ');
- Delta:=EndeZeit-BeginZeit;
- PLogReal(Delta);
- PLogText(' (1/100 Sek)');
- PLogLn;
- PLogText('Anzahl Durchläufe des Schedulers: ');
- NichtBelastung:=DWinReal(Belastungszaehler);
- PLogReal(NichtBelastung);
- PLogLn;
- PLogText('ergibt eine Belastung von ');
- MaxDelta:=Delta*NullBelastung;
- Belastung:=(MaxDelta-NichtBelastung)/MaxDelta;
- PromillBelastung:=Belastung*1000.0;
- PlogReal(PromillBelastung);
- PLogText(' Promill');
- PlogLn;
- PLogText('Overflow bei hoher Priorität: ');
- PLogInteger(HochOverFlow);
- PLogLn;
- PLogText(' Fifo: ');
- PLogInteger(FifoOverFlow);
- PLogLn;
- PLogText(' Periodic: ');
- PLogInteger(PerOverFlow);
- PLogLn;
- If DateiLog Then
- Close(LogFile);
- End;
-
- Procedure PLogPutHoch;
- Begin
- If HochLog[HochNr] Then Begin
- PLogText('Hohe Priorität Nr. ');
- PLogInteger(HochNr);
- PLogText(' in Aufgabenliste eingetragen');
- If Aufgabe.Hoch[HochNr] Then (* Aufgabe schon da *)
- PLogText(' (ergibt OverFlow!)');
- PLogLn;
- End;
- End;
-
- Procedure PLogPutFifo;
- Begin
- If FifoLog[FifoNr] Then Begin
- PLogText('Fifo, Aufgabe ');
- PLogInteger(FifoNr);
- PLogText(' mit Parameter ');
- PLogInteger(Param);
- If (FifoIndexIn=FifoIndexOut) (* leer oder voll *)
- And (FifoLeer=False) Then (* schon voll *)
- PLogText(' kann nicht eingetragen werden (OverFlow)')
- Else
- PLogText(' in Aufgabenliste eingetragen');
- PLogLn;
- End;
- End;
-
- Procedure PLogPutPerAbs;
- Begin
- If PeriodicLog[PerNr] Then Begin
- PLogText('Periodic Nr. ');
- PLogInteger(PerNr);
- PLogText(' mit SollZeit ');
- PLogReal(AbsZeit);
- If Aufgabe.Periodic[PerNr].ZuTun Then (* OverFlow *)
- PLogText(' kann nicht eingetragen werden (OverFlow)')
- Else
- PLogText(' in Aufgabenliste eingetragen');
- PLogLn;
- End;
- End;
-
- Procedure PLogPutPerDelta;
- Begin
- If PeriodicLog[PerNr] Then Begin
- PLogText('Periodic Nr. ');
- PLogInteger(PerNr);
- PLogText(' mit Delta ');
- PLogReal(DeltaZeit);
- PLogText(' (');
- PLogReal(TimeNow+DeltaZeit);
- PLogText(' abs)');
- If Aufgabe.Periodic[PerNr].ZuTun Then (* OverFlow *)
- PLogText(' kann nicht eingetragen werden (OverFlow)')
- Else
- PLogText(' in Aufgabenliste eingetragen');
- PLogLn;
- End;
- End;
-
- Procedure PLogInhaltHoch;
- Var
- I:Integer;
- Begin
- PLogText(S);
- PLogLn;
- PLogText('Inhalt für hohe Priorität: ');
- For I:=1 To AnzahlHoch Do Begin
- If Aufgabe.Hoch[I] Then
- PLogText('T') (* oder sonstigen Text *)
- Else
- PLogText('F');
- End;
- PLogLn;
- PLogLn;
- End;
-
-
- Procedure PLogInhaltFifo;
- Var
- T:String[2];
- I:Integer;
- Begin
- PLogText(S);
- PLogLn;
- PLogText('FifoIndexIn ');
- PLogInteger(FifoIndexIn);
- PLogText(' FifoIndexOut ');
- PLogInteger(FifoIndexOut);
- PLogText(' Fifo ist ');
- If FifoLeer Then
- PLogText('leer')
- Else
- PLogText('nicht leer');
- PLogLn;
- PLogText('Index FifoNr Param');
- PLogLn;
- For I:=1 To AnzahlFifo Do Begin
- PLogText(' ');
- If I<10 Then
- PLogText(' ');
- Str(I,T); (* damit hat T genau 1 oder *)
- PlogText(T); (* 2 Ziffern, evtl. anpassen*)
- PLogText(' ');
- Str(Aufgabe.Fifo[I].Nummer,T); (* 1 Ziffer, da<9 *)
- PLogText(T);
- PLogText(' ');
- PLogInteger(Aufgabe.Fifo[I].Param);
- PLogLn;
- End;
- PLogLn;
- End;
-
- Procedure PLogInhaltPer;
- Var
- T:String[2];
- I:Integer;
- Begin
- PLogText(S);
- PLogLn;
- PLogText('PeriodicIndexOut ');
- PLogInteger(PeriodicIndexOut);
- PLogText(' TimeNow ');
- PLogReal(TimeNow);
- PLogLn;
- PLogText('Index T/F SollZeit');
- PLogLn;
- For I:=1 To AnzahlPeriodic Do Begin
- PLogText(' ');
- Str(I,T); (* 1 Ziffer, da <= 5 *)
- PlogText(T);
- PLogText(' ');
- If Aufgabe.Periodic[I].ZuTun Then Begin
- PLogText('T'); (* oder sonstigen Text *)
- PLogText(' ');
- PLogReal(Aufgabe.Periodic[I].Zeit);
- End
- Else
- PLogText('F');
- PLogLn;
- End;
- PLogLn;
- End;