我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮。

嵌入式框架Zorb Framework搭建过程

嵌入式框架Zorb Framework搭建一:嵌入式环境搭建、调试输出和建立时间系统

嵌入式框架Zorb Framework搭建二:环形缓冲区的实现

嵌入式框架Zorb Framework搭建三:列表的实现

嵌入式框架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搭建二:环形缓冲区的实现的更多相关文章

  1. 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建、调试输出和建立时间系统

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  2. 嵌入式框架Zorb Framework搭建三:列表的实现

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  3. 嵌入式框架Zorb Framework搭建四:状态机的实现

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  4. 嵌入式框架Zorb Framework搭建五:事件的实现

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  5. 嵌入式框架Zorb Framework搭建六:定时器的实现

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  6. 嵌入式框架Zorb Framework搭建七:任务的实现

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  7. 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(2 配置spring-dao和测试)

    用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(1 搭建目录环境和依赖) 四:在\resources\spring 下面 ...

  8. 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(1 构建目录环境和依赖)

    引言:在用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建一   的基础上 继续进行项目搭建 该部分的主要目的是测通MyBatis 及Spring-dao ...

  9. linux下C语言实现多线程通信—环形缓冲区,可用于生产者(producer)/消费者(consumer)【转】

    转自:http://blog.chinaunix.net/uid-28458801-id-4262445.html 操作系统:ubuntu10.04 前言:     在嵌入式开发中,只要是带操作系统的 ...

随机推荐

  1. collectd配置

    udp proxy - 192.168.48.112 cat > /etc/collectd_25801.conf << EOF Hostname "kvm-48-112& ...

  2. Centos7安装JDK1.8 Linux64bit

    流程一览: 1.下载JDK1.8(jdk-8u11-linux-x64.tar.gz) 2. 解压缩安装 3.配置JAVA_HOME环境变量 4.切换JDK1.8为当前使用的JDK 5.重启,查看安装 ...

  3. 一点一点学写Makefile(2)-自动搜所当前目录下的所有源文件

    上个博客我们使用的是笨方法添加源文件,本次我要实现的是遍历文件夹来获得所有的cpp文件 //makefile CROSS = CC = $(CROSS)gcc CXX = $(CROSS)g++ DE ...

  4. kahadb设计

    Kahadb设计思想   简介 hakadb是activemq的持久化数据库,作为消息队列的存储,每个消息有一个消息ID,提供了对消息的快速的查找,更新,以及消息的事物支持,以及意外磬机之后的恢复.丰 ...

  5. 编译安装PHP开发环境

    Linux 系统为 CentOS 7.2 1. 安装 Nginx 安装 Nginx 依赖包: # yum -y install zlib zlib-devel openssl openssl-deve ...

  6. centos7 编译安装nginx1.16.0( 完整版 )

    一.安装依赖包 yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel 依赖包说明: 1.编译 ...

  7. 【题解】POJ1845 Sumdiv(乘法逆元+约数和)

    POJ1845:http://poj.org/problem?id=1845 思路: AB可以表示成多个质数的幂相乘的形式:AB=(a1n1)*(a2n2)* ...*(amnm) 根据算数基本定理可 ...

  8. AngularJS表格排序

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  9. logistic regression svm hinge loss

    二类分类器svm 的loss function 是 hinge loss:L(y)=max(0,1-t*y),t=+1 or -1,是标签属性. 对线性svm,y=w*x+b,其中w为权重,b为偏置项 ...

  10. c语言描述的顺序表实现

    //顺序表的实现:(分配一段连续地址给顺序表,像数组一样去操作) #include<stdio.h> #include<stdlib.h> #define OK 1 #defi ...