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

Re: Capture und Release Kategorie: Programmierung (von André H. - 19.09.2004 13:51)
Als Antwort auf Capture und Release von Peter - 16.09.2004 14:02
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT_V2, OSOPT V3.0
Hallo Peter,

> Kann mir jemand bei meinem Miniprogramm helfen.
> unter http://www.jvpstmarien.at/steuerung/index.htm und dann den File threads.zip
> stehen die Daten.

Dieses kleine Proggie hättest Du auch ohne weiteres posten können. ;-)
Dann mach ich das:
byte flag;

thread a
{
  capture flag;
  data.x = 65;
  lcd.clear();
  lcd.goto(0,0);
  lcd.put(data.x);
  sleep 2000;
  release;
 
}

thread b
{
  capture flag;
  lcd.clear();
  data.x = 66;
  lcd.goto(0,0);
  lcd.put(data.x);
  sleep 2000;
  release;
}


> Das ganze soll ein Testaufbau sein, da ich in einem komplexeren Programm Schwierigkeiten habe und
> deshalb das ganz einmal mit einem Miniprogramm testen will.
>
> Das Programm soll abwechselnd A und B am LCD der Unit ausgeben.
>
> ACHTUNG: Ich will unbedingt Capture und Release verwenden, da ich diese  Befehle wahrscheinlich bei
> meinem anderen Programm brauche und ich bis jetzt noch nicht damit zu recht komme.

Dein Testprogramm kann so nicht funktionieren, wie Du es willst.
Es wird hier immer nur ein Thread laufen und der andere ewig auf die Freigabe warten.
In Deinem Fall wäre das thread a, da dieser zuerst gestartet wurde.
Um kurz zu erklären, was hier passiert:
Thread a läuft an und setzt das Capture.
Thread b wird auch gestartet, aber wartet bei capture flag;, da
das Flag bereits von Thread a besetzt ist.
Thread a wird komplett durchlaufen bis zum sleep 1000;.
Hier wird die Rechenzeit solange abgegeben, bis die 2000ms vorbei sind.
Thread b wartet prüft inzwischen bei jeder Rechenzeitzuteilung, ob das Flag
wieder frei ist, gibt aber die Rechenzeit gleich wieder ab, da das Flag noch von Thread a
besetzt wird.
Nun sind die 2000ms um, und Thread a kommt zum release; und anschlieÃ?end
gleich wieder zum capture flag; am Anfang.
Da es unmittelbar vor dem Release durch das Sleep zu einem Threadwechsel kam,
kann der Thread nach dem Sleep wieder 32 VM-Instruktionen ohne Unterbrechung durcharbeiten.
release; ist eine, dann wären es noch 31.
capture flag; wäre die zweite. data.x=65 zusammen
die dritte und vierte usw.
Kurz: Solange es zu keinem Threadwechsel zwischen dem release und capture kommen kann,
wird der zuerst gestartet Thread immer exklusiv laufen.
Jetzt gibt es in diesem Beispiel drei Möglichkeiten:
1. Du setzt die Prio beider Threads auf 1. (run 1;)
2. Du baust nach dem release; ein yield;, um an dieser Stelle
    gezielt die Rechenzeit vorzeitig abzugeben.
3. Du baust noch etwas Programmcode nach dem Release oder vor dem Capture ein, sodaÃ?
    dazwischen mindestens soviele VM-Instruktionen ausgeführt werden, wie es mit der Prio
    festgelegt ist. (Bei Standard-Prio wären das 32 VM-Instruktionen)

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:

Re: Capture und Release (von Peter - 29.09.2004 20:40)