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

Re: Betriebssystem laden Kategorie: CC2-Unit & Appl.Board / CC2-Station (von André H. - 4.09.2004 9:23)
Als Antwort auf Re: Betriebssystem laden von smy42 - 2.09.2004 10:41
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT_V2, OSOPT V3.0
Hallo Stefan,
 
> Mein Problem mit der Ablaufsteuerung muss ich über Taskprioritäten und Funktions-Aufrufreihenfolgen
> lösen.

Wenn dann Thread-Prios. Tasks gibt es bei der CC2 nicht. ;-)

> Frage hierzu: kann ein Thread sich volle Rechenzeit holen, ohne alle anderen Threads explizit zu kennen?
> (halt X; halt Y... geht nur, wenn ich alle laufenden threads namentlich hab; da muss ich alle HALTen
> und dann resumen... (und wehe ich vergess einen oder ein threadwechsel funkt dazwischen :-))

Du meinst, daÃ? alle Threads warten, bis ein Thread einen bestimmten Thread abgeareitet hat bzw.
eine definierte Zeit läuft ?
Das geht ohne weiteres nicht. Wenn das auszuführende Stück max. 255 VM-Codes hat, kann
man eben folgendes machen:
 run 255;
 yield;
 // ab hier 255 VM-Codes

Wenn Du längere passagen ohne Unterbrechung benötigst, mu�t Du alle anderen Threads anhalten.
Dies bedarf natürlich etwas Programmieraufwand, wenn Du zu diesem Zeitpunkt nicht wei�t,
welche Threads alle laufen, und nur die Threads wieder gestartet werden sollen, welche vorher liefen.
Die Frage ist, benötigst Du eine zeitlich ununterbrochene Ausführung des einen Threads, oder
soll nur kein anderer Thread auf Ressourcen(Ports, Variablen) zugreifen ?
Bei letzterem könnte man mit Capture arbeiten. (evtl. mit einem leicht modifizierten)

> Sind run, halt und resume eigentlich 1 VM-Befehl oder mehrere?

Das ist unterschiedlich.
run hat immer zwei VM-Codes.
Zuerst wird die Threadpriorität auf den Stack gepusht. Bei run Threadname; wird immer
32 benutzt.
Dann erfolgt der AM-Aufruf von run, welchen ein fester Parameter für die Threadnummer begleitet.
Ist der Parameter 0, so wird run auf den aktuellen Thread angewendet.
Ist dieser grö�er, also 1 bis 255, wird run explizit auf Thread 1 bis 255 angewendet.
Als Bsp. aus einer VMC-Datei:
8260 322
8260 = 0x2044 = Lade 0x20(32) auf den Stack. (0x44= Load Immediate Byte)
 322 =  0x142 = Weise thread 1 die Prio des letzten Stackeintrags zu. (0x42= run)
oder
12356 66
12356 = 0x3044 = Lade 0x30(48) auf den Stack.
  66 =   0x42 = Weise dem aktuellen Thread die Prio des letzten Stackeintrags zu.

Von den Möglichkeiten der VM könnte man sogar einen Thread mit einer anderen Prio
au�er dem Standardwert 32 starten. Jedoch wurde diese Möglichkeit im Compiler leider
nicht berücksichtigt. (Aber für was kann man die VMC-Datei editieren. ;-)

Noch etwas wichtiges zur Nummerierung der Threads:
Alle Threads erhalten Nummern von 1 bis 255. Die Reihenfolge ergibt sich aus der Reihenfolge
aller Threads in einem Projekt von "oben" nach "unten".

> so wie ich das sehe ist auch ein run 255 kein single thread abarbeitung, sondern heisst
> 255 OpCodes thread X, dann 32 (oder wieviel ich halt eingestellt hab) OpCodes main, 32 thread Y usw.?

Richtig.
Aber: VMCodes, nicht OpCodes. ;-)
Eine nahezu echtes Singlethreading hat man nur, wenn definitiv nur ein Thread läuft.

> naja, ich werd mal wieder akademisch neugierig, ich machs mit Funktionsaufrufen!

Wenn etwas in ganz bestimmten Reihenfolgen abgearbeitet werden soll, dann ist dies
die beste Möglichkeit.
Nur, weil die CC2 Multithreading beherscht, hei�t dies nicht, da� man es so viel, wie möglich,
anwenden muÃ?. ;-)
Man mu� eben genau abwägen, wofür man einen Thread benötigt, und wofür mehrere.
Meistens ergibt sich daraus eine logische untergliederung des Programms:
z.B. ein Thread für Display ausgaben inkl.Bedienung (Tastaturauswertung).
ein Thread zur Auswertung und Berechnung von MeÃ?werten.
ein Thread für die Kommunikation an hwcom.
usw. ...
Aber es wird immer zu Ressourcenüberschneidungen kommen, wofür man dann Captures benötigt.


> Zu der Hostmode-Routine:
>

Das Problem sind die zusätzlichen Verzögerungen, die Du u.a. durch sleep einbaust.
Jede solche Verzögerung verzögert auch den Hostmode entsprechend.
Und wenn diese Zeit länger dauert, als der eingestellte Parameter Hostmodetimeout
im Download-Tool, so geht das Tool natülich davon aus, da� das Einleiten erfolglos war,
da sich die CC2 noch nicht im Hostmode befindet.
Je nach OS-Version (und quit-Paramter) dauert dies unterschiedlich lange.
Daher mu�t Du den Parameter Hostmodetimeout entsprechend den zusätzlichen Pausen erhöhen.
Was ich natülich immer empfehlen kann, ist das Verwenden der HOST-LED ab OSOPT V3.0 .
Auch bei der Station kann man diese durch einen kleinen operativen Eingriff nachrüsten.
(Schaltplan siehe HTML zum DL-Tool)

MfG André H.


>
> thread waithost// Thread vom main-thread aus starten
> {
>  hwcom.init();
>  hwcom.setspeed(8);
>  loop
>  {
>   if hwcom.rxd();
>        {//stports.setRel(1,-1);
>
> /*sobald rel1 an ist, geht "Ã?bertragen" nicht mehr:
> main stoppt, c-control antwortet nicht.
> Nochmal "Ã?bertragen" funzt dann wieder
> (jetzt; hab das alte Prog schon weggeworfen gehabt und jetzt erstmal neu geschrieben...
> jetzt gehts besser)
>
> ohne Rel und sleep: manchmal gehts beim ersten Versuch, manchmal brauchts mehrere...
>
> die setRel sind als "Debug" stationen drin, die delays zum besseren "Treffen"
> der kritischen Zustände im Prog.
>
> */

> //       sleep 500;
>     if hwcom.get()==254
>        {byte x[2];
> //        stports.setRel(2,-1);
> //        sleep 500;
>         x[1]=hwcom.receive(x,1,1000);
>         if x[0]==254 and x[1]==1 quit 1;// Hostmode einleiten
>        }
>
>     // Platz für eigene Schnittstellenroutinen ...
>
>     hwcom.flush();
>    }
>   // weiterer Programm-code ...
>
>  }
> }
>
> /*Meine Version:
>
> //Hostmode durch 2x 254 per rs232 einleiten. cc2net.de-DLTool, modifiziert: SMy 040824
> thread waithost// Thread vom main-thread aus starten
> {byte hostmode, x[2];
>  hwcom.init();
>  hwcom.setspeed(8);
>  loop
>  {if hwcom.rxd();
>   {x[2]=hwcom.receive(x,2,10);
>    if x[0]==254 and x[1]==254 and x[2]==2 quit 1;// Hostmode einleiten
>    hwcom.flush();
>   }
>  }
> }
> */

>
>
>
> thread main
> {byte i;
>  run waithost;
>  stports.init(); //der muss natürlich vor run waithost!!
>  for i=1...8
>   {stports.setLED(i,-1);
>    sleep 10;
>   }
>  stports.alloff();
> }
>
>
>



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

Das macht meine Heizung gerade


    Antwort schreiben


Antworten: