5.2.1. cbuf

circular_buf,循环buf,主要用于数据流的输入输出缓冲管理,具有如下特点:

  • buf 空间大小固定;

  • 数据先进先出;

  • buf 开始和结束头尾相连的,在写到 buf 结束会从 buf 开始位置继续写入,形成环形结构;

  • 数据可以多次写入一次读出或者一次写入多次读出;

  • 无碎片产生问题;

  • 适合用于数据流读写动态平衡的应用。

5.2.1.1. cbuf_init

  • 函数原型:

    void cbuf_init(cbuffer_t *cbuffer, void *buf, u32 size);
    
  • 功能说明:在使用 cbuf 前初始化;

  • 参数说明:

    参数

    说明

    cbuffer

    用于管理 cbuffer 的句柄指针

    buf

    需要管理的 buf 空间

    size

    需要管理的 buf 空间大小,单位 byte

  • 返回值:无

  • 示例:

    1cbuffer_t cbuf_hdl = {0};
    2int cbuf[512] = {0};
    3void cbuf_user_demo()
    4{
    5    cbuf_init(&cbuf_hdl, cbuf, sizeof(cbuf));
    6}
    

5.2.1.2. cbuf_write

  • 函数原型:

    u32 cbuf_write(cbuffer_t *cbuffer, void *buf, u32 size);
    
  • 功能说明:把 buf 里的数据写到 cbuf;

  • 参数说明:

    参数

    说明

    cbuffer

    用于管理 cbuffer 的句柄指针

    buf

    存放写入数据的 buf

    size

    需要写入数据的长度, 单位 byte

  • 返回值:

    u32

    实际写入的长度

  • 示例:

     1cbuffer_t cbuf_hdl = {0};
     2int cbuf[512] = {0};
     3void cbuf_user_demo()
     4{
     5    u8 wbuf[100];
     6    u32 ret = 0;
     7    cbuf_init(cbuf_hdl, cbuf, sizeof(cbuf));
     8    //cbuf 写入
     9    memset(wbuf, 0x5A, sizeof(wbuf));
    10    ret = cbuf_write(cbuf_hdl, wbuf, sizeof(wbuf));
    11    printf("cbuf_write ret = %d", ret);
    12}
    

5.2.1.3. cbuf_read

  • 函数原型:

    u32 cbuf_read(cbuffer_t *cbuffer, void *buf, u32 size);
    
  • 功能说明:读取 cbuf 里的数据到 buf;

  • 参数说明:

    参数

    说明

    cbuffer

    用于管理 cbuffer 的句柄指针

    buf

    存放读取数据的 buf

    size

    需要读取数据的长度, 单位 byte

  • 返回值:

    u32

    实际读取的长度

  • 示例:

     1cbuffer_t cbuf_hdl = {0};
     2int cbuf[512] = {0};
     3void cbuf_user_demo()
     4{
     5    u8 wbuf[100] = {0};
     6    u8 rbuf[100] = {0};
     7    u32 ret = 0;
     8    cbuf_init(cbuf_hdl, cbuf, sizeof(cbuf));
     9    //cbuf 写入
    10    memset(wbuf, 0x5A, sizeof(wbuf));
    11    ret = cbuf_write(cbuf_hdl, wbuf, sizeof(wbuf));
    12    printf("cbuf_write ret = %d", ret);
    13    if (ret > 0) {
    14        //cbuf 读出
    15        ret = cbuf_read(cbuf_hdl, rbuf, sizeof(rbuf));
    16        printf("cbuf_read ret = %d", ret);
    17    }
    18}
    

5.2.1.4. cbuf_is_write_able

  • 函数原型:

    u32 cbuf_is_write_able(cbuffer_t *cbuffer, u32 len);
    
  • 功能说明:判断 cbuf 是否可以写入长度为 len 的数据

  • 参数说明:

    参数

    说明

    cbuffer

    用于管理 cbuffer 的句柄指针

    len

    需要写入数据的长度, 单位 byte

  • 返回值:

    0

    cbuf 剩余长度小于 len;

    > 0

    cbuf 剩余长度大于 len;

  • 示例:

     1cbuffer_t cbuf_hdl = {0};
     2int cbuf[512] = {0};
     3void cbuf_user_demo()
     4{
     5    u8 wbuf[100] = {0};
     6    u8 rbuf[100] = {0};
     7    u32 ret = 0;
     8    cbuf_init(cbuf_hdl, cbuf, sizeof(cbuf));
     9    //cbuf 写入
    10
    11    cbuf_write(cbuf_hdl, wbuf, sizeof(wbuf));
    12    ret = cbuf_is_write_able(cbuf_hdl, sizeof(wbuf));
    13    printf("cbuf_is_write_able ret = %d", ret);
    14}
    

