home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 03 / rahmen / debug.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-09-04  |  10.6 KB  |  368 lines

  1. (**********************************************************)
  2. (*                                                        *)
  3. (*   Filename DEBUG.PAS                                   *)
  4. (*                                                        *)
  5. (*   TOOLBOX-Spezial III Echtzeitverarbeitung             *)
  6. (*                                                        *)
  7. (*   (C) TOOLBOX und Thomas Lang 1988                     *)
  8. (*                                                        *)
  9. (*   Dieses File enthält den Debugger. Mit ihm ist es     *)
  10. (*   möglich, ansonsten in Echtzeit laufende Aufgaben     *)
  11. (*   auf ihr Verhalten zu untersuchen. Dadurch wird       *)
  12. (*   natürlich das Laufzeitverhalten des gesamten         *)
  13. (*   Systems verlangsamt, aber die Relationen bleiben     *)
  14. (*   etwa erhalten. Für besonders zeitkritische und       *)
  15. (*   bereits ausgetestete Systeme können die hier         *)
  16. (*   enthaltenen Prozeduren durch Dummies ersetzt         *)
  17. (*   werden, aber im allgemeinen ist es nicht nötig.      *)
  18. (*   Die notwendigen Deklarationen sind in einem extra    *)
  19. (*   File (DEBUG.DCL) vorhanden, das vom Hauptprogramm    *)
  20. (*   vor diesem Debugger mit der Include Anweisung        *)
  21. (*   eingebunden werden muß.                              *)
  22. (*                                                        *)
  23. (**********************************************************)
  24.  
  25. Procedure InitDebug;
  26. Var
  27.    I:Integer;
  28.    FT:Boolean;
  29.    FrageString:Str40;         (* für Abfragen benutzt *)
  30. Begin
  31.    If Frage Then Begin
  32.       WriteLn;
  33.       SchirmLog:=FrageJN('Logging auf Bildschirm');
  34.       DruckerLog:=FrageJN('Logging auf Drucker');
  35.       DateiLog:=FrageJN('Logging in File');
  36.       If DateiLog Then Begin
  37.          Write('FileName für LogFile eingeben: ');
  38.          ReadLn(LogFileName);
  39.          End;
  40.                               (* jetzt Preset für Logging *)
  41.                               (* abfragen *)
  42.       FT:=FrageJN('Voreinstellung alle Aufgaben loggen');
  43.                               (* nur bei Abfragen werden *)
  44.                               (* jetzt die Flags, was *)
  45.                               (* geloggt werden soll, *)
  46.                               (* zuerst mit abgefragtem *)
  47.                               (* Wert vorbelegt *)
  48.       For I:=1 To AnzahlHoch Do
  49.          HochLog[I]:=FT;
  50.       For I:=1 To VerschFifo Do
  51.          FifoLog[I]:=FT;
  52.       For I:=1 To AnzahlPeriodic Do
  53.          PeriodicLog[I]:=FT;
  54.                               (* jetzt Text für Abfrage *)
  55.                               (* vorbereiten, welche *)
  56.                               (* der Voreinstellungen *)
  57.                               (* geändert werden sollen *)
  58.                               (* nur wegen Zeilenbreite *)
  59.                               (* hier aufgeteilt *)
  60.       If FT Then
  61.          FrageString:=', welche Aufgaben nicht loggen'
  62.       Else
  63.          FrageString:=', welche Aufgaben loggen';
  64.       FrageString:=FrageString+' (Ende=0)';
  65.  
  66.                               (* jetzt abfragen, welche *)
  67.                               (* der Voreinstellungen *)
  68.                               (* geändert werden sollen *)
  69.       Repeat
  70.          I:=FrageInteger('Hohe Priori'+FrageString,
  71.                           0,AnzahlHoch);
  72.          If I>0 Then
  73.             HochLog[I]:=(Not HochLog[I]);
  74.       Until (I=0);
  75.  
  76.       Repeat
  77.          I:=FrageInteger('Fifo'+FrageString,0,VerschFifo);
  78.          If I>0 Then
  79.             FifoLog[I]:=(Not FifoLog[I]);
  80.       Until (I=0);
  81.  
  82.       Repeat
  83.          I:=FrageInteger('Periodic'+FrageString,
  84.                           0,AnzahlPeriodic);
  85.          If I>0 Then
  86.             PeriodicLog[I]:=(Not PeriodicLog[I]);
  87.       Until (I=0);
  88.       End
  89.    Else Begin
  90.       SchirmLog:=Schirm;
  91.       DruckerLog:=Drucker;
  92.       DateiLog:=Datei;
  93.       LogFileName:=Name;
  94.       End;
  95.    If DateiLog Then Begin     (* bei Fehler gibt es hier *)
  96.       Assign(LogFile,LogFileName); (* Runtime Error, da *)
  97.                               (* keine IO Fehler extra *)
  98.                               (* überprüft werden. *)
  99.  
  100.       Rewrite(LogFile);       (* falls dieses File schon *)
  101.                               (* existiert, so wird es *)
  102.                               (* hier gelöscht !! *)
  103.  
  104.       End;                    (* wenn keine Abfrage, *)
  105.                               (* dann muß vom Programm *)
  106.                               (* direkt angegeben sein, *)
  107.                               (* welche Aufgaben geloggt *)
  108.                               (* werden sollen *)
  109.  
  110. End;                          (* von InitDebug *)
  111.  
  112. Procedure PLogLn;
  113. Begin
  114.    If SchirmLog Then
  115.       WriteLn;
  116.    If DruckerLog Then
  117.       WriteLn(Lst);
  118.    If DateiLog Then
  119.       WriteLn(LogFile);
  120. End;
  121.  
  122. Procedure PLogText;
  123. Begin
  124.    If SchirmLog Then
  125.       Write(S);
  126.    If DruckerLog Then
  127.       Write(Lst,S);
  128.    If DateiLog Then
  129.       Write(LogFile,S);
  130. End;
  131.  
  132. Procedure PLogInteger;
  133. Begin
  134.    If SchirmLog Then
  135.       Write(I);
  136.    If DruckerLog Then
  137.       Write(Lst,I);
  138.    If DateiLog Then
  139.       Write(LogFile,I);
  140. End;
  141.  
  142. Procedure PLogReal;
  143. Begin
  144.    If SchirmLog Then
  145.       Write(R:7:0);           (* Format ist so besser *)
  146.    If DruckerLog Then         (* lesbar, da fast alles *)
  147.       Write(Lst,R:7:0);       (* nur Zeiten sind *)
  148.    If DateiLog Then
  149.       Write(LogFile,R:7:0);
  150. End;
  151.  
  152. Procedure PLogHoch;
  153. Begin
  154.    If HochLog[Index] Then Begin
  155.       PLogText('Hohe Priorität Nr. ');
  156.       PLogInteger(Index);
  157.       PLogLn;
  158.       End;
  159. End;
  160.  
  161. Procedure PLogFifo;
  162. Begin
  163.    If FifoLog[FifoNr] Then Begin
  164.       PLogText('Fifo, Aufgabe ');
  165.       PLogInteger(FifoNr);
  166.       PLogText(' mit Parameter ');
  167.       PLogInteger(Param);
  168.       PLogLn;
  169.       End;
  170. End;
  171.  
  172. Procedure PLogPeriodic;
  173. Begin
  174.    If PeriodicLog[Index] Then Begin
  175.       PLogText('Periodic Nr. ');
  176.       PLogInteger(Index);
  177.       PLogText(' SollZeit ');
  178.       PLogReal(Aufgabe.Periodic[Index].Zeit);
  179.       PLogText(' IstZeit ');
  180.       PLogReal(TimeNow);
  181.       PLogLn;
  182.       End;
  183. End;
  184.  
  185. Procedure PLogSchedul;
  186. Var
  187.    Delta,NichtBelastung,MaxDelta,Belastung,
  188.    PromillBelastung:Real;
  189. Begin
  190.    PLogLn;
  191.    PLogText('Scheduling begonnen: ');
  192.    PLogReal(BeginZeit);
  193.    PLogText(' beendet: ');
  194.    PLogReal(EndeZeit);
  195.    PLogText(' Dauer: ');
  196.    Delta:=EndeZeit-BeginZeit;
  197.    PLogReal(Delta);
  198.    PLogText(' (1/100 Sek)');
  199.    PLogLn;
  200.    PLogText('Anzahl Durchläufe des Schedulers: ');
  201.    NichtBelastung:=DWinReal(Belastungszaehler);
  202.    PLogReal(NichtBelastung);
  203.    PLogLn;
  204.    PLogText('ergibt eine Belastung von ');
  205.    MaxDelta:=Delta*NullBelastung;
  206.    Belastung:=(MaxDelta-NichtBelastung)/MaxDelta;
  207.    PromillBelastung:=Belastung*1000.0;
  208.    PlogReal(PromillBelastung);
  209.    PLogText(' Promill');
  210.    PlogLn;
  211.    PLogText('Overflow bei hoher Priorität: ');
  212.    PLogInteger(HochOverFlow);
  213.    PLogLn;
  214.    PLogText('                        Fifo: ');
  215.    PLogInteger(FifoOverFlow);
  216.    PLogLn;
  217.    PLogText('                    Periodic: ');
  218.    PLogInteger(PerOverFlow);
  219.    PLogLn;
  220.    If DateiLog Then
  221.       Close(LogFile);
  222. End;
  223.  
  224. Procedure PLogPutHoch;
  225. Begin
  226.    If HochLog[HochNr] Then Begin
  227.       PLogText('Hohe Priorität Nr. ');
  228.       PLogInteger(HochNr);
  229.       PLogText(' in Aufgabenliste eingetragen');
  230.       If Aufgabe.Hoch[HochNr] Then    (* Aufgabe schon da *)
  231.          PLogText(' (ergibt OverFlow!)');
  232.       PLogLn;
  233.       End;
  234. End;
  235.  
  236. Procedure PLogPutFifo;
  237. Begin
  238.    If FifoLog[FifoNr] Then Begin
  239.       PLogText('Fifo, Aufgabe ');
  240.       PLogInteger(FifoNr);
  241.       PLogText(' mit Parameter ');
  242.       PLogInteger(Param);
  243.       If (FifoIndexIn=FifoIndexOut)     (* leer oder voll *)
  244.          And (FifoLeer=False) Then      (* schon voll *)
  245.          PLogText(' kann nicht eingetragen werden (OverFlow)')
  246.       Else
  247.          PLogText(' in Aufgabenliste eingetragen');
  248.       PLogLn;
  249.       End;
  250. End;
  251.  
  252. Procedure PLogPutPerAbs;
  253. Begin
  254.    If PeriodicLog[PerNr] Then Begin
  255.       PLogText('Periodic Nr. ');
  256.       PLogInteger(PerNr);
  257.       PLogText(' mit SollZeit ');
  258.       PLogReal(AbsZeit);
  259.       If Aufgabe.Periodic[PerNr].ZuTun Then  (* OverFlow *)
  260.          PLogText(' kann nicht eingetragen werden (OverFlow)')
  261.       Else
  262.          PLogText(' in Aufgabenliste eingetragen');
  263.       PLogLn;
  264.       End;
  265. End;
  266.  
  267. Procedure PLogPutPerDelta;
  268. Begin
  269.    If PeriodicLog[PerNr] Then Begin
  270.       PLogText('Periodic Nr. ');
  271.       PLogInteger(PerNr);
  272.       PLogText(' mit Delta ');
  273.       PLogReal(DeltaZeit);
  274.       PLogText(' (');
  275.       PLogReal(TimeNow+DeltaZeit);
  276.       PLogText(' abs)');
  277.       If Aufgabe.Periodic[PerNr].ZuTun Then  (* OverFlow *)
  278.          PLogText(' kann nicht eingetragen werden (OverFlow)')
  279.       Else
  280.          PLogText(' in Aufgabenliste eingetragen');
  281.       PLogLn;
  282.       End;
  283. End;
  284.  
  285. Procedure PLogInhaltHoch;
  286. Var
  287.    I:Integer;
  288. Begin
  289.    PLogText(S);
  290.    PLogLn;
  291.    PLogText('Inhalt für hohe Priorität: ');
  292.    For I:=1 To AnzahlHoch Do Begin
  293.       If Aufgabe.Hoch[I] Then
  294.          PLogText('T')        (* oder sonstigen Text *)
  295.       Else
  296.          PLogText('F');
  297.       End;
  298.    PLogLn;
  299.    PLogLn;
  300. End;
  301.  
  302.  
  303. Procedure PLogInhaltFifo;
  304. Var
  305.    T:String[2];
  306.    I:Integer;
  307. Begin
  308.    PLogText(S);
  309.    PLogLn;
  310.    PLogText('FifoIndexIn ');
  311.    PLogInteger(FifoIndexIn);
  312.    PLogText(' FifoIndexOut ');
  313.    PLogInteger(FifoIndexOut);
  314.    PLogText(' Fifo ist ');
  315.    If FifoLeer Then
  316.       PLogText('leer')
  317.    Else
  318.       PLogText('nicht leer');
  319.    PLogLn;
  320.    PLogText('Index FifoNr Param');
  321.    PLogLn;
  322.    For I:=1 To AnzahlFifo Do Begin
  323.       PLogText('   ');
  324.       If I<10 Then
  325.          PLogText(' ');
  326.       Str(I,T);               (* damit hat T genau 1 oder *)
  327.       PlogText(T);            (* 2 Ziffern, evtl. anpassen*)
  328.       PLogText('     ');
  329.       Str(Aufgabe.Fifo[I].Nummer,T);    (* 1 Ziffer, da<9 *)
  330.       PLogText(T);
  331.       PLogText('     ');
  332.       PLogInteger(Aufgabe.Fifo[I].Param);
  333.       PLogLn;
  334.       End;
  335.    PLogLn;
  336. End;
  337.  
  338. Procedure PLogInhaltPer;
  339. Var
  340.    T:String[2];
  341.    I:Integer;
  342. Begin
  343.    PLogText(S);
  344.    PLogLn;
  345.    PLogText('PeriodicIndexOut ');
  346.    PLogInteger(PeriodicIndexOut);
  347.    PLogText(' TimeNow ');
  348.    PLogReal(TimeNow);
  349.    PLogLn;
  350.    PLogText('Index T/F SollZeit');
  351.    PLogLn;
  352.    For I:=1 To AnzahlPeriodic Do Begin
  353.       PLogText('    ');
  354.       Str(I,T);               (* 1 Ziffer, da <= 5 *)
  355.       PlogText(T);
  356.       PLogText('  ');
  357.       If Aufgabe.Periodic[I].ZuTun Then Begin
  358.          PLogText('T');       (* oder sonstigen Text *)
  359.          PLogText('  ');
  360.          PLogReal(Aufgabe.Periodic[I].Zeit);
  361.          End
  362.       Else
  363.          PLogText('F');
  364.       PLogLn;
  365.       End;
  366.    PLogLn;
  367. End;
  368.