Funktionen:
init()
Capture()
Release()
Get()
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) |
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