Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: Programm bleibt stehen Kategorie: Programmierung (von Thomas - 4.01.2005 10:01)
Als Antwort auf Programm bleibt stehen von Horst - 3.01.2005 20:57
Ich nutze:
C-Control II Unit, CC2-Application-Board, eigenes Board, OSOPT V3.0
Hallo Horst,

> Die Steuerung läuft tadellos bis auf die Tatsache dass nach einiger Zeit sich die Steuerung aufhängt.
> Sobald der Thread für die Temperaturerfassung nicht gestartet wird läuft die Steuerung. Wird der
> Temperaturthread gestartet steht die Steuerung ab und zu nach einigen Minuten jedoch spätestestens
> einigen Stunden.

anhand des geposteten Ausschnittes ist es recht schwer zu beurteilen. Könnte es sein, dass Du
mit den Captures in einen Deadlock läufst - also bei gesetztem global.pf nochmals in einer der
aufgerufenen Unterfunktionen versuchst das Flag zu capturen?

Hast Du die Möglichkeit z.B. über die serielle Schnittstelle und ein Terminalprogramm Testausgaben
anzuzeigen? Wenn ja, würde ich versuchen an den kritischen Stellen (capture, release, Funktionseintritt
und Funktionsende) Debug-Ausgaben einzubauen.


int debugLevel;  // 0 = keine Debug-Ausgabe 9 = max. DebugAusgabe
...
debugLevel = 3;
....
function Modemstatus() returns int
{
   if debugLevel > 2 doDebugMsg ("Modemstatus: Enter");
   long erg;
   if debugLevel doDebugMsg ("Modestatus: capture global.pf");
   capture global.pf;
   twb.init();
   erg = twbs.rw_frame(0, allg.Modem_Adresse, 0, 0, 0);
   if debugLevel doDebugMsg ("Modestatus: release");
   release;
   if debugLevel > 2 doDebugMsg ("Modestatus: Leave");
   return (erg);
}
....


Den debugLevel könntest Du dann zur Laufzeit durch einfache Zeichencodes (an der Stelle an der auch
das Einleiten des Hostmode geprüft wird) über das Terminalprogramm steuern.


thread rControl {
byte c;
  loop {
    wait hwcom.rxd();
    c = hwcom.get();
    if debugLevel > 5{
      string s;
      s = "RS232 RCV: ";
      str.putint (s, c);
      doDebugMsg (s);
    }
   
    if c == 254 {
      wait hwcom.rxd();
      if hwcom.get()==254 quit 1;// Hostmode einleiten
    } else
    if c == 48 {
      // debugLevel 0
      debugLevel = 0;
      s = "Set debugLevel to: 0";
      doDebugMsg (s);
    } else
    if c == 49 {
      // debugLevel 1
      debugLevel = 1;
      s = "Set debugLevel to: 1";
      doDebugMsg (s);
    } else
    if c == 50 {
      // debugLevel 2
      debugLevel = 2;
      s = "Set debugLevel to: 2";
      doDebugMsg (s);
    } else
    if c == 51 {
      // debugLevel 3
      debugLevel = 3;
      s = "Set debugLevel to: 3";
      doDebugMsg (s);
    } else
    if c == 52{
      // debugLevel 4
      debugLevel = 4;
      s = "Set debugLevel to: 4";
      doDebugMsg (s);
    };
    hwcom.flush();
  }
}


Die Funktion doDebugMsg sollte dann noch die Systemzeit mit ausgeben.

function doDebugMsg (string s){
system.TIME time;
string debugString;

  if (debugLevel){
     system.gettime (time);
     debugString="";
     str.putintf(debugString, time.hour, 2);
     debugString = debugString + ":";
     str.putintf(debugString, time.minute, 2);
     debugString = debugString + ":";
     str.putintf(debugString, time.second, 2);
     debugString = debugString + " [";
     str.putlong(debugString, system.timer());
     debugString = debugString + "] : ";
     hwcom.print(debugString);
     debugString = s;
     hwcom.print (debugString);
     hwcom.ret();
  }
}



Ich hoffe die Anregung ist für Dich nützlich und Du kannst den Fehler so lokalisieren. Ich selbst habe
damit sehr gute Erfahrung gemacht.

Beste Grü�e
Thomas





    Antwort schreiben


Antworten:

Re: Programm bleibt stehen (von Horst - 13.01.2005 13:26)