CAP.C2 V1.03 - Hilfe


Beschreibung

Einfügen als System-Modul

Funktionen:

init()
Capture()
Release()
Get()

Beispiele


Beschreibung   Nach oben

Das Modul cap.c2 ermöglich bis zu 16 weitere Captures, welche auch
verschachtelt angewendet werden können.
Welches der 16 Capture gesetzt oder gelöst werden soll, kann gezielt
mit einem übergebenen Parameter (0 bis 15) festgesetzt werden.

Einfügen als System-
Modul
   Nach oben

Die Datei cap.c2 in das Verzeichnis .\CControl2\Lib kopieren und in der Datei modules.txt
die Zeile cap.c2 einfügen.
Ein zusätzliches Ausrufezeichen unmittelbar nach einem Modulnamen in modules.txt bestimmt,
daß das Modul in jedem neuen Projekt von Anfang an aktiviert wird.
Außerdem muß die Datei capture.hex mit den nötigen Systemroutinen
mit dem Downloadtool in die C-Control II geladen werden.
Der Systemtreiber capture.hex belegt den Adressbereich 0xD100 bis 0xD199
in Segment 3 des Flash. (154 Byte)
Dieser Systemtreiber enthält außerdem die nötigen Systemroutinen für
die neue Capture-Funktion Modul i2c.c2 ab V1.2 .
Ab OSOPT V3.0 wird capture.hex nichtmehr benötigt, da diese Routinen
bereits in OSOPT_V3.0 implementiert sind.
In cap.c2 gibt es zwei Sätze von Einsprungadressen. Einmal für OSOPT V3.0 und
einmal für capture.hex . Die nicht benötigten Einsprungadressen werden einfach auskommentiert.


Funktionen:

init()   Nach oben

    function init()

Die Funktion init() initialisiert den internen RAM-Bereich, der für das Extra Capture
benötigt wird. Die Funktion muß am Anfang der Anwendung aufgerufen werden.
Mit dieser Funktion können auch gleichzeitig alle 16 Captures aufgehoben werden.

Capture()   Nach oben

    function Capture(byte flag_num) returns int

Mit Capture() wird ein Capture gesetzt. Es wird TRUE (-1) zurückgegeben, wenn
das Flag vorher noch nicht gesetzt war, andernfalls FALSE (0).
Diese Funktion sollte nur zusammen mit wait eingesetzt werden.

wait cap.Capture(0);
// ab hier: gecapturete Routinen
// ...


Es wird solange gewartet, bis das angegeben Flag frei ist und wird dann gesetzt.
Das Abfragen und setzen des Flags geschiet atomar. Somit kann dies nicht durch
einen Threadwechsel unterbrochen werden.

flag_num Nummer des Capture-Flags (0 bis 15)

 

Release()   Nach oben

    function Release(byte flag_num)

Die Funktion Release() löst ein Capture, das an das angegebene Flag gebunden ist.

flag_num Nummer des Capture-Flags (0 bis 15)



Get()
   Nach oben

    function Get(byte flag_num)

Mit Release() kann der Zustand eines Capture-Flags abgefragt werden, ohne dieses zu beeinflussen.

flag_num Nummer des Capture-Flags (0 bis 15)

 


Beispiele:

Einfaches Capture:

wait
cap.Capture(0);  //  Warten bis Capture 0 frei setzen von Capture 0
// ...
cap.Release(0);  //  Capture-Flag 0 freigeben


Verschachteltes Capture:

1.
wait
cap.Capture(0);
// ...
  wait cap.Capture(1);
  // ...
   wait cap.Capture(2);
   // ...
   cap.Release(2);  //  Capture-Flag 2 freigeben
   // ...
  cap.Release(1);  //  Capture-Flag 1 freigeben
// ...
cap.Release(0);  //  Capture-Flag 0 freigeben

2.
wait
cap.Capture(0);
// ...
wait cap.Capture(1);
// ...
cap.Release(0);  //  Capture-Flag 0 freigeben
// ...
wait cap.Capture(2);
// ...
cap.Release(1);  //  Capture-Flag 1 freigeben
// ...
cap.Release(2);  //  Capture-Flag 2 freigeben

Hier muß die Verwendung des Capture mit Bedacht vorgenommen werden, da
sich u.U. die Captures gegenseitig blockieren können.

3. Achtung !
wait
cap.Capture(0);
// ...
wait cap.Capture(0);
// ...
cap.Release(0);  //  Capture-Flag 0 freigeben

Wird, wie hier, vor einem wiederholten setzen des gleichen Captures
das Capture-Flag nicht freigegeben, so wartet der Thread beim 
zweiten Capture-Aufruf endlos, bis das Flag mit der Nr. 0 wieder freigegeben wurde.
Allerdings kann ein gesetztes Flag auch von einem anderem Thread mit der
Funktion Release() wieder freigegeben werden. (z.B. mit einem Timeout)
Auch mit einem Aufruf von init() werden alle Captures zurückgesetzt.


Autor: André Helbig   Mail: andre.h@cc2net.de    Erstellt: 01.01.2004