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

Wichtig: Bevor Du wegen einem Problem mit der CC2 postest, stelle sicher, daß Du
die neueste OS-Version, die neuseste Compiler-DLL und die neuesten Modulversionen benutzt!
Beachte, daß sich auf der CD zur CC2-Unit/Station auch jetzt noch die ältesten Dateien befinden!
Es gelten folgende Anleitung und Regeln: Regeln CC2Net.de-Forum
Zurück zum Artikel  (Blaue Felder sind Pflichtfelder)


Name:   UserID: 
 E-Mail:
Kategorie
Betreff
Homepage:
Link-Titel:
Link-URL:
Cookie für Name, UserID, E-Mail, Homepage-URL setzen
(Erspart die Neueingabe bei Beiträgen und Antworten)
(Zum Löschen des Cookies hier klicken)
Ich nutze:
C-Control II Unit
C164CI-Controllerboard
C-Control II Station
CCRP5 mit CC2-Unit (Conrad Roboter)
CC2-Application-Board
CC2-StarterBoard
CC2-ReglerBoard
eigenes Board
original OS     OSOPT_V2     OSOPT V3.0 OSOPT V3.1

Kommentar:
Einfügen von HTML im Kommentar:

Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a>
Bild einfügen: <img src="BILDURL">
Text formatieren: <b>fetter Text</b>  <i>kursiver Text</i> <u>unterstrichener Text</u>
Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b>
C2 Quellcode formatieren: <code>Quellcode</code>
ASM Quellcode formatieren: <asm>Quellcode</asm>
(Innerhalb eines Quellcodeabschnitts ist kein html möglich.)
Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst !  

> 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:<code> > run 255; > yield; > // ab hier 255 VM-Codes > </code> > 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 <code>run Threadname;</code> 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. > > > > <code> > > 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(); > > } > > > > > > </code>
Dateianhang: (.gif, .png., .jpg, .zip, .rar)
max. 256kB
max. 256kB