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

Re: Threads & Hwcom Kategorie: Programmierung (von André H. - 26.10.2003 10:02)
Als Antwort auf Threads & Hwcom von Mike - 24.10.2003 14:25

Hallo Mike,

> Ich möchte ein Programm mit 3 verschiedenen threads machen:
>
> thread one
> thread two
> thread main
>
> Mein Programm sieht so aus:
>
> ...
> ...
>
> eigentlich recht simpel, aber er gibt "THREAD MAIN" über die HWCOM nicht aus. nur die ersten paar
> buchstaben.

In Deinem Proggie stimmen mehrere Sachen nicht:
1. Die Initialisierung
Bei Dir läuft diese im Main-Thread in einer schleife und wird immer wieder durchgeführt.
Das führt bei jedem Durchlauf zu einem "Reset" der Schnittstelle und derren Puffer.
Darum führe den Init nur einmal aus:
thread main
{
 hwcom.init();
 hwcom.setspeed(speed);
 //...
 loop
 {
  //..
  // Programmcode, der in einer Schleife im Mainthread
  // ausgeführt werden soll
 }
}


2.Warum setzt Du die Thread-Prio vom Mainthread auf "1" ?
Das macht den Thread und auch die CC2 unötig langsam.
Man sollte die Prio nicht kleiner 20 setzen. (Standard ist 32)

3. Man sollte nicht ungecaptured von mehreren Thread auf die Schnittstelle
zugreifen. Das gibt in 99,9% der Fälle einen Datensalat.
Jedoch muÃ? dann mit einem definiertem Protokoll gearbeitetet werden.
Zwar macht dies in Deinen Threads "one" und "two" nicht viel aus,
da durch die sleeps ein Threadwechsel erzwungen wird, und
der komplette thread innerhalb der durch run vorgegeben Anzahl von
VM-Instruktionen abgearbeitet werden kann, jedoch können u.U.
dennoch Fehler auftreten, da die Ausgaben nicht gecaptured sind.
Hier helfen auch nicht die captures in den hwcom-Funktionen.

Damit Dein Testproggie korrekte Ausgaben mache, müsste es so aussehen:

thread one
{
 sleep 1000;
 cap.Capture(0);
  hwcom.print("thread one");
  hwcom.ret();
 cap.release(0);
}

thread two
{
 sleep 1000;
 cap.Capture(0);
  hwcom.print("thread two");
  hwcom.ret();
 cap.release(0);
}

thread main
{
 hwcom.init ();
 hwcom.setspeed(hwcom.SPEED_9600);
 hwcom.put(12); // clear screen
 run one;
 run two;
 loop
 {
 cap.Capture(0);
  hwcom.print("thread main");
  hwcom.ret();
 cap.release(0);
 yield;
}


MfG André H.



Antworten bitte nur ins Forum!
Fragen per EMail auf Forum-Postings werden nicht beantwortet!

Das macht meine Heizung gerade


    Antwort schreiben


Antworten: