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 Herbert, > > nachdem es keine Vorab-Definitionen von Funktionen oder Threads gibt, > > habe ich Schwierigkeiten, wenn sich zwei Funktionen oder > > Threads gegenseitig aufrufen oder starten/stoppen möchten. Die vordere > > kennt die hintere noch nicht und so verweigert der Compiler. > > > > Gibt es da einen Trick, oder geht das einfach nicht? > > Der jetzige C2-Compiler ist leider ein Single-Pass-Compiler. Somit können nur Resourcen > angesprochen werden, die vorher auch bekannt sind. > Ein rekursiver Aufruf von Funktionen ist möglich, solange dies bedeutet, daß sich eine Funktion > ohne eine weitere selbst aufruft. > Allerding muß man bei rekursiven Aufrufen sehr vorsichtig sein, da es hier sehr schnell > zu einem Stack-Overflow kommen kann, wenn man's übertreibt. :-) > Ich hatte allerdings erst einen Fall, bei dem man nicht durch geschicktes > Sortieren der Funktionen ans Ziel kam. > > Bei Threads gilt prinzipiell dasselbe. > Allerdings gibt es hier eine direkte Möglichkeit auf die Threads einzuwirken, ohne explizit > mit "run", "halt" und "resume" arbeiten zu müssen. > Ich hatte hier schon vor längerem eine Lösung erstellt, aber bisher nicht in system.c2 eingebaut. > Ich habe es mal aus den Tiefen meiner Festplatten geholt: > <code> > //Anzahl der Threads im Projekt abfragen > inline function ThreadCnt() returns int > { > inline vmcodes.VM_LOAD_CONST_BYTE; > inline 0; > } > > //Thread-Nr. des aufrufenden Threads (0-254) > inline function TID() returns int > { > inline vmcodes.VM_LOAD_ABSOLUTE_BYTE; > inline 0xF91A; > } > > inline function loadByte(int offset) returns int > { > inline vmcodes.VM_LOAD_REF_BYTE; > } > > inline function storeByte(byte Data, int offset) > { > inline vmcodes.VM_STORE_REF_BYTE; > } > > //Priorität des Threads (0-254) stetzen > function setPrio(int ThreadID, byte Prio) > { > ThreadID=(20*ThreadID)+16;//Offset für Datenzeiger > storeByte(loadByte(ThreadID),ThreadID+1);// Backup der Thread-Prio (für resume) > storeByte(Prio,ThreadID); //Priorität festlegen. > } > </code> > Hiermit lassen sich die Prioritäten der Threads explizit anhand der Thread-Nr.(0-254) ändern. > Die Threadnummer muß man entweder durch Zählen im Projekt oder durch > die Funktion TID() ermitteln und in einer entsprechenden Globalen Variable speichern. > Dazu müssen alle Threads aber zumindest einmal laufen. > Wenn diese das aber nicht sollen, kann man folgendes Konstrukt verwenden: > <code>thread xyz > { > IDThread_xyz=TID(); > halt; > loop > { > //.... > } > }</code> > So kann man alle Threads beim Init kurz starten, um die IDs zu erhalten, ohne den Thread > beim ersten Aufruf wirklich auszuführen. > Bei einem erneuten "run" bzw. setPrio() macht der Thread ab der Schleife weiter. > Der Vorteil bei setPrio ist auch, daß man einen Thread auch gleich mit einer anderen Priorität > statt der Standard-Prio von 32 starten kann. > <code>setPrio(IDThread_xyz, 45); //Thread xyz mit Prio 45 starten bzw. Prio auf 45 ändern > setPrio(IDThread_xyz, 0); //Thread xyz anhalten > </code> > > Ich hoffe, das hilft ein wenig für die Threads weiter. > Aber meist, wie gesagt, kommt man auch ohne solche Tricks aus. > Und bei Threads immer daran denken: Nur so viele, wie nötig. > > MfG André H.
Dateianhang: (.gif, .png., .jpg, .zip, .rar)
max. 256kB
max. 256kB