5.2.1.5. cbuf_write_alloc

  • 函数原型:

    void *cbuf_write_alloc(cbuffer_t *cbuffer, u32 *len);
    
  • 功能说明:从 cbuf 获取写入长度为 len 数据的 buf 指针

  • 参数说明:

    参数

    说明

    cbuffer

    用于管理 cbuffer 的句柄指针

    len

    需要写入数据的长度, 返回实际申请到的写入 buf 大小,单位 byte

  • 返回值:

    void *

    申请到需要写入数据的 buf 指针

  • 示例:

    1cbuffer_t cbuf_hdl = {0};
    2int cbuf[512] = {0};
    3void cbuf_user_demo()
    4{
    5    u32 ret = 0;
    6    u8 *wptr = NULL;
    7    cbuf_init(cbuf_hdl, cbuf, sizeof(cbuf));
    8    wptr = cbuf_write_alloc(cbuf_hdl, 100);
    9}
    

5.2.1.6. cbuf_write_updata

  • 函数原型:

    void cbuf_write_updata(cbuffer_t *cbuffer, u32 len);
    
  • 功能说明:更新 cbuf 写指针, 与 cbuf_write_alloc 匹配使用

  • 参数说明:

    参数

    说明

    cbuffer

    用于管理 cbuffer 的句柄指针

    len

    写入数据的长度,单位 byte

  • 返回值:无

  • 示例:

     1cbuffer_t cbuf_hdl = {0};
     2int cbuf[512] = {0};
     3void cbuf_user_demo()
     4{
     5    u32 ret = 0;
     6    u8 *wptr = NULL;
     7    cbuf_init(cbuf_hdl, cbuf, sizeof(cbuf));
     8    wptr = cbuf_write_alloc(cbuf_hdl, 100);
     9    //cbuf 写入
    10    memset(wptr, 0x5A, 100);
    11    cbuf_write_updata(cbuf_hdl, 100);
    12}
    

5.2.1.7. cbuf_read_alloc

  • 函数原型:

    void *cbuf_read_alloc(cbuffer_t *cbuffer, u32 *len);
    
  • 功能说明:从 cbuf 获取读取长度为 len 数据的 buf 指针

  • 参数说明:

    参数

    说明

    cbuffer

    用于管理 cbuffer 的句柄指针

    len

    需要读取数据的长度, 返回实际申请到的读取 buf 大小,单位 byte

  • 返回值:

    void *

    申请到需要读取数据的 buf 指针

  • 示例:

     1cbuffer_t cbuf_hdl = {0};
     2int cbuf[512] = {0};
     3void cbuf_user_demo()
     4{
     5    u8 wbuf[100] = {0};
     6    u32 ret = 0;
     7    u8 *rptr = NULL;
     8    cbuf_init(cbuf_hdl, cbuf, sizeof(cbuf));
     9    //cbuf 写入
    10    memset(wbuf, 0x5A, 100);
    11    cbuf_write(cbuf_hdl, wbuf, sizeof(wbuf));
    12    rptr = cbuf_read_alloc(cbuf_hdl, 100);
    13}
    

5.2.1.8. cbuf_read_updata

  • 函数原型:

    void cbuf_read_updata(cbuffer_t *cbuffer, u32 len);
    
  • 功能说明:更新 cbuf 读指针, 与 cbuf_read_alloc 匹配使用

  • 参数说明:

    参数

    说明

    cbuffer

    用于管理 cbuffer 的句柄指针

    len

    读取数据的长度,单位 byte

  • 返回值:无

  • 示例:

     1cbuffer_t cbuf_hdl = {0};
     2int cbuf[512] = {0};
     3void cbuf_user_demo()
     4{
     5    u8 wbuf[100] = {0};
     6    u32 ret = 0;
     7    u8 *rptr = NULL;
     8    cbuf_init(cbuf_hdl, cbuf, sizeof(cbuf));
     9    //cbuf 写入
    10    memset(wbuf, 0x5A, 100);
    11    cbuf_write(cbuf_hdl, wbuf, sizeof(wbuf));
    12    rptr = cbuf_read_alloc(cbuf_hdl, 100);
    13    cbuf_read_updata(cbuf_hdl, 100);
    14}
    

5.2.1.9. cbuf_clear

  • 函数原型:

    void cbuf_clear(cbuffer_t *cbuffer);
    
  • 功能说明:清除 cbuf 中所有数据

  • 参数说明:

    参数

    说明

    cbuffer

    用于管理 cbuffer 的句柄指针

  • 返回值:无

  • 示例:

     1cbuffer_t cbuf_hdl = {0};
     2
     3int cbuf[512] = {0};
     4void cbuf_user_demo()
     5{
     6    u8 wbuf[100];
     7    u32 ret = 0;
     8    cbuf_init(cbuf_hdl, cbuf, sizeof(cbuf));
     9    //cbuf 写入
    10    memset(wbuf, 0x5A, sizeof(wbuf));
    11    ret = cbuf_write(cbuf_hdl, wbuf, sizeof(wbuf));
    12    printf("cbuf_write ret = %d", ret);
    13    cbuf_clear(cbuf_hdl);
    14}
    

5.2.1.10. cbuf_rewrite

  • 函数原型:

    u32 cbuf_rewrite(cbuffer_t *cbuffer, void *begin, void *buf, u32 len);
    
  • 功能说明:重写 cbuf 中指定位置的数据

  • 参数说明:

    参数

    说明

    cbuffer

    用于管理 cbuffer 的句柄指针

    begin

    重写数据的 buf 地址

    buf

    写入buf数据

    len

    重写数据长度

  • 返回值:

    u32

    实际重写的数据大小

  • 示例:

     1cbuffer_t cbuf_hdl = {0};
     2int cbuf[512] = {0};
     3void cbuf_user_demo()
     4{
     5    u32 ret = 0;
     6    u8 wbuf[50] = {0};
     7    u8 *wptr = NULL;
     8    cbuf_init(cbuf_hdl, cbuf, sizeof(cbuf));
     9    wptr = cbuf_write_alloc(cbuf_hdl, 100);
    10    //cbuf 写入
    11    memset(wptr, 0x5A, 100);
    12    cbuf_write_updata(cbuf_hdl, 100);
    13    memset(wbuf, 0xA5, sizeof(wbuf));
    14    cbuf_rewrite(cbuf_hdl, wptr, wbuf,sizeof(wbuf))
    15}
    

5.2.1.11. cbuf_prewrite

  • 函数原型:

    void cbuf_updata_prewrite(cbuffer_t *cbuffer);
    
  • 功能说明:更新预写信息

  • 参数说明:

    参数

    说明

    cbuffer

    用于管理 cbuffer 的句柄指针

  • 返回值: 无

  • 示例:

    1
    

5.2.1.12. cbuf_updata_prewrite

  • 函数原型:

    u32 cbuf_prewrite(cbuffer_t *cbuffer, void *buf, u32 len);
    
  • 功能说明:把 buf 数据写入, 但是不更新写指针,预写

  • 参数说明:

    参数

    说明

    cbuffer

    用于管理 cbuffer 的句柄指针

    buf

    存放写入数据的 buf

    size

    需要写入数据的长度,单位 byte

  • 返回值:

    u32

    实际写入的数据大小

  • 示例:

     1cbuffer_t cbuf_hdl = {0};
     2int cbuf[512] = {0};
     3void cbuf_user_demo()
     4{
     5    u8 wbuf[100];
     6    u32 ret = 0;
     7    cbuf_init(cbuf_hdl, cbuf, sizeof(cbuf));
     8    //cbuf 写入
     9    memset(wbuf, 0x5A, sizeof(wbuf));
    10    ret = cbuf_prewrite(cbuf_hdl, wbuf, sizeof(wbuf));
    11    printf("cbuf_write ret = %d", ret);
    12    cbuf_updata_prewrite(cbuf_hdl);
    13}
    

