嵌入式框架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 前言: 在嵌入式开发中,只要是带操作系统的 ...
随机推荐
- C#发送电子邮件 (异步) z
///验证电子邮件的正则表达式 string emailStr = @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([ ...
- April 1 2017 Week 13 Saturday
There is more to life than increasing its speed. 生活不仅仅是匆匆赶路. Get a life, a real life, not a manic pu ...
- 团队合作之Scrum
CCSU小助手 一:开发团队简介 队名:瓜队 组员:钟文兴.周畅.吉刘磊.唐仲勋 宣言:We are a team at any time! 团队项目描述: 内容:“生活在长大”: 目标:为了方便对学 ...
- 使用Cloud application Studio在C4C UI里创建下拉列表(dropdown list)
在Cloud Application Studio里新建一个Code List Data Type: 维护Value和描述信息,以及在ABSL里使用的constant值. 保存之后,上述维护的信息会存 ...
- Andriod ADB Interface驱动安装失败Configure USB Debug for Android
介绍: Linux或Apple或OS X ,已经安装了USB驱动调试为Android的帮助,确认您的Android USB调试连接配置和正常工作. Windows下需要自己手动下载驱动安装或者通过下载 ...
- Android(java)学习笔记58:Android 英文朗诵
1. 首先,我先把代码放到下面: package com.himi.speaker; import java.util.Locale; import android.app.Activity; imp ...
- 关于 org.hibernate.TransientObjectException 异常
在Hibernate的关联关系中,如果一个对象A 持有 对象 B 的引用,如果先保存 A ,再保存B,那么会出现 org.hibernate.TransientObjectException 异常. ...
- 随便扯扯React生命周期 --《爱看不看系列》
生命周期嘛,顾名思义,就是说组件这辈子从生下来到死掉经历的事情.先来看看一张图片,温故温故,如图: 你会发现有些周期的名字都能找出点规律,我找到的规律是凡是 Will 字母的,表示该钩子函数会在该生命 ...
- js CheckBox只读
checkbox没有readOnly属性 所以我们要设置CHeckbox是只读的话就要设置其onclick方法并返回false checkbox.onclick=function(){return f ...
- generative models
A generative model G can be seen as taking a random seed h (say, a sample from a multivariate Normal ...