嵌入式框架Zorb Framework搭建二:环形缓冲区的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮。
嵌入式框架Zorb Framework搭建过程
嵌入式框架Zorb Framework搭建一:嵌入式环境搭建、调试输出和建立时间系统
嵌入式框架Zorb Framework搭建二:环形缓冲区的实现
一、前言
在这一篇中,我们将为Zorb Framework提供环形缓冲区的功能。环形缓冲区主要应用在字节数据流传输上,如串口、网口的收发都可以通过环形缓冲区进行缓存。例如我要通过串口发送命令“LED ON”来控制开发板的led灯亮起来,但开发板串口接收不是一次把“LED ON”同时接收,而是一个字节一个字节地接收,因此需要使用缓冲区来缓存数据,然后解析器来解析缓冲区的数据。
二、环形缓冲区设计
我们先来看看要实现的缓冲区长什么样子,提供什么功能,这样方便我们设计。
初步要提供的功能如下:
1、要有可以缓存数据的空间
2、可以知道总空间的大小
3、可以知道已用空间的数量
4、可以压入数据
5、可以弹出数据
6、我也可以在不弹出数据的情况下,读到特定长度的数据
因此,初步设计的数据结构如下:
/* 环形缓冲区数据结构 */
typedef struct _RingBuffer
{
bool IsExternBuffer; /* 是否外部缓冲区,是则销毁时不释放 */
uint8_t *pBuf; /* 缓冲区指针 */
uint32_t Head; /* 缓冲区头地址 */
uint32_t Trail; /* 缓冲区尾地址 */
uint32_t Size; /* 缓冲区大小 */
uint32_t Count; /* 数据字节数 */ /* 缓冲器是否已满 */
bool (*IsFull)(struct _RingBuffer * const pRb); /* 缓冲器是否空 */
bool (*IsEmpty)(struct _RingBuffer * const pRb); /* 压入一个字节 */
bool (*SaveByte)(struct _RingBuffer * const pRb, uint8_t byte); /* 取出一个字节 */
bool (*GetByte)(struct _RingBuffer * const pRb, uint8_t *pByte); /* 读取缓冲器已使用字节个数 */
uint32_t (*GetCount)(struct _RingBuffer * const pRb); /* 读取n个字节(n超过最大数据数时全部读出) */
bool (*ReadBytes)(struct _RingBuffer * const pRb, uint8_t *pArray,
uint32_t n); /* 丢弃n个字节(n超过最大数据数时全部丢弃) */
bool (*DropBytes)(struct _RingBuffer * const pRb, uint32_t n); /* 清空缓冲器 */
bool (*Clear)(struct _RingBuffer * const pRb); /* 释放缓冲器(不释放外部创建的缓冲区) */
bool (*Dispose)(struct _RingBuffer * const pRb);
} RingBuffer;
其实按实际需要,可能远不止上面提到的6种情况,例如我可以丢弃特定数量的字节数据,也可以直接清空掉缓冲区数据,甚至可以设想提供动态缓冲区的功能,也就是说可以释放缓冲器自己。
缓冲区已经设计好了,具体实现请看附件代码或在文末的github地址拉框架源码。
三、环形缓冲区结果测试
简单的测试代码如下:
/**
*****************************************************************************
* @file app_buffer.c
* @author Zorb
* @version V1.0.0
* @date 2018-06-28
* @brief 环形缓冲区测试的实现
*****************************************************************************
* @history
*
* 1. Date:2018-06-28
* Author:Zorb
* Modification:建立文件
*
*****************************************************************************
*/ #include "app_buffer.h"
#include "zf_includes.h" /* 环形缓冲区指针 */
RingBuffer *rb; /******************************************************************************
* 描述 :任务初始化
* 参数 :无
* 返回 :无
******************************************************************************/
void App_Buffer_init(void)
{
/* 创建500字节的缓冲区 */
RB_create(&rb, );
} /******************************************************************************
* 描述 :任务程序
* 参数 :无
* 返回 :无
******************************************************************************/
void App_Buffer_process(void)
{
uint32_t i;
uint8_t buf[];
uint8_t byte; ZF_DEBUG(LOG_D, "rb count before adding data is %d\r\n", rb->Count); /* 填充10个字节数据(0-9) */
for (i = ; i < ; i++)
{
rb->SaveByte(rb, i);
} ZF_DEBUG(LOG_D, "rb count after adding data is %d\r\n", rb->Count); /* 读出数据看是否正确 */
rb->ReadBytes(rb, buf, ); ZF_DEBUG(LOG_D, "rb data is "); for (i = ; i < ; i++)
{
ZF_DEBUG(LOG_D, "%d ", buf[i]);
} ZF_DEBUG(LOG_D, "\r\n\r\n"); /* 弹出数据 */
for (i = ; i < ; i++)
{
rb->GetByte(rb, &byte); ZF_DEBUG(LOG_D, "byte %d is %d\r\n", i, byte);
ZF_DEBUG(LOG_D, "rb count is %d\r\n", rb->Count);
} while();
} /******************************** END OF FILE ********************************/
结果:
rb count before adding data is
rb count after adding data is
rb data is byte is
rb count is
byte is
rb count is
byte is
rb count is
byte is
rb count is
byte is
rb count is
byte is
rb count is
byte is
rb count is
byte is
rb count is
byte is
rb count is
byte is
rb count is
四、最后
本篇为Zorb Framework提供了环形缓冲区功能,只要涉及到字节流通信,基本都需要缓冲区来实现,可以说应用频率比较高。现在造了这个轮子,后面就可以直接造跑车了。
Zorb Framework github:https://github.com/54zorb/Zorb-Framework
版权所有,转载请打赏哟
如果你喜欢我的文章,可以通过微信扫一扫给我打赏哟
嵌入式框架Zorb Framework搭建二:环形缓冲区的实现的更多相关文章
- 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建、调试输出和建立时间系统
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- 嵌入式框架Zorb Framework搭建三:列表的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- 嵌入式框架Zorb Framework搭建四:状态机的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- 嵌入式框架Zorb Framework搭建五:事件的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- 嵌入式框架Zorb Framework搭建六:定时器的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- 嵌入式框架Zorb Framework搭建七:任务的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(2 配置spring-dao和测试)
用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(1 搭建目录环境和依赖) 四:在\resources\spring 下面 ...
- 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(1 构建目录环境和依赖)
引言:在用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建一 的基础上 继续进行项目搭建 该部分的主要目的是测通MyBatis 及Spring-dao ...
- linux下C语言实现多线程通信—环形缓冲区,可用于生产者(producer)/消费者(consumer)【转】
转自:http://blog.chinaunix.net/uid-28458801-id-4262445.html 操作系统:ubuntu10.04 前言: 在嵌入式开发中,只要是带操作系统的 ...
随机推荐
- Excel数据导入Sql Server,部分数字为Null
在Excel中,我们时常会碰到这样的字段(最常见的就是电话号码),即有纯数字的(如没有带区号的电话号码),又有数字和其它字符混合 (如“区号-电 话号码”)的数据,在导入SQLServer过程中,会发 ...
- Hibernate 基于外键映射的一对一关联关系随手记
//有外键的一端默认使用懒加载. //没有外键的一端不使用懒加载,而是直接将它引用的对象也一并查询出来. //没有外键列不仅有外键约束还有唯一约束,即没有外键列一端的对象不能被有外键列一端的两个对象同 ...
- oc 无中生有添加协议(使已有函数符合协议)
class_addProtocol([UIButton class],@protocol(UIButtonExport)); @protocol UIButtonExport <JSExport ...
- 论C/C++数据在内存中的二进制存放形式
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u010518429/article/details/30332237 // enter any ty ...
- ACM-ICPC (10/12)
01分数规划 背景:根据楼教主回忆,曾经在一场比赛中秒掉了一道最优比例生成树问题,导致很多人跟风失败,最终悲剧. 什么是01分数规划呢? 这样的等式求最大,最小即为01分数规划. 如果你不知道该如何 ...
- csu 1947 三分
题意: 长者对小明施加了膜法,使得小明每天起床就像马丁的早晨一样. 今天小明早上6点40醒来后发现自己变成了一名高中生,这时马上就要做早操了,小明连忙爬起来 他看到操场密密麻麻的人,突然灵光一闪想到了 ...
- UVA1184 Air Raid
嘟嘟嘟 最小路径覆盖板子题. 建二分图,然后跑Dinic(因为我不会匈牙利),然后ans = n - maxflow(). 主要是发一下用链前存图的写法.(好像比vector短一点) #include ...
- refinedet网络结构
refinedet只预测4个层,并且只有conv6_1.conv6_2,没有ssd中的conv7.8.9 refinedet的4个层都只有1个aspect ratio和1个min_size,所以每层每 ...
- c#写入配置文件(text)
1.获取当前时间 System.DateTime currentTime = new System.DateTime(); currentTime = System.DateTime.Now; 写入配 ...
- 188. Best Time to Buy and Sell Stock IV——LeetCode
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...