Files
STM32F4-Base/App/util/ringbuf.c
2026-07-19 15:27:49 +08:00

165 lines
4.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 模块名称Ring Buffer
* 模块功能字节环形缓冲区实现head == tail 为空head + 1 == tail 为满
* 适用平台:通用嵌入式平台
* 作者:王建锋
* 创建日期2026-07-19
* 修改记录:
* v1.0 2026-07-19 王建锋 创建初始版本
*/
#include "ringbuf.h"
/*
* 函数功能:初始化环形缓冲区
* 入口参数rb - 缓冲区控制块指针
* pool - 存储池指针
* size - 存储池大小(字节)
* 返 回 值:无
* 限定条件rb 和 pool 均为非空指针
* 函数说明size 保留一个空位用于区分空/满状态
*/
void ringbuf_init(ringbuf_t *rb, uint8_t *pool, size_t size)
{
rb->buf = pool;
rb->size = size;
rb->head = 0;
rb->tail = 0;
}
/*
* 函数功能:写入数据到环形缓冲区
* 入口参数rb - 缓冲区控制块指针
* data - 源数据指针
* len - 待写入长度
* 返 回 值:实际写入字节数
* 限定条件rb 和 data 均为非空指针
* 函数说明:空间不足时写入能容纳的最大字节数
*/
size_t ringbuf_put(ringbuf_t *rb, const uint8_t *data, size_t len)
{
size_t cap = 0;
size_t n = 0;
size_t i = 0;
cap = rb->size - 1 - ringbuf_avail(rb);
n = (len < cap) ? len : cap;
for (i = 0; i < n; i++) {
rb->buf[rb->head] = data[i];
rb->head = (rb->head + 1) % rb->size;
}
return n;
}
/*
* 函数功能:从环形缓冲区读取数据
* 入口参数rb - 缓冲区控制块指针
* data - 目标数据指针
* len - 期望读取长度
* 返 回 值:实际读取字节数
* 限定条件rb 和 data 均为非空指针
* 函数说明:读取后数据从缓冲区移除
*/
size_t ringbuf_get(ringbuf_t *rb, uint8_t *data, size_t len)
{
size_t n = 0;
size_t i = 0;
n = ringbuf_avail(rb);
n = (n < len) ? n : len;
for (i = 0; i < n; i++) {
data[i] = rb->buf[rb->tail];
rb->tail = (rb->tail + 1) % rb->size;
}
return n;
}
/*
* 函数功能:预读取数据(不移除)
* 入口参数rb - 缓冲区控制块指针
* data - 目标数据指针
* len - 期望读取长度
* 返 回 值:实际可读取字节数
* 限定条件rb 和 data 均为非空指针
* 函数说明:与 ringbuf_get 的区别是不移动 tail 指针
*/
size_t ringbuf_peek(const ringbuf_t *rb, uint8_t *data, size_t len)
{
size_t n = 0;
size_t i = 0;
size_t idx = 0;
n = ringbuf_avail(rb);
n = (n < len) ? n : len;
for (i = 0; i < n; i++) {
idx = (rb->tail + i) % rb->size;
data[i] = rb->buf[idx];
}
return n;
}
/*
* 函数功能:获取缓冲区中有效数据长度
* 入口参数rb - 缓冲区控制块指针
* 返 回 值:有效数据字节数
* 限定条件rb 为非空指针
*/
size_t ringbuf_avail(const ringbuf_t *rb)
{
if (rb->head >= rb->tail) {
return rb->head - rb->tail;
}
return rb->size - rb->tail + rb->head;
}
/*
* 函数功能:获取缓冲区剩余空间
* 入口参数rb - 缓冲区控制块指针
* 返 回 值:剩余空间字节数(保留一个空位)
* 限定条件rb 为非空指针
*/
size_t ringbuf_space(const ringbuf_t *rb)
{
return rb->size - 1 - ringbuf_avail(rb);
}
/*
* 函数功能:判断缓冲区是否为空
* 入口参数rb - 缓冲区控制块指针
* 返 回 值1 - 空0 - 非空
* 限定条件rb 为非空指针
*/
int ringbuf_is_empty(const ringbuf_t *rb)
{
return (rb->head == rb->tail) ? 1 : 0;
}
/*
* 函数功能:判断缓冲区是否为满
* 入口参数rb - 缓冲区控制块指针
* 返 回 值1 - 满0 - 非满
* 限定条件rb 为非空指针
*/
int ringbuf_is_full(const ringbuf_t *rb)
{
return (ringbuf_avail(rb) == rb->size - 1) ? 1 : 0;
}
/*
* 函数功能:重置缓冲区
* 入口参数rb - 缓冲区控制块指针
* 返 回 值:无
* 限定条件rb 为非空指针
*/
void ringbuf_reset(ringbuf_t *rb)
{
rb->head = 0;
rb->tail = 0;
}