单片机常用环形队列--ringbuff
简介
由于数据接收存在的断帧,又由于要保证数据的完整性,所以使用环形队列对数据的管理应运而生。其次用在时效性高,效率高(需定时获取数据)的场合也非常适用。
代码示例如下
一下示例的环形队列使用堆内存来实现。
头文件 *.h
#ifndef __RING_BUFFER_H
#define __RING_BUFFER_H#include "stm32f1xx_hal.h"extern void RingBuffer_Init(void);
extern int RingBuffer_Write(uint8_t *buffer, uint32_t len);
extern int RingBuffer_Read(uint8_t *buffer, uint32_t len);
extern uint32_t RingBuffer_GetValidLen(void);
extern void RingBuffer_Release(void);#endif
C文件 *.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>#include "ring_buffer.h"#define BUFF_SIZE (200)static volatile uint32_t valid_len = 0;
static volatile uint8_t *pHead = (volatile uint8_t*)0x68000000;
static volatile uint8_t *pEnd = NULL;
static volatile uint8_t *pValid = NULL;
static volatile uint8_t *pValidEnd = NULL;void RingBuffer_Init(void)
{// if(pHead==NULL)
// {pHead = (uint8_t*)malloc(BUFF_SIZE);
// }pValid = pValidEnd = pHead;pEnd = pHead + BUFF_SIZE;valid_len = 0;
}int RingBuffer_Write(uint8_t *buffer, uint32_t len)
{int len1 = 0, len2 = 0;int move_len = 0;if(len > BUFF_SIZE){return -2;}if(pHead==NULL){return -1;}assert(buffer);// copy buffer to pValidEndif( (pValidEnd + len) > pEnd ) // 超过了Buffer范围需要分为两段{len1 = pEnd - pValidEnd;len2 = len - len1;memcpy((uint8_t*)pValidEnd, buffer, len1);memcpy((uint8_t*)pHead, buffer + len1, len2);pValidEnd = pHead + len2; // 更新有效数据区尾地址}else{memcpy((uint8_t*)pValidEnd, buffer, len);pValidEnd = pValidEnd + len;}// 重新计算已使用区的起始位置if( (valid_len + len) > BUFF_SIZE ) // 要写入的数据超过了缓冲区总长度,分为两段写{move_len = valid_len + len - BUFF_SIZE;if( (pValid + move_len) > pEnd ){len1 = pEnd - pValid;len2 = move_len - len1;pValid = pHead + len2;}else{pValid = pValid + move_len;}valid_len = BUFF_SIZE;}else{valid_len = valid_len + len;}return 0;
}int RingBuffer_Read(uint8_t *buffer, uint32_t len)
{int len1 = 0, len2 = 0;if(pHead==NULL){return -1;}assert(buffer);if(valid_len==0){return 0;}if(len > valid_len){len = valid_len;}if( (pValid + len) > pEnd ){len1 = pEnd - pValid;len2 = len - len1;memcpy(buffer, (uint8_t*)pValid, len1);memcpy(buffer + len1, (uint8_t*)pHead, len2);pValid = pHead + len2;}else{memcpy(buffer, (uint8_t*)pValid, len);pValid = pValid + len;}valid_len -= len;return len;
}uint32_t RingBuffer_GetValidLen(void)
{return valid_len;
}void RingBuffer_Release(void)
{if(pHead != NULL){free((uint8_t*)pHead);}pHead = NULL;
}
单片机常用环形队列--ringbuff相关推荐
- 单片机实现环形队列_稀疏数组和队列(二)
队列的介绍 队列以一种先入先出(FIFO)的线性表,还有一种先入后出的线性表(FILO)叫做栈. 教科书上有明确的定义与描述.类似于现实中排队时的队列(队尾进,队头出),队列只在线性表两端进行操作,插 ...
- 单片机实现环形队列_单片机模块化程序: 难道有环形队列串口发送数据就万事大吉了吗...
1.问个问题,下面程序有没有BUG数组 2.环形队列虽然解决了一开始的中断发送数据覆盖问题,可是呢却引入了新的问题函数 3.而后看看中断发送测试 4.想没想明白是什么问题spa 5.发送数据1 和发送 ...
- 单片机实现环形队列_单片机的FIFO(先入先出)循环队列实现
单片机的 FIFO( 先入先出 ) 循环队列实现 // // 文件: config.h // #ifndef __CONFIG_H #define __CONFIG_H // 这一段无需改动 //Th ...
- 1-关于单片机通信数据传输(中断发送,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)
补充: 程序优化 为避免普通发送和中断发送造成冲突(造成死机,复位重启),printf修改为中断发送 写这篇文章的目的呢,如题目所言,我承认自己是一个程序猿.....应该说很多很多学单片机的对于... ...
- 嵌入式常用模块之——环形队列(1)
简单聊聊 对我实现方式的介绍 代码部分 完整代码 简单聊聊 在嵌入式开发时候,有很对模块是经常会使用到的.从这篇文字开始,将我觉得一些常用的模块逐一做一个整理.梳理一下自己的思路,也顺便方便大家,如果 ...
- 常用数据结构 ——— 队列(环形队列和顺序队列)
目录 一.队列简介 二.顺序队列 三.环形队列 四.环形队列代码 1.队列结构体 2.队列初始化 3.判断队列是否为满 4.判断队列是否为空 5.将数据插入到队列中 6.读取队列中的数据 7.释放队列 ...
- c语言单片机求最小公倍数,单片机常用的14个C语言算法,要熟记在心哦!
原标题:单片机常用的14个C语言算法,要熟记在心哦! 算法(Algorithm):计算机解题的基本思想方法和步骤. 算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么 ...
- 柔性数组和环形队列之间的故事
之前的文章,讲解了柔性数组,有很多人留言,提到一些问题.刚好,之前发关于环形队列的文章有些问题,这次刚好拿出来一起说一下,并用柔性数组实现一个环形队列. 柔性数组的上一篇文章 环形队列C语言实现文章 ...
- [Linux]生产者消费者模型(基于BlockQueue的生产者消费者模型 | 基于环形队列的生产者消费者模型 | 信号量 )
文章目录 生产者消费者模型 函数调用角度理解生产者消费者模型 生活角度理解生产者消费者模型 为什么要使用生产者消费者模型 生产者消费者模型优点 321原则 基于BlockingQueue的生产者消费者 ...
最新文章
- Java经典面试题整理及答案详解(四)
- JMP指令转换公式推导
- 从基础货币到资金到债券,固收市场的分层都在这了
- Java8 新特性简介
- vb 6.0 获取重定向的url_接口测试:A07_HttpRunner重定向_04_解决方案
- 深入研究ES6 Generators
- Java 支付宝支付,退款,单笔转账到支付宝账户(单笔转账到支付宝账户)
- ifcfg-eth0 配置
- 苹果发布紧急公告:老设备11月3日前再不更新就要停止服务啦
- 在SpringBoot应用中获取应用上下文方法
- 2014年计算机求职总结--准备篇
- saxreader java_DOM4j读取XML文件(SAXReader)
- 你可以有喜欢和善用的语言,但千万不要和她Bind
- 大数据基础课17 大数据环境下如何保护隐私
- lbp2900linux驱动下载,佳能lbp2900打印机驱动下载|佳能lbp2900打印机驱动下载 通用版_小皮网...
- 表单重复提交(前端未做单击防重复点击策略)
- python数字转英文_python:将数字转换成用英文表达的程序
- WS小世界网络的仿真实现
- 自动绘制公路工程纵断面的AutoLisp程序
- 题目0155-特异性双端队列