# 内核数据结构

  内核中实现了常用的几种数据结构,这里是他们的api文档。

## kfifo先进先出缓冲区

  kfifo先进先出缓冲区定义于`common/kfifo.h`中。您可以使用它,创建指定大小的fifo缓冲区(最大大小为4GB)

### kfifo_alloc

`int kfifo_alloc(struct kfifo_t *fifo, uint32_t size, uint64_t reserved)`

#### 描述

  通过动态方式初始化kfifo缓冲队列。fifo缓冲区的buffer将由该函数进行申请。

#### 参数

**fifo**

  kfifo队列结构体的指针

**size**

  缓冲区大小(单位:bytes)

**reserved**

  当前字段保留,请将其置为0

#### 返回值

  当返回值为0时,表示正常初始化成功,否则返回对应的errno

### kfifo_init

`void kfifo_init(struct kfifo_t *fifo, void *buffer, uint32_t size)`

#### 描述

  使用指定的缓冲区来初始化kfifo缓冲队列

#### 参数

**fifo**

  kfifo队列结构体的指针

**buffer**

  缓冲区基地址指针

**size**

  缓冲区大小(单位:bytes)

### kfifo_free_alloc

`void kfifo_free_alloc(struct kfifo_t* fifo)`

#### 描述

  释放通过kfifo_alloc创建的fifo缓冲区. 请勿通过该函数释放其他方式创建的kfifo缓冲区。

#### 参数

**fifo**

  kfifo队列结构体的指针

### kfifo_in

`uint32_t kfifo_in(struct kfifo_t *fifo, const void *from, uint32_t size)`

#### 描述

  向kfifo缓冲区推入指定大小的数据。当队列中空间不足时,则不推入数据。

#### 参数

**fifo**

  kfifo队列结构体的指针

**from**

  源数据基地址指针

**size**

  数据大小(单位:bytes)

#### 返回值

  返回成功被推入的数据的大小。

### kfifo_out

`uint32_t kfifo_out(struct kfifo_t *fifo, void *to, uint32_t size)`

#### 描述

  从kfifo缓冲区取出数据,并从队列中删除数据。当队列中数据量不足时,则不取出。

#### 参数

**fifo**

  kfifo队列结构体的指针

**to**

  目标缓冲区基地址指针

**size**

  数据大小(单位:bytes)

#### 返回值

  返回成功被取出的数据的大小。

### kfifo_out_peek

`uint32_t kfifo_out_peek(struct kfifo_t *fifo, void *to, uint32_t size)`

#### 描述

  从kfifo缓冲区取出数据,但是不从队列中删除数据。当队列中数据量不足时,则不取出。

#### 参数

**fifo**

  kfifo队列结构体的指针

**to**

  目标缓冲区基地址指针

**size**

  数据大小(单位:bytes)

#### 返回值

  返回成功被取出的数据的大小。

### kfifo_reset

`kfifo_reset(fifo)`

#### 描述

  忽略kfifo队列中的所有内容,并把输入和输出偏移量都归零

#### 参数

**fifo**

  kfifo队列结构体的指针

### kfifo_reset_out

`kfifo_reset_out(fifo)`

#### 描述

  忽略kfifo队列中的所有内容,并将输入偏移量赋值给输出偏移量

#### 参数

**fifo**

  kfifo队列结构体的指针

### kfifo_total_size

`kfifo_total_size(fifo)`

#### 描述

  获取kfifo缓冲区的最大大小

#### 参数

**fifo**

  kfifo队列结构体的指针

#### 返回值

  缓冲区最大大小

### kfifo_size

`kfifo_size(fifo)`

#### 描述

  获取kfifo缓冲区当前已使用的大小

#### 参数

**fifo**

  kfifo队列结构体的指针

#### 返回值

  缓冲区当前已使用的大小

### kfifo_empty

`kfifo_empty(fifo)`

#### 描述

  判断kfifo缓冲区当前是否为空

#### 参数

**fifo**

  kfifo队列结构体的指针

#### 返回值

| 情况                      | 返回值 |
| ----------------------- | --- |
| 空 | 1   |
| 非空  | 0   |

### kfifo_full

`kfifo_full(fifo)`

#### 描述

  判断kfifo缓冲区当前是否为满

#### 参数

**fifo**

  kfifo队列结构体的指针

#### 返回值

| 情况  | 返回值 |
| ------| --- |
| 满 | 1   |
| 不满  | 0   |