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

Re: run, halt austauschen Kategorie: Programmierung (von André H. - 6.12.2011 21:04)
Als Antwort auf run, halt austauschen von Lorenz - 3.12.2011 15:34
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, C-Control II Station, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT V3.1
Hallo Lorenz,

Grundlagen C2:
Funktionen können nur Werte und Variablen bzw. Referenzen auf Variablen(Arrays)
übergeben werden.
Ein Thread ist keines davon. Deshalb kann dies auch nicht übergeben werden.

Nun zum Problem:
Die Schlüsselworte zur Threadkontrolle erwarten die Threadnummer als Konstante.
D.h. diese wird einkompiliert. (siehe vmcodes.c2)
Wenn man mit run, halt, resume, reset arbeitet führt daran kein Weg vorbei.
Es gibt zwei Möglichkeiten:
1. Du baust Dir eine Weiche.
  Mit If-Anweisungen wählst Du die entsprechenden Threads aus.
2. Du arbeitest mit einem kleinem Trick.
  Ich hatte im Zusammenhang mit einem anderem Problem vor langer Zeit eine direktere
  Möglichkeit der Thread-Kontrolle aufgezeigt:
  Re: Funktions/Thread-Definitionen vom 11.05.2008
  Einziger Nachteil: Du muÃ?t die Thread-ID in Erfahrung bringen. Ã?ndert sich die Reihenfolge
  der Threads, anderen sich auch die IDs. Diese werden von Oben nach unten
  bei 1 beginnend zugewiesen. Der Mainthread (der unterste) hat die höchste ID.
  Sinnvoll ist es, wenn die Threads Ihre IDs selbst verraten. Dazu müssen alle Threads
  bei Programmstart kurz anlaufen.

z.B.:

byte ThreadID[32]; Array für bis zu 32 Threads
const Thread_irgendwas=1;
const Thread_wasanderes=2; // Der Index hat nichts mit der ID zu tun
//dies Dient nur zu leichteren Verwendung. Man kann die IDs natürlich
//auch in einzelne Bytevariablen speichern.

thread irgendwas
{
 ThreadID[Thread_irgendetwas]=TID();
 halt;// Wichtig, wenn der Thread nicht sofort weiterlaufen soll.
       // Kann entfallen, wenn die ThreadID erst nach dem ersten vorgesehenem run benötigt wird.
 loop // Eigentlicher Threadinhalt
 {
 //...
 }
}

thread irgendwas
{
 ThreadID[Thread_wasanderes]=TID();
 halt;
 loop // Eigentlicher Threadinhalt
 {
 //...
 }
}


Die Threads können dann mit setPrio() beinflu�t werden.
Eine Priorität von 0 hei�t, da� der Thread steht.
1 bis 255 heiÃ?t, er soll mit der entsprechenden Prio laufen.

Bei dieser Lösung kann weiterhin parallel mit den Schlüsselworten gearbeitet werden.
Der Vorteil dieser Lösung ist, da� man nicht den Einschränkungen des Single-Pass-Compilers
unterliegt, sondern auch ein weiter oben stehender Thread auch einen weiter unten steuern kann.

MfG André H.


>
> Hallo,
> ich möchte gern wissen ob man meinen Code kürzer schreiben kann.
> Dieser wäre der untenstehende Code und zwar 5 mal hintereinander geschrieben,
> nur dass menu.Ladepumpe_tog durch eine andere Variablen ersetzt wird und dass
> der thread ladepumpe.Pumpe durch andere threads gestartet und gehalten wird.
>
>
> thread auto
> {
>
> byte  x[5];
>
>
>     loop
>     {
>        if menu.Ladepumpe_tog != 0
>        {
>        x[2] = 1 ;
>             if menu.Ladepumpe_tog == 1
>             {
>                       if stports.get(10) == 0
>                       {
>                        halt ladepumpe.Pumpe;
>                    
>                       stports.set(10,-1) ;
>                       }
>                      
>           }
>           else
>           {
>                     if stports.get(10) != 0
>                        {
>                        halt ladepumpe.Pumpe;
>                       stports.set(10,0);
>                         }
>                        
>           }
>        }
>        else
>        {
>        if x[2] == 1
>                 {
>                  run ladepumpe.Pumpe;
>                 sleep 1000;
>                 }
>        x[2] = 0;
>        }
>        sleep 1000;
>     }
>    
> }
>

>
> Ich habe es vesucht so zu lösen wie in diesem Beispiel, aber es hat nicht funktioniert:
>
>
> function update(var myvar, thread mythread)
> {
> ...
> }
>
> function auto()
> {
> function update(var1, thread1);
> function update(var2, thread2);
> function update(var3, thread3);
> }

>
> MfG
> Lorenz


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

Das macht meine Heizung gerade


    Antwort schreiben


Antworten:

Re: run, halt austauschen (von Lorenz - 8.12.2011 16:17)