C 语言工业级通用组件手写 11:环形 FIFO 缓冲区
目录前言一、环形 FIFO 核心本质与应用场景1. 什么是环形缓冲区2. 解决的核心痛点3. 典型工业级落地场景二、核心实现原理1. 双指针循环机制2. 零拷贝读写3. 字节流式存储三、工业级设计规范1. 封装性设计2. 接口设计原则3. 鲁棒性要求4. 线程安全约束四、完整可复用源码1. 头文件 ring_fifo.h2. 实现文件 ring_fifo.c五、实战演示环形缓冲区读写示例六、工业级进阶优化方向1. 线程安全加锁封装2. 单次一字节读写接口3. peek 窥探接口4. 批量分段读写七、高频面试考点与易错坑点1. 经典面试问答2. 常见易错坑点总结前言在嵌入式串口接收、网络报文缓冲、音频数据流、传感器高频采集、异步数据收发场景中普通数组缓存存在溢出、覆盖、数据丢失、读写冲突等致命问题。普通数组无脑缓存必须手动判空、判满、移动数据代码臃肿、极易出错、无法高频运行。环形 FIFO循环缓冲区是工业流式数据缓存的标准解决方案。 本篇手写一套极简、零拷贝、全覆盖、读写分离、防溢出、可线程安全的工业级环形缓冲区源码干净、无冗余、可直接投产适配所有流式数据收发场景。一、环形 FIFO 核心本质与应用场景1. 什么是环形缓冲区环形 FIFO 是首尾相连的循环队列。依靠读指针(r)、写指针(w)实现循环读写无需数据搬迁、零拷贝、性能极致。核心特性先进先出、循环复用内存、无数据挪动、无内存碎片、读写高效。2. 解决的核心痛点解决数组缓存溢出覆盖满状态自动拦截写入杜绝数据丢失。解决数据搬迁耗时普通队列出队需要整体前移FIFO 零搬迁。解决高频数据流卡顿O (1) 读写百万级吞吐无压力。解决收发速率不匹配缓存削峰适配突发数据、高频采样。解决代码冗余混乱统一标准接口全局通用缓存组件。3. 典型工业级落地场景串口 / 485/CAN 接收缓存中断高速接收、主线程慢速解析。网络数据流缓冲TCP 流式分包、UDP 报文缓存。音视频采集音频帧、视频帧连续流式缓存。传感器高频采集高速 AD、姿态、雷达数据缓存。异步解耦架构生产快、消费慢场景削峰缓冲。二、核心实现原理1. 双指针循环机制write_ptr数据写入位置read_ptr数据读取位置缓冲区满(write 1) % size read缓冲区空write read预留一个空位区分空 / 满状态是工业最简、零 BUG 标准方案。2. 零拷贝读写读写直接操作数组指针不拷贝、不移动、不遍历性能拉满。3. 字节流式存储按字节缓存适配任意协议、任意报文、任意长度数据通用性最强。三、工业级设计规范1. 封装性设计FIFO 结构体完全封装缓存地址、读写指针、缓冲区大小。外部不可篡改内部状态保证读写闭环安全。2. 接口设计原则接口函数功能说明fifo_init初始化环形缓冲区fifo_write写入指定长度数据fifo_read读取指定长度数据fifo_available获取剩余可写空间fifo_used获取当前已缓存数据长度fifo_clear清空缓冲区3. 鲁棒性要求空指针校验、长度合法性校验。写满自动拒绝、读空自动返回。无越界、无覆盖、无数据错乱。纯 C 零依赖、裸机 / RTOS/Linux 全平台适配。4. 线程安全约束单生产单消费天然线程安全嵌入式中断写、主线程读标配。多生产多消费需外层加锁适配高并发场景。四、完整可复用源码1. 头文件 ring_fifo.h#ifndef RING_FIFO_H #define RING_FIFO_H #include stdint.h #include stddef.h #ifdef __cplusplus extern C { #endif /* 环形FIFO句柄 */ typedef struct { uint8_t *buf; size_t buf_size; size_t w_ptr; size_t r_ptr; } ring_fifo_t; /** * brief 初始化环形缓冲区 * param fifo FIFO句柄 * param buf 缓存数组地址 * param buf_size 缓存数组大小 */ void fifo_init(ring_fifo_t *fifo, uint8_t *buf, size_t buf_size); /** * brief 写入数据到FIFO * param fifo FIFO句柄 * param data 待写入数据 * param len 写入长度 * return 实际写入字节数 */ size_t fifo_write(ring_fifo_t *fifo, const uint8_t *data, size_t len); /** * brief 从FIFO读取数据 * param fifo FIFO句柄 * param data 接收缓存 * param len 读取长度 * return 实际读取字节数 */ size_t fifo_read(ring_fifo_t *fifo, uint8_t *data, size_t len); /** * brief 获取缓冲区剩余可写空间 */ size_t fifo_available(ring_fifo_t *fifo); /** * brief 获取缓冲区已存储数据长度 */ size_t fifo_used(ring_fifo_t *fifo); /** * brief 清空缓冲区 */ void fifo_clear(ring_fifo_t *fifo); #ifdef __cplusplus } #endif #endif2. 实现文件 ring_fifo.c#include ring_fifo.h #include string.h void fifo_init(ring_fifo_t *fifo, uint8_t *buf, size_t buf_size) { if (fifo NULL || buf NULL || buf_size 0) { return; } fifo-buf buf; fifo-buf_size buf_size; fifo-w_ptr 0; fifo-r_ptr 0; } size_t fifo_write(ring_fifo_t *fifo, const uint8_t *data, size_t len) { if (fifo NULL || data NULL || len 0) { return 0; } size_t avail fifo_available(fifo); if (avail 0) { return 0; } // 限制最大写入长度 len len avail ? avail : len; size_t size1 fifo-buf_size - fifo-w_ptr; if (size1 len) { memcpy(fifo-buf[fifo-w_ptr], data, len); } else { memcpy(fifo-buf[fifo-w_ptr], data, size1); memcpy(fifo-buf, data size1, len - size1); } fifo-w_ptr (fifo-w_ptr len) % fifo-buf_size; return len; } size_t fifo_read(ring_fifo_t *fifo, uint8_t *data, size_t len) { if (fifo NULL || data NULL || len 0) { return 0; } size_t used fifo_used(fifo); if (used 0) { return 0; } len len used ? used : len; size_t size1 fifo-buf_size - fifo-r_ptr; if (size1 len) { memcpy(data, fifo-buf[fifo-r_ptr], len); } else { memcpy(data, fifo-buf[fifo-r_ptr], size1); memcpy(data size1, fifo-buf, len - size1); } fifo-r_ptr (fifo-r_ptr len) % fifo-buf_size; return len; } size_t fifo_available(ring_fifo_t *fifo) { if (fifo NULL) { return 0; } // 预留1字节区分空满 return (fifo-buf_size - 1 fifo-r_ptr - fifo-w_ptr) % fifo-buf_size; } size_t fifo_used(ring_fifo_t *fifo) { if (fifo NULL) { return 0; } return (fifo-w_ptr fifo-buf_size - fifo-r_ptr) % fifo-buf_size; } void fifo_clear(ring_fifo_t *fifo) { if (fifo NULL) { return; } fifo-w_ptr 0; fifo-r_ptr 0; }五、实战演示环形缓冲区读写示例#include stdio.h #include ring_fifo.h #define FIFO_BUF_LEN 32 uint8_t fifo_buf[FIFO_BUF_LEN]; int main(void) { ring_fifo_t fifo; fifo_init(fifo, fifo_buf, FIFO_BUF_LEN); uint8_t w_data[] INDUSTRIAL_FIFO_11; uint8_t r_data[32] {0}; // 写入数据 size_t w_len fifo_write(fifo, w_data, sizeof(w_data)); printf(成功写入 %zu 字节\n, w_len); printf(当前已缓存%zu 字节\n, fifo_used(fifo)); // 读取数据 size_t r_len fifo_read(fifo, r_data, sizeof(r_data)); printf(成功读取 %zu 字节\n, r_len); printf(读取内容%s\n, r_data); return 0; }运行效果循环读写正常、边界无越界、缓冲区满自动截断、空读取直接返回零丢失、零错乱、零崩溃。六、工业级进阶优化方向1. 线程安全加锁封装搭配互斥锁支持多线程并发读写。2. 单次一字节读写接口适配串口中断单字节写入场景。3. peek 窥探接口只读不弹出适配协议头解析、预判断报文。4. 批量分段读写适配超大数据流高速吞吐。七、高频面试考点与易错坑点1. 经典面试问答Q1环形 FIFO 为什么要预留一个空位答解决空满状态歧义。读写指针相等既可以是空也可以是满预留一位可以完美区分是工业最简无 BUG 方案。Q2环形缓冲区相比普通数组的优势答无需数据搬迁、无溢出覆盖、循环复用内存、性能稳定、适配异步收发。Q3单中断写主线程读是否需要加锁答不需要。单生产单消费模式指针互不抢占天然线程安全是串口驱动标准写法。Q4FIFO 核心设计思想答以空间换时间、循环复用内存、解耦生产消费速率、零拷贝高效流转。2. 常见易错坑点不预留空位空满判断错乱读写指针不取模数组越界读取不判空、写入不判满导致数据异常频繁数据 memmove 挪动性能极差边界包裹读写处理错误尾部数据丢失总结环形 FIFO 缓冲区是嵌入式流式数据处理的第一组件。所有串口、网络、音频、采集工程100% 依赖环形缓存。本篇实现工业标准、边界全覆盖、零 BUG、可直接投产补齐整套组件库数据流转核心能力。创作不易如果对你有帮助欢迎点赞、收藏、转发。

相关新闻

变频器的技术应用:接线与基本参数设置

变频器的技术应用:接线与基本参数设置

部分参考自《变频器与步进/伺服驱动技术完全精通教程》 化学工业出版社 图源:部分引自《台达 VFD-M变频器 使用手册》,其余引自互联网。 学习笔记,记录一下新变频器到手后,需要进行的配置工作。 说起来,变频器属于传动…

2026/7/26 19:36:48 阅读更多 →
GameVault错误处理与调试:常见问题排查与系统稳定性保障

GameVault错误处理与调试:常见问题排查与系统稳定性保障

GameVault错误处理与调试:常见问题排查与系统稳定性保障 【免费下载链接】gamevault-app Frontend for the self-hosted gaming platform for drm-free games 项目地址: https://gitcode.com/gh_mirrors/ga/gamevault-app GameVault是一款开源的自托管游戏平…

2026/7/26 19:36:50 阅读更多 →
从SVG到原生:NGraphics矢量图形格式转换全攻略

从SVG到原生:NGraphics矢量图形格式转换全攻略

从SVG到原生:NGraphics矢量图形格式转换全攻略 【免费下载链接】NGraphics NGraphics is a cross platform library for rendering vector graphics on .NET. It provides a unified API for both immediate and retained mode graphics using high quality native …

