环形缓冲区
2026/7/19大约 1 分钟基础知识库数据结构环形缓冲区ring_buff公共组件
环形缓冲区(Ring Buffer)
📚 概述
环形缓冲区(Ring Buffer)是 OneOS 提供的基础数据结构,位于 common/ring_buff.h 和 common/ring_buff.c。它被串口驱动、DMA 驱动、Shell 等多个模块使用,是实现高效数据缓冲的核心组件。
特点:
- 固定大小缓冲区,循环使用
- 读写指针独立,支持无锁场景
- 轻量级实现,适合嵌入式环境
核心数据结构
struct os_ring_buff
{
os_uint8_t *buffer_ptr; /* 缓冲区指针 */
os_uint16_t read_mirror; /* 读镜像标志 */
os_uint16_t read_index; /* 读指针 */
os_uint16_t write_mirror; /* 写镜像标志 */
os_uint16_t write_index; /* 写指针 */
os_int16_t buffer_size; /* 缓冲区大小 */
};API 接口
| 函数 | 说明 |
|---|---|
os_ring_buff_init() | 初始化环形缓冲区 |
os_ring_buff_reset() | 重置环形缓冲区(清空数据) |
os_ring_buff_write() | 向环形缓冲区写入数据 |
os_ring_buff_read() | 从环形缓冲区读取数据 |
os_ring_buff_force_write() | 强制写入(覆盖旧数据) |
os_ring_buff_get_size() | 获取缓冲区大小 |
os_ring_buff_data_len() | 获取当前数据长度 |
os_ring_buff_getc() | 读取一个字节 |
os_ring_buff_putc() | 写入一个字节 |
使用示例
#include <ring_buff.h>
#define BUFFER_SIZE 256
static os_uint8_t g_buffer[BUFFER_SIZE];
static struct os_ring_buff g_ring;
void ring_buff_example(void)
{
os_uint8_t write_data[] = "Hello Ring Buffer!";
os_uint8_t read_data[64];
/* 初始化 */
os_ring_buff_init(&g_ring, g_buffer, BUFFER_SIZE);
/* 写入数据 */
os_uint16_t written = os_ring_buff_write(&g_ring, write_data, sizeof(write_data));
os_kprintf("Written: %d bytes, data_len: %d\r\n",
written, os_ring_buff_data_len(&g_ring));
/* 读取数据 */
os_uint16_t read_len = os_ring_buff_read(&g_ring, read_data, sizeof(read_data));
read_data[read_len] = '\0';
os_kprintf("Read: %s\r\n", read_data);
/* 重置 */
os_ring_buff_reset(&g_ring);
os_kprintf("After reset, data_len: %d\r\n", os_ring_buff_data_len(&g_ring));
}