5.2.1.13. cbuf_discard_prewrite

  • 函数原型:

    void cbuf_discard_prewrite(cbuffer_t *cbuffer);
    
  • 功能说明:取消预写信息

  • 参数说明:

    参数

    说明

    cbuffer

    用于管理 cbuffer 的句柄指针

  • 返回值:无

  • 示例:

     1cbuffer_t cbuf_hdl = {0};
     2int cbuf[512] = {0};
     3void cbuf_user_demo()
     4{
     5    u8 wbuf[100];
     6    u32 ret = 0;
     7    cbuf_init(cbuf_hdl, cbuf, sizeof(cbuf));
     8    //cbuf 写入
     9    memset(wbuf, 0x5A, sizeof(wbuf));
    10    ret = cbuf_prewrite(cbuf_hdl, wbuf, sizeof(wbuf));
    11    printf("cbuf_write ret = %d", ret);
    12    cbuf_discard_prewrite(cbuf_hdl);
    13}
    

5.2.1.14. cbuf_get_writeptr

  • 函数原型:

    void *cbuf_get_writeptr(cbuffer_t *cbuffer);
    
  • 功能说明:获取 cbuf 写指针

  • 参数说明:

    参数

    说明

    cbuffer

    用于管理 cbuffer 的句柄指针

  • 返回值:

    参数

    说明

    void *

    当前 cbuf 写指针

  • 示例:

     1cbuffer_t cbuf_hdl = {0};
     2int cbuf[512] = {0};
     3void cbuf_user_demo()
     4{
     5    u8 wbuf[100];
     6    u32 ret = 0;
     7    u8 *wptr = NULL;
     8    cbuf_init(cbuf_hdl, cbuf, sizeof(cbuf));
     9    //cbuf 写入
    10    memset(wbuf, 0x5A, sizeof(wbuf));
    11    ret = cbuf_write(cbuf_hdl, wbuf, sizeof(wbuf));
    12    printf("cbuf_write ret = %d", ret);
    13    wptr = cbuf_get_writeptr(cbuf_hdl)
    14}
    

5.2.1.15. cbuf_get_readptr

  • 函数原型:

    void *cbuf_get_readptr(cbuffer_t *cbuffer);
    
  • 功能说明:获取 cbuf 读指针

  • 参数说明:

    参数

    说明

    cbuffer

    用于管理 cbuffer 的句柄指针

  • 返回值:

    参数

    说明

    void *

    当前 cbuf 读指针

  • 示例:

     1cbuffer_t cbuf_hdl = {0};
     2int cbuf[512] = {0};
     3void cbuf_user_demo()
     4{
     5    u8 wbuf[100];
     6    u32 ret = 0;
     7    u8 *rptr = NULL;
     8    cbuf_init(cbuf_hdl, cbuf, sizeof(cbuf));
     9    //cbuf 写入
    10    memset(wbuf, 0x5A, sizeof(wbuf));
    11    ret = cbuf_write(cbuf_hdl, wbuf, sizeof(wbuf));
    12    printf("cbuf_write ret = %d", ret);
    13    rptr = cbuf_get_readptr(cbuf_hdl)
    14}
    

5.2.1.16. cbuf_get_data_size

  • 函数原型:

    u32 cbuf_get_data_size(cbuffer_t *cbuffer)
    
  • 功能说明:获取 cbuf 读指针

  • 参数说明:

    参数

    说明

    cbuffer

    用于管理 cbuffer 的句柄指针

  • 返回值:

    参数

    说明

    u32

    获取 cbuf 中可读数据长度

  • 示例:

     1cbuffer_t cbuf_hdl = {0};
     2int cbuf[512] = {0};
     3void cbuf_user_demo()
     4{
     5    u8 wbuf[100];
     6    u32 ret = 0;
     7    u8 *rptr = NULL;
     8    cbuf_init(cbuf_hdl, cbuf, sizeof(cbuf));
     9    //cbuf 写入
    10    memset(wbuf, 0x5A, sizeof(wbuf));
    11    ret = cbuf_write(cbuf_hdl, wbuf, sizeof(wbuf));
    12    printf("cbuf_write ret = %d", ret);
    13    ret = cbuf_get_data_size(cbuf_hdl);
    14    printf("cbuf data size = %d", ret);
    15}