picox  0.1
Xfifo_buffer

FIFOバイトバッファ [詳解]

Xfifo_buffer 連携図

データ構造

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バイトバッファ

関数詳解

static void xfifo_init ( XFifoBuffer self,
void *  buffer,
size_t  size,
XFifoAtomicAssigner  assigner 
)
inlinestatic

バッファを初期化します。

引数
bufferデータ格納先
sizebufferのバイト数
assigner内部RWポインタ書き換え関数
事前条件
  • buffer != NULL
  • sizeは2のべき乗であること。

assignerがNULLの場合はXFifoDefaultAtomicAssign()が使用されます。 bufferはこのオブジェクトが不要になるまで、ユーザー側が保持しておく必要があり ます。

覚え書き
[XFifoAtomicAssignerについて]

xfifo_bufferは主にデバイスドライバのバッファに使用することを想定しており、以 下の条件の時、割り込み禁止区間なしでバッファへの書き込み、読み出しが可能で す。

書き込み、読み出しのコンテキストが異なることが保証されていること

[例]

  • 通常時にバッファにデータを書き込み、UART送信完了割り込みで、バッファからデータを取り出す
  • 通常時にバッファからデータを読み出し、UART受信完了割り込みで、バッファにデータを書き込む

size_t型の変数は分割なしで代入できること

通常は16bitCPUで32bit変数に代入しようとすると、機械語レベルでは複数回の代入 命令を必要とします。その場合、割り込みが絡むとxfifo_bufferのRWポインタの整合 性が保証できなくなります。

上記条件が保証できない場合は、XFifoAtomicAssignerを指定し、その関数内で、割 り込みのロック、変数への代入、割り込みのアンロックを行ってください。

static size_t xfifo_read ( XFifoBuffer self,
void *  dst,
size_t  dsize 
)
inlinestatic

FIFO先頭から指定サイズのデータを読み込みを試みます。

引数
dst読み込み先
dsizedstに読み込むバイト数
戻り値
読み込めたバイト数

格納要素数がdsize以下だった場合は、格納要素数分だけ書き込みます。

static size_t xfifo_write ( XFifoBuffer self,
const void *  src,
size_t  ssize 
)
inlinestatic

FIFO末尾に指定サイズのデータの書き込みを試みます。

引数
src書き込むデータ
ssizesrcから取り出すバイト数
戻り値
書き込めたバイト数

空き容量がssize以下だった場合は、空き容量分だけ書き込みます。