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 Peter, http://members.fortunecity.de/obstsammelmaschine - 29.09.2004 20:40)
Als Antwort auf Re: Capture und Release von André H. - 19.09.2004 13:51
Ich nutze:
C-Control II Unit, CC2-Application-Board, OSOPT_V2
Hallo André!

Habe mittlerweile meinen Programmcode aufgeräumt.
Mit ist jetzt klar, dass ich bei vielen Standardmodulen kein zusätzliches capture und release einbauen
darf.

Das Programm funktioniert jetzt auch soweit.

Danke!

mfg

Peter Schmidthaler

> 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.
>

Meine Seite: http://members.fortunecity.de/obstsammelmaschine


    Antwort schreiben


Antworten: