STM32F407学习记录(四)环形缓冲区
📅 2026/7/13 14:06:08
👁️ 次浏览
本质上是一个首尾相连的固定大小数组。它通过两个指针读指针Head和写指针Tail在数组内循环移动实现对数据的顺序存取。缓冲区实现包含4要素typedef struct { uint8_t *buffer; // 指向存储区的指针 uint32_t head; // 读指针指向下一个要被读出的数据 uint32_t tail; // 写指针指向下一个要存入的位置 uint32_t size; // 缓冲区总大小为了效率通常设为 2 的幂 } ring_buffer_t;写操作逻辑就是往ring_buffer数组中tail所指向位置写入一个数据然后tail移动至下一个需要写入的位置。例如往环形缓冲区中写入2、0、2、6四个数据那么环形缓冲区中的数据如下现在往里面继续写3个数据图1这时候发现tail已经来到了buffer的最后一个位置如果再往里面写一个数据tail应该回到开头也就是现在head所在的地方但这时候会发现headtail和一开始缓冲区为空的时候一致。所以一般情况下当tai如图1所示判断缓冲区满就不继续往缓冲区写入了注意根据应用场景你也可以继续写入进行覆盖。读操作逻辑就是从head所指示的位置读取数据然后将head移动至下一个可以读的位置。例如读取4个数据2、0、2、6。此时head指向数据0的位置。现在继续读取3个数据此时发现所有数据都读到了并且headtail也就是说缓冲区为空。当继续往这个缓冲区写数据时tail就会跳回到缓冲区开头。读操作同理。至此形成了一个环形的缓冲区。“空/满”判断判空head tail判满取模(tail 1) % size head注意取模操作比较费时如果对速度有要求可以将缓存区的大小设置为2的幂次方例如32、64、256。这样判断满的表达式可以改为(tail 1) (size - 1) head附C代码ringBuffer.c#include ./SYSTEM/ringBuffer/ringBuffer.h // 初始化 void ring_buffer_init(ring_buffer_t *rb, uint8_t *buffer, uint32_t size) { rb-buffer buffer; rb-head 0; rb-tail 0; rb-size size; // 注意size 必须是 2 的幂例如 64 } // 写入一个字节 uint8_t ring_buffer_push(ring_buffer_t *rb, uint8_t data) { uint32_t next_tail (rb-tail 1) (rb-size - 1); // 如果满了丢弃新数据防覆盖策略 if (next_tail rb-head) { return 0; // 写入失败 } rb-buffer[rb-tail] data; rb-tail next_tail; return 1; // 写入成功 } // 读取一个字节 uint8_t ring_buffer_pop(ring_buffer_t *rb, uint8_t *data) { if (rb-head rb-tail) { return 0; // 缓冲区为空 } *data rb-buffer[rb-head]; rb-head (rb-head 1) (rb-size - 1); return 1; // 读取成功 } // 查询当前待读数据长度方便主循环判断是否有包需要处理 uint32_t ring_buffer_available(ring_buffer_t *rb) { if (rb-tail rb-head) { return rb-tail - rb-head; } else { return rb-size - rb-head rb-tail; } }ringBuffer.h#ifndef __RINGBUFFER_H #define __RINGBUFFER_H typedef struct { uint8_t *buffer; // 指向存储区的指针 uint32_t head; // 读指针指向下一个要被读出的数据 uint32_t tail; // 写指针指向下一个要存入的位置 uint32_t size; // 缓冲区总大小为了效率通常设为 2 的幂 } ring_buffer_t; void ring_buffer_init(ring_buffer_t *rb, uint8_t *buffer, uint32_t size); uint8_t ring_buffer_push(ring_buffer_t *rb, uint8_t data); uint8_t ring_buffer_pop(ring_buffer_t *rb, uint8_t *data); uint32_t ring_buffer_available(ring_buffer_t *rb); #endif主函数调用工程基于正点原子串口收发实验#include ./SYSTEM/sys/sys.h #include ./SYSTEM/usart/usart.h #include ./SYSTEM/delay/delay.h #include ./SYSTEM/ringBuffer/ringBuffer.h #include ./SYSTEM/malloc/malloc.h ring_buffer_t rb; /* 定义环形缓冲区 */ int main(void) { sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */ delay_init(168); /* 延时初始化 */ usart_init(84, 115200); /* 串口初始化为115200 */ my_mem_init(SRAMIN); /* 内存池初始化 */ uint8_t *rx_buff mymalloc(SRAMIN, 64);/* 向内存池申请一段内存作为循环缓冲区共64字节 */ ring_buffer_init(rb, rx_buff, 64); /* 初始化环形缓冲区 */ while (1) { uint8_t data; while(ring_buffer_pop(rb, data)) { USART1-DR data; while ((USART1-SR 0X40) 0); /* 等待发送结束 */ printf(\r\n); /* 插入换行 */ } delay_ms(10); } } /** * brief 串口X中断服务函数 * param 无 * retval 无 */ void USART1_IRQHandler(void) { uint8_t rxdata; if (USART1-SR (1 5)) /* 接收到数据 */ { rxdata USART1-DR; ring_buffer_push(rb, rxdata); } }实验效果附工程链接通过网盘分享的文件串口收发之环形缓冲区.zip链接: https://pan.baidu.com/s/1ZBIpqIIOy4G-93C6t0NIJA?pwdwy6r 提取码: wy6r
我们总被要求快一点,却不知一路的繁花似锦,才是人间最美的华章。每日一言(1/1)一切真实与虚假,一切辉煌与破灭,只存后人之言,只存岁月之中。引言:被速度裹挟的时代我们生活在一个被“快”字定义…
📅 2026/7/13 14:06:08
摘要
随着全球能源转型加速,新能源汽车产业成为技术竞争的主战场。本文系统梳理新能源汽车研发测试的核心能力建设现状,聚焦“三电系统”、智能网联等关键技术,结合行业政策、市场规模及典型案例,解析测试设备发展趋势与未来挑战,为从业者提供全面参考。
关键词:新能源…
📅 2026/7/13 14:06:08
1. Imagerouter.io项目解析:免费图像生成API的实战指南在AI图像生成领域,开发者常面临模型选择困难、API调用复杂和成本控制三大痛点。Imagerouter.io的出现恰好提供了一个统一的解决方案——它作为AI模型代理层,聚合了多种图像生成服务的API…
📅 2026/7/13 14:05:07
如何为Mistral-7B-Instruct-v0.3_rai_1.7.1_npu_4K创建自定义聊天模板:终极指南 🚀 【免费下载链接】Mistral-7B-Instruct-v0.3_rai_1.7.1_npu_4K 项目地址: https://ai.gitcode.com/hf_mirrors/amd/Mistral-7B-Instruct-v0.3_rai_1.7.1_npu_4K
…
📅 2026/7/13 15:06:33
Qwen2.5-VL-7B-Instruct-w4a16-tao-symgroup-torchao-v0.17.0 vs 原版模型:W4A16量化技术如何实现效率与精度的完美平衡? 【免费下载链接】Qwen2.5-VL-7B-Instruct-w4a16-tao-symgroup-torchao-v0.17.0 项目地址: https://ai.gitcode.com/hf_mirrors/…
📅 2026/7/13 15:06:33
Phi-3.5-mini-instruct_rai_1.7.1_npu_16K与传统模型对比:为何16K上下文长度是NPU推理的游戏规则改变者 【免费下载链接】Phi-3.5-mini-instruct_rai_1.7.1_npu_16K 项目地址: https://ai.gitcode.com/hf_mirrors/amd/Phi-3.5-mini-instruct_rai_1.7.1_npu_16K …
📅 2026/7/13 15:06:33
这两年,越来越多深圳地区的跨境语言培训机构开始关注 GEO。原因很简单。过去学员找语言培训机构、找外语提升课程,主要靠搜索引擎、短视频平台、社交平台种草和熟人推荐;现在越来越多深圳本地学员、外贸从业者、跨境电商团队、留学准备人群和…
📅 2026/7/13 15:06:33
WireMock查询参数匹配实战:3种高效技巧让API测试更精准 【免费下载链接】wiremock A tool for mocking HTTP services 项目地址: https://gitcode.com/gh_mirrors/wi/wiremock
在微服务架构和API驱动的现代开发中,精确模拟HTTP服务的行为已成为提…
📅 2026/7/13 15:06:33
AMD ZenDNN TorchAO v0.17.0:Llama-3.3-70B-Instruct量化模型性能对比分析 【免费下载链接】Llama-3.3-70B-Instruct-da8w8-torchao-v0.17.0 项目地址: https://ai.gitcode.com/hf_mirrors/amd/Llama-3.3-70B-Instruct-da8w8-torchao-v0.17.0
Llama-3.3-70…
📅 2026/7/13 15:05:32
做技术的人都知道,环境配置是最让人头秃的环节。特别是当你面对一个相对小众或者刚起步的项目时,文档可能不全,社区可能冷清。这时候,找到靠谱的来源就显得尤为重要。今天咱们不聊虚的,就聊聊怎么稳妥地完成 openclaw安装官方 流程,顺便分享几个我踩过的坑,希望能帮你省…
📅 2026/7/13 0:01:22
1. 项目概述:当火焰特效成为帧率杀手在UE5项目里,尤其是那些追求电影级视觉的开放世界或者大场景战斗游戏,一个熊熊燃烧的篝火、一次震撼的爆炸,往往是点燃玩家情绪的关键。Niagara作为虚幻引擎5中取代了老旧的Cascade的下一代粒子…
📅 2026/7/13 0:01:52
1. 项目概述与核心价值 最近在对接抖音小游戏平台时,侧边栏复访功能成了一个绕不开的“必答题”。很多开发者朋友,包括我自己一开始,都对这个功能有点摸不着头脑:它到底是什么?为什么平台这么重视?不接入行…
📅 2026/7/13 0:01:52
豆包openclaw最近圈子里都在聊豆包openclaw,我也没忍住,掏腰包入手了一套。说实话,刚拿到手的时候,心里是打鼓的。毕竟市面上类似的智能硬件太多了,有的吹得天花乱坠,用起来却是一堆bug。为了不让大家的钱打水漂,我连续用了半个月。从开箱到日常高频使用,甚至故意测试它…
📅 2026/7/13 5:30:27
SQLyog 13.3.1 社区版在Windows 10/11上的完整安装与连接指南 对于刚接触MySQL数据库管理的开发者和学生来说,选择一个直观易用的图形化管理工具至关重要。SQLyog作为一款轻量级但功能强大的MySQL GUI工具,能够显著提升数据库操作的效率和体验。本文将详…
📅 2026/7/13 6:21:22
SPEC CPU 2006 跨平台基准测试深度实战:ARM/X86/MIPS 架构配置优化与结果分析方法论在当今多元化的计算架构时代,如何客观评估不同处理器平台的真实性能成为系统工程师和性能优化专家的核心挑战。SPEC CPU 2006 作为业界公认的计算密集型基准测试套件&am…
📅 2026/7/13 7:10:30
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/13 3:29:47
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/12 15:39:57
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/13 9:07:16