2026/7/27 6:15:17 阅读更多 →

最新新闻

英雄联盟智能助手Seraphine:告别繁琐查询,3分钟掌握全队数据

英雄联盟智能助手Seraphine:告别繁琐查询,3分钟掌握全队数据

英雄联盟智能助手Seraphine:告别繁琐查询,3分钟掌握全队数据 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 还在为查询队友战绩而频繁切换网页吗?还在BP阶段因为不了解对手…

2026/7/27 8:03:46 阅读更多 →
optimizerDuck 系统优化

optimizerDuck 系统优化

repo:GitHub - itsfatduck/optimizerDuck: Free, open-source Windows optimization tool for performance, privacy, and simplicity. GitHub optimizerDuck 做什么 & 为什么重要 Windows 开箱即用,表现本就不错。但即便是全新安装的 Windows&…

2026/7/27 8:03:46 阅读更多 →
华为MetaERP 以同样的大卡车生产BOM和价格数据,用 Oracle EBS(R12) 的三种成本方法重新走一遍全链路。Oracle EBS 的成本管理逻辑与 SAP 核心思想相通,但模块名称、事

华为MetaERP 以同样的大卡车生产BOM和价格数据,用 Oracle EBS(R12) 的三种成本方法重新走一遍全链路。Oracle EBS 的成本管理逻辑与 SAP 核心思想相通,但模块名称、事

大卡车(成品)├── 车架总成(半成品)│ ├── 钢材(原材料)│ └── 焊接辅料(原材料)├── 发动机(外购件)├── 轮胎(外购件)└…

2026/7/27 8:03:46 阅读更多 →
AI Agent记忆系统:从金鱼脑到持续进化的智能体

AI Agent记忆系统:从金鱼脑到持续进化的智能体

1. AI Agent记忆系统概述:从金鱼脑到持续进化的智能体 在2023年大模型爆发式发展的背景下,一个关键问题逐渐浮出水面:为什么拥有千亿参数的LLM在实际应用中仍会表现出"金鱼脑"特性?我曾参与过一个电商客服机器人的项目&…

2026/7/27 8:03:46 阅读更多 →
WIN11下OpenClaw与DeepSeek大模型整合部署指南

WIN11下OpenClaw与DeepSeek大模型整合部署指南

1. 项目概述:WIN11环境下OpenClaw与DeepSeek的整合方案在Windows 11操作系统上部署OpenClaw并集成DeepSeek模型,是当前AI应用开发领域的一个实用组合。OpenClaw作为开源AI框架,以其模块化设计和易扩展性著称,而DeepSeek则是近期表…

2026/7/27 8:03:45 阅读更多 →
MiniMax Agent:全栈式AI智能代理的技术解析与应用

MiniMax Agent:全栈式AI智能代理的技术解析与应用

1. MiniMax Agent:重新定义智能生产力工具 作为一名长期关注AI技术发展的从业者,我见证了从简单聊天机器人到如今具备复杂任务处理能力的智能代理(Agent)的演进历程。MiniMax Agent的出现,标志着AI应用进入了一个全新阶…

2026/7/27 8:02:45 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/27 6:31:56 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