picox
0.1
|
FIFOバイトバッファ [詳解]
![]() |
データ構造 | |
struct | XFifoBuffer |
FIFOバイトバッファ管理構造体 [詳解] | |
マクロ定義 | |
#define | XFIFO__ADD_FIRST(x) ((self->first + x) & self->capacity) |
#define | XFIFO__ADD_LAST(x) ((self->last + x) & self->capacity) |
型定義 | |
typedef void(* | XFifoAtomicAssigner) (size_t *dst, size_t value) |
アトミックにsize_t変数に代入を行う関数ポインタ | |
関数 | |
static size_t | xfifo_capacity (const XFifoBuffer *self) |
最大格納要素数を返します。 | |
static void | xfifo_clear (XFifoBuffer *self) |
バッファを空にします。 | |
static void * | xfifo_data (const XFifoBuffer *self) |
要素を格納するバッファを返します。 | |
static bool | xfifo_empty (const XFifoBuffer *self) |
格納要素数が0かどうかを返します。 | |
static bool | xfifo_full (const XFifoBuffer *self) |
要素数が上限かどうかを返します。 | |
static void | xfifo_init (XFifoBuffer *self, void *buffer, size_t size, XFifoAtomicAssigner assigner) |
バッファを初期化します。 [詳解] | |
static uint8_t | xfifo_pop (XFifoBuffer *self) |
FIFO先頭から要素を取り出します。 | |
static void | xfifo_push (XFifoBuffer *self, uint8_t data) |
FIFO末尾に要素を追加します。 | |
static size_t | xfifo_read (XFifoBuffer *self, void *dst, size_t dsize) |
FIFO先頭から指定サイズのデータを読み込みを試みます。 [詳解] | |
static size_t | xfifo_reserve (const XFifoBuffer *self) |
空き要素数を返します。 | |
static size_t | xfifo_size (const XFifoBuffer *self) |
格納要素数を返します。 | |
static size_t | xfifo_write (XFifoBuffer *self, const void *src, size_t ssize) |
FIFO末尾に指定サイズのデータの書き込みを試みます。 [詳解] | |
static void | XFifoDefaultAtomicAssign (size_t *dst, size_t value) |
FIFOバイトバッファ
|
inlinestatic |
バッファを初期化します。
buffer | データ格納先 |
size | bufferのバイト数 |
assigner | 内部RWポインタ書き換え関数 |
assignerがNULLの場合はXFifoDefaultAtomicAssign()が使用されます。 bufferはこのオブジェクトが不要になるまで、ユーザー側が保持しておく必要があり ます。
xfifo_bufferは主にデバイスドライバのバッファに使用することを想定しており、以 下の条件の時、割り込み禁止区間なしでバッファへの書き込み、読み出しが可能で す。
書き込み、読み出しのコンテキストが異なることが保証されていること
[例]
size_t型の変数は分割なしで代入できること
通常は16bitCPUで32bit変数に代入しようとすると、機械語レベルでは複数回の代入 命令を必要とします。その場合、割り込みが絡むとxfifo_bufferのRWポインタの整合 性が保証できなくなります。
上記条件が保証できない場合は、XFifoAtomicAssignerを指定し、その関数内で、割 り込みのロック、変数への代入、割り込みのアンロックを行ってください。
|
inlinestatic |
FIFO先頭から指定サイズのデータを読み込みを試みます。
dst | 読み込み先 |
dsize | dstに読み込むバイト数 |
格納要素数がdsize以下だった場合は、格納要素数分だけ書き込みます。
|
inlinestatic |
FIFO末尾に指定サイズのデータの書き込みを試みます。
src | 書き込むデータ |
ssize | srcから取り出すバイト数 |
空き容量がssize以下だった場合は、空き容量分だけ書き込みます。