SYNOPSIS
#include <hal.h>
int hal_stream_create(hal_stream_t* stream, int comp_id, int key, int depth, const char* typestring);
void hal_stream_destroy(hal_stream_t* stream);
int hal_stream_attach(hal_stream_t* stream, int comp_id, int key, const char* typestring);
int hal_stream_detach(hal_stream_t* stream);
int hal_stream_element_count(hal_stream_t* stream);
hal_type_t hal_stream_element_type(hal_stream_t* stream, int idx);
int hal_stream_depth(hal_stream_t* stream);
int hal_stream_maxdepth(hal_stream_t* stream);
int hal_stream_num_underruns(hal_stream_t* stream);
int hal_stream_num_overruns(hal_stream_t* stream);
int hal_stream_read(hal_stream_t* stream, hal_stream_data_u *buf, unsigned* sampleno);
bool hal_stream_readable(hal_stream_t* stream);
int hal_stream_write(hal_stream_t* stream, hal_stream_data_u *buf);
bool hal_stream_writable(hal_stream_t* stream);
#ifdef ULAPI
void hal_stream_wait_writable(hal_stream_t* stream, sig_atomic_t* stop);
void hal_stream_wait_readable(hal_stream_t* stream, sig_atomic_t* stop);
#endif
BESCHREIBUNG
Ein HAL-Stream bietet eine begrenzte Möglichkeit für zwei Komponenten, Daten zu übermitteln, die nicht in das Modell der HAL-Pins passen. Ein Leser und ein Schreiber müssen sich auf einen key (32-Bit-Integer-Identifikator) und eine durch typestring spezifizierte Datenstruktur einigen. Sie müssen auch vereinbaren, welche Komponente (die zuerst geladene) den Stream hal_stream_create und welche Komponente (die zweite geladene) den bereits erzeugten Stream hal_stream_attach.
Der Nicht-Echtzeit-Teil kann halstreamer oder halsampler sein. Im Fall von halstreamer ist der Schlüssel 0x48535430 plus die Kanalnummer. Im Falle von halsampler ist der Schlüssel 0x48534130 plus die Kanalnummer.
- hal_stream_create
-
Erzeugt den angegebenen Stream, wobei der stream, der als Referenz übergeben wird, initialisiert wird. Es ist ein nicht diagnostizierter Fehler, wenn bereits ein Stream mit demselben key erstellt wurde.
- hal_stream_destroy
-
Zerstört den angegebenen Stream. Es ist ein nicht diagnostizierter Fehler, wenn der Stream noch von einer anderen Komponente angehängt ist. Es ist ein nicht diagnostizierter Fehler, wenn der Stream mit hal_stream_attach angehängt wurde und nicht mit hal_stream_create erzeugt wurde. Es ist ein nicht diagnostizierter Fehler, wenn der Aufruf von hal_stream_destroy ausgelassen wird.
- hal_stream_attach
-
Hängt den angegebenen Stream an, der bereits mit hal_stream_create erstellt wurde. Wenn der Typestring angegeben ist, schlägt dieser Aufruf fehl, wenn er nicht mit dem Typestring übereinstimmt, mit dem der Stream erstellt wurde. Wenn das Argument typestring NULL ist, wird ein beliebiger typestring akzeptiert.
- hal_stream_detach
-
Löscht den angegebenen Stream. Es ist ein nicht diagnostizierter Fehler, wenn der Stream mit hal_stream_create erzeugt und nicht mit hal_stream_attach angehängt wurde. Es ist ein nicht diagnostizierter Fehler, wenn der Aufruf von hal_stream_detach ausgelassen wird.
- hal_stream_element_count
-
Gibt die Anzahl der Pins zurück.
- hal_stream_element_type
-
Gibt den Typ der angegebenen Pin-Nummer zurück.
- hal_stream_readable
-
Gibt true zurück, wenn der Stream mindestens einen Sample zum Lesen hat
- hal_stream_read
-
Wenn der Stream ein Sample zum Lesen hat, speichert der diesen in buf.
- hal_stream_writable
-
Gibt „true“ zurück, wenn der Stream Platz für mindestens einen zu schreibenden Sample hat.
- hal_stream_depth
-
Gibt die Anzahl der Messwerten (engl. samples) zurück, die darauf warten, gelesen zu werden.
- hal_stream_maxdepth
-
Gibt das Argument depth (engl. für Tiefe) zurück, mit dem der Stream erstellt wurde.
- hal_stream_num_overruns
-
Gibt eine Zahl zurück, die jedes Mal erhöht wird, wenn hal_stream_write aufgerufen wird und kein Speicherplatz verfügbar ist.
- hal_stream_num_underruns
-
Gibt eine Zahl zurück, die jedes Mal erhöht wird, wenn hal_stream_read aufgerufen wird, ohne dass ein Sample verfügbar ist.
- hal_stream_wait_readable
-
Wartet, bis der Stream lesbar ist oder das Stop-Flag gesetzt wird.
- hal_stream_wait_writable
-
Wartet, bis der Stream beschreibbar ist oder das Stop-Flag gesetzt wird.
- hal_stream_read
-
Liest einen Datensatz aus dem Stream. Bei Erfolg wird es im angegebenen Puffer gespeichert. Optional kann die Probennummer abgefragt werden. Wenn kein Sample verfügbar ist, wird num_underruns inkrementiert. Es ist ein unerkannter Fehler, wenn mehr als eine Komponente oder Echtzeitfunktion hal_stream_read gleichzeitig aufruft.
- hal_stream_write
-
Schreibt einen Datensatz in den Stream. Wenn erfolgreich, kopiert es von den gegebenen Puffer. Wenn kein Platz verfügbar ist, wird num_overruns erhöht. In jedem Fall wird der Wert der internen sampleno (Proben-Nummer) erhöht. Es wird nicht erkannt, wenn mehr als eine Komponente bzw. Echtzeit-Funktion hal_stream_write zur Gleichen Zeit aufruft.
ARGUMENTE
- stream
-
Ein Zeiger auf ein Stream-Objekt. Im Fall von hal_stream_create und hal_stream_attach ist dies ein nicht initialisierter Stream; in anderen Fällen muss es sich um einen Stream handeln, der durch einen früheren Aufruf erzeugt oder angehängt und noch nicht abgetrennt oder zerstört wurde.
- hal_id
-
Eine HAL-Komponenten-Kennung, die durch einen früheren Aufruf von hal_init zurückgegeben wurde.
- key
-
Der Schlüssel (engl. key) für das gemeinsame Speichersegment.
- depth
-
Die Anzahl der Samples, die ungelesen werden können, bevor Samples verloren gehen (Überlauf, engl. Overrun)
- typestring
-
A typestring is limited to 20 characters. A typestring is a case-insensitive string which consists of one or more of the following type characters:
-
B for bool / hal_bit_t
-
S for rtapi_s32 / hal_s32_t
-
U for rtapi_u32 / hal_u32_t
-
F for real_t / hal_float_t
-
L for rtapi_s64 / hal_s64_t
-
K for rtapi_u64 / hal_u64_t
-
- buf
-
Ein Puffer, der groß genug ist, um alle Daten einer Probe aufzunehmen.
- sampleno
-
Falls nicht NULL, wird hier die letzte Probennummer gespeichert. Lücken in dieser Sequenz zeigen an, dass ein Überlauf zwischen dem vorherigen und diesem Lesevorgang stattgefunden hat. Kann NULL sein, in diesem Fall wird die Stichprobennummer nicht abgerufen.
- stop
-
Ein Zeiger auf einen Wert, der während des Wartens überwacht wird. Ist er ungleich Null, kehrt der Wartevorgang vorzeitig zurück. Dadurch kann ein Warteaufruf im Falle eines Signals sicher beendet werden.
SAMPLE CODE
Im Quellbaum unter src/hal/components sind sampler.c und streamer.c Echtzeitkomponenten, die HAL-Streams lesen und schreiben.
REALTIME CONSIDERATIONS
hal_stream_read, hal_stream_readable, hal_stream_write, hal_stream_writable, hal_stream_element_count, hal_tream_pin_type, hal_stream_depth, hal_stream_maxdepth, hal_stream_num_underruns, hal_stream_number_overruns may be called from realtime code.
hal_stream_wait_writable, hal_stream_wait_writable may be called from ULAPI code.
Andere Funktionen können in jedem Kontext, auch in Echtzeit, aufgerufen werden.
RETURN VALUE
hal_stream_create, hal_stream_attach, hal_stream_read, hal_stream_write, *hal_stream_detach und hal_stream_destroy geben einen RTAPI-Statuscode zurück. Die Rückgabewerte der anderen Funktionen werden oben erläutert.
BUGS
Der Speicher-Overhead eines Streams kann sehr groß sein. Jedes Element in einem Datensatz belegt 8 Byte, und die implizite Stichprobennummer belegt ebenfalls 8 Byte. Ein Datenstrom, der für den Transport von 8-Bit-Werten verwendet wird, verbraucht daher 94 % seines Speichers als Overhead. Bei bescheidenen Streamgrößen ist dieser Overhead jedoch nicht von Bedeutung. (Dieser Speicher ist Teil eines eigenen gemeinsamen Speicherbereichs und wird nicht auf den gemeinsamen HAL-Speicherbereich angerechnet, der für Pins, Parameter und Signale verwendet wird.)
SIEHE AUCH
sampler(9), streamer(9), halsampler(1), halstreamer(1)