7.12. 循环BUF

Overview

提供循环BUF应用示例、常用相关 API 介绍和常见问题。

7.12.1. 应用示例

示例演示:

  • 循环buf使用方法

example: 进入 apps/demo/demo_DevKitBoard/include/demo_config.h ,开启宏 USE_CBUF_TEST_DEMO

Note

cbuf 具有如下特点:
  • 1.buf 空间大小固定;

  • 2.数据先进先出;

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

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

  • 5.无碎片产生问题;

7.12.2. 常见问题

  • cbuf通过用于什么场合?

    答:适合用于流形式的数据包, 并且任务间数据流读写动态平衡的场合

  • circular_buf.h 除了给出事例以外的接口如何使用?

    答:如果例子展示的接口不满足客户应用需求, 请联系杰理技术团体增加更完善的接口使用说明

7.12.3. API Reference

Functions

void cbuf_init(cbuffer_t *cbuffer, void *buf, u32 size)

适用范围:全局

cbuffer初始化

Parameters
  • cbuffer[in] cbuffer 句柄

  • buf[in] 缓存空间

  • size[in] 缓存总大小

u32 cbuf_read(cbuffer_t *cbuffer, void *buf, u32 len)

适用范围:cb_memcpy管理

把cbuffer_t结构体管理的内存空间的数据拷贝到buf数组

Parameters
  • cbuffer[in] cbuffer 句柄

  • buf[out] 指向用于存储读取内容的目标数组

  • len[in] 要读取的字节长度

Returns

成功读取的字节长度

u32 cbuf_write(cbuffer_t *cbuffer, void *buf, u32 len)

适用范围:cb_memcpy管理

把buf数组数据拷贝cbuffer_t结构体管理的内存空间

Parameters
  • cbuffer[in] cbuffer 句柄

  • buf[in] 指向用于存储写入内容的目标数组

  • len[in] 要写入的字节长度

Returns

成功写入的字节长度

u32 cbuf_is_write_able(cbuffer_t *cbuffer, u32 len)

适用范围:全局

判断是否可写入len字节长度的数据

Parameters
  • cbuffer[in] cbuffer 句柄

  • len[in] len字节长度的数据

Returns

返回可以写入的len字节长度

void *cbuf_write_alloc(cbuffer_t *cbuffer, u32 *len)

适用范围:外部内存管理

预分配待写入数据的空间,要和cbuf_write_updata()配套使用,更新cbuf管理handle数据。

Parameters
  • cbuffer[in] cbuffer句柄

  • len[in] 回传可以最多写入len字节长度的数据

Returns

当前写指针的地址

void cbuf_write_updata(cbuffer_t *cbuffer, u32 len)

适用范围:外部内存管理

更新cbuf管理handle的写指针位置和数据长度

Parameters
  • cbuffer[in] cbuffer句柄

  • len[in] 在非cbuffer_t结构体包含的内存空间中写入的数据的实际字节长度

Returns

当前写指针的地址

void *cbuf_read_alloc(cbuffer_t *cbuffer, u32 *len)

适用范围:外部内存管理

预分配待读取数据的空间,需要和cbuf_read_updata()配套使用,更新cbuf管理handle数据

Parameters
  • cbuffer[in] cbuffer 句柄

  • len[in] 回传可以最多读取len字节长度的数据

Returns

当前读指针的地址

void cbuf_read_updata(cbuffer_t *cbuffer, u32 len)

适用范围:外部内存管理

更新cbuf管理handle的读指针位置和数据长度

Parameters
  • cbuffer[in] cbuffer 句柄

  • len[in] 在非cbuffer_t结构体包含的内存空间中读取的数据的实际字节长度

void cbuf_clear(cbuffer_t *cbuffer)

适用范围:外部内存管理

清空cbuffer空间

Parameters

cbuffer[in] cbuffer 句柄

u32 cbuf_rewrite(cbuffer_t *cbuffer, void *begin, void *buf, u32 len)

适用范围:cb_memcpy管理。

指定位置进行数据重写

Parameters
  • cbuffer[in] cbuffer 句柄

  • begin[in] 指向需要重写内容的开始地址

  • buf[out] 指向用于存储重写内容的目标数组

  • len[in] 待重写内容的长度

Returns

成功重写的字节长度

void cbuf_discard_prewrite(cbuffer_t *cbuffer)

适用范围:cb_memcpy管理

更新指向上一次操作的指针为当前指针,并刷新数据长度

Parameters

cbuffer[in] cbuffer 句柄

void cbuf_updata_prewrite(cbuffer_t *cbuffer)

适用范围:cb_memcpy管理

操作指针回退到上一次的操作位置,并刷新数据长度

Parameters

cbuffer[in] cbuffer 句柄

u32 cbuf_prewrite(cbuffer_t *cbuffer, void *buf, u32 len)

适用范围:cb_memcpy管理

回退写入内容,从上一次的操作的指针处进行覆盖填充

Parameters
  • cbuffer[in] cbuffer 句柄

  • buf[out] 指向用于覆盖写入内容的目标数组

  • len[in] 填充数据的字节长度

Returns

成功填充数据的字节长度

void *cbuf_get_writeptr(cbuffer_t *cbuffer)

适用范围:全局

获取指向写指针的地址

Parameters

cbuffer[in] cbuffer 句柄

Returns

写指针的地址

u32 cbuf_get_data_size(cbuffer_t *cbuffer)

适用范围:全局

获取cbuffer存储的数据的字节长度

Parameters

cbuffer[in] cbuffer句柄

Returns

获取cbuffer存储的数据的字节长度

void *cbuf_get_readptr(cbuffer_t *cbuffer)

适用范围:全局

获取指向读指针的地址

Parameters

cbuffer[in] cbuffer句柄

Returns

读指针的地址

u32 cbuf_read_goback(cbuffer_t *cbuffer, u32 len)

适用范围:全局

读指针向后回退

Parameters
  • cbuffer[in] cbuffer 句柄

  • len[in] 要回退的字节长度

Returns

成功回退的字节长度

u32 cbuf_get_data_len(cbuffer_t *cbuffer)

适用范围:全局

获取存储数据的字节长度

Parameters

cbuffer[in] cbuffer 句柄

Returns

存储数据的字节长度

u32 cbuf_read_alloc_len(cbuffer_t *cbuffer, void *buf, u32 len)

适用范围:memcpy管理+cbuf_read_alloc系列管理函数

预分配待读取数据的空间,并把读取到的数据存入buf数组

Parameters
  • cbuffer[in] cbuffer 句柄

  • buf[out] 存储读取的数据的目标buf数组

  • len[in] 要读取的数据的字节长度

Returns

void cbuf_read_alloc_len_updata(cbuffer_t *cbuffer, u32 len)

适用范围:memcpy管理+cbuf_read_alloc系列管理函数

更新cbuf管理handle的读指针位置和数据长度

Parameters
  • cbuffer[in] cbuffer 句柄

  • len[in] 要更新的数据的字节长度

struct cbuffer_t
#include <circular_buf.h>

cbuffer头部信息

Public Members

u8 *begin

cbuffer内存开始地址指针

u8 *end

cbuffer内存结束地址指针

u8 *read_ptr

cbuffer当前读指针位置

u8 *write_ptr

cbuffer当前写指针位置

u8 *tmp_ptr

cbuffer当前暂存指针位置

u32 tmp_len

cbuffer当前暂存数据大小

u32 data_len

cbuffer当前可读数据大小

u32 total_len

cbuffer内存总大小

spinlock_t lock

cbuffer硬件锁