简介

由于数据接收存在的断帧,又由于要保证数据的完整性,所以使用环形队列对数据的管理应运而生。其次用在时效性高,效率高(需定时获取数据)的场合也非常适用。

代码示例如下

一下示例的环形队列使用堆内存来实现。

头文件 *.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相关推荐

  1. 单片机实现环形队列_稀疏数组和队列(二)

    队列的介绍 队列以一种先入先出(FIFO)的线性表,还有一种先入后出的线性表(FILO)叫做栈. 教科书上有明确的定义与描述.类似于现实中排队时的队列(队尾进,队头出),队列只在线性表两端进行操作,插 ...

  2. 单片机实现环形队列_单片机模块化程序: 难道有环形队列串口发送数据就万事大吉了吗...

    1.问个问题,下面程序有没有BUG数组 2.环形队列虽然解决了一开始的中断发送数据覆盖问题,可是呢却引入了新的问题函数 3.而后看看中断发送测试 4.想没想明白是什么问题spa 5.发送数据1 和发送 ...

  3. 单片机实现环形队列_单片机的FIFO(先入先出)循环队列实现

    单片机的 FIFO( 先入先出 ) 循环队列实现 // // 文件: config.h // #ifndef __CONFIG_H #define __CONFIG_H // 这一段无需改动 //Th ...

  4. 1-关于单片机通信数据传输(中断发送,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)

    补充: 程序优化 为避免普通发送和中断发送造成冲突(造成死机,复位重启),printf修改为中断发送 写这篇文章的目的呢,如题目所言,我承认自己是一个程序猿.....应该说很多很多学单片机的对于... ...

  5. 嵌入式常用模块之——环形队列(1)

    简单聊聊 对我实现方式的介绍 代码部分 完整代码 简单聊聊 在嵌入式开发时候,有很对模块是经常会使用到的.从这篇文字开始,将我觉得一些常用的模块逐一做一个整理.梳理一下自己的思路,也顺便方便大家,如果 ...

  6. 常用数据结构 ——— 队列(环形队列和顺序队列)

    目录 一.队列简介 二.顺序队列 三.环形队列 四.环形队列代码 1.队列结构体 2.队列初始化 3.判断队列是否为满 4.判断队列是否为空 5.将数据插入到队列中 6.读取队列中的数据 7.释放队列 ...

  7. c语言单片机求最小公倍数,单片机常用的14个C语言算法,要熟记在心哦!

    原标题:单片机常用的14个C语言算法,要熟记在心哦! 算法(Algorithm):计算机解题的基本思想方法和步骤. 算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么 ...

  8. 柔性数组和环形队列之间的故事

    之前的文章,讲解了柔性数组,有很多人留言,提到一些问题.刚好,之前发关于环形队列的文章有些问题,这次刚好拿出来一起说一下,并用柔性数组实现一个环形队列. 柔性数组的上一篇文章 环形队列C语言实现文章 ...

  9. [Linux]生产者消费者模型(基于BlockQueue的生产者消费者模型 | 基于环形队列的生产者消费者模型 | 信号量 )

    文章目录 生产者消费者模型 函数调用角度理解生产者消费者模型 生活角度理解生产者消费者模型 为什么要使用生产者消费者模型 生产者消费者模型优点 321原则 基于BlockingQueue的生产者消费者 ...

最新文章

  1. Java经典面试题整理及答案详解(四)
  2. JMP指令转换公式推导
  3. 从基础货币到资金到债券,固收市场的分层都在这了
  4. Java8 新特性简介
  5. vb 6.0 获取重定向的url_接口测试:A07_HttpRunner重定向_04_解决方案
  6. 深入研究ES6 Generators
  7. Java 支付宝支付,退款,单笔转账到支付宝账户(单笔转账到支付宝账户)
  8. ifcfg-eth0 配置
  9. 苹果发布紧急公告:老设备11月3日前再不更新就要停止服务啦
  10. 在SpringBoot应用中获取应用上下文方法
  11. 2014年计算机求职总结--准备篇
  12. saxreader java_DOM4j读取XML文件(SAXReader)
  13. 你可以有喜欢和善用的语言,但千万不要和她Bind
  14. 大数据基础课17 大数据环境下如何保护隐私
  15. lbp2900linux驱动下载,佳能lbp2900打印机驱动下载|佳能lbp2900打印机驱动下载 通用版_小皮网...
  16. 表单重复提交(前端未做单击防重复点击策略)
  17. python数字转英文_python:将数字转换成用英文表达的程序
  18. WS小世界网络的仿真实现
  19. 自动绘制公路工程纵断面的AutoLisp程序
  20. 题目0155-特异性双端队列

热门文章

  1. 百度网盘怎么用迅雷下载文件?
  2. C/C++ 数组的初始化
  3. (信贷风控七)申请评分卡模型Python实现(图文+代码实现)
  4. 九度OJ-1185:特殊排序
  5. 从GitHub火到了博客,共计1658页的《Java岗面试核心MCA版》,拿走不谢
  6. python主网站_python主网站提供的集成开发环境名称为IDLE
  7. 【漫漫长征路】hihocoder #1082 然而沼跃鱼早就看穿了一切
  8. spark agg算子使用
  9. Docker基础: Linux内核命名空间之(1) mnt namespace
  10. C语言:使用函数计算一个数的阶乘