嵌入式框架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 前言: 在嵌入式开发中,只要是带操作系统的 ...
随机推荐
- 调试一个Ext打开的window窗口内嵌Iframe的form提交问题
一个奇怪的问题是:潜逃在iframe里的页面单独提交都是正常,放到iframe里面通过js调用在parent页面.提交总是被莫名其妙的杀掉. 确定js简单无错之后,继续看parent的处理逻辑,有这么 ...
- WIN7系统程序放在中文文件夹打开报错及界面汉字变乱码
今天发现在一个服务商提供的设备的WIN7系统里,一个稳定运行的程序打开时报错,且界面汉字变乱码. 经测试发现程序放在英文名称的文件夹中可以正常打开,但界面上的汉字仍为乱码. 后检查“控制面板“--”区 ...
- python UI自动化实战记录一:测试需求与测试思路
测试需求: 项目包含两个数据展示页面,数据均来自于四个数据源接口. 测试操作步骤: 选择5个大类型中的一个,每个大类型下有3个子类型,选择任一子类型,页面数据更新.需验证页面上的数据与数据源接口数据一 ...
- U3
一个项目里面可以有多个Activity AndroidManifest.xml<intent-filter> <action android:name="android.i ...
- STL - priority_queue(优先队列)
参考:http://www.cnblogs.com/xzxl/p/7266404.html 一.基本定义: 优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素.但是它有一个特性,就是队列中最大 ...
- 【转】Java虚拟机类型卸载和类型更新解析
[摘要] 前面系统讨论过java类型加载(loading)的问题,在这篇文章中简要分析一下java类型卸载(unloading)的问题,并简要分析一下如何解决如何运行时加载newly ...
- Mysql跨数据库(在同一IP地址中)复制表
数据库表间数据复制分类 在利用数据库开发时,常常会将一些表之间的数据互相导入.当然可以编写程序实现,但是,程序常常需要开发环境,不方便.最方便是利用sql语言直接导入.既方便而修改也简单.以下就是导入 ...
- U盘安装centOS和下载地址
使用到的材料: 1.centos-6.2 i386 minimal 下载地址:http://mirrors.163.com/centos/6.2/isos/i386/CentOS-6.2-i386-m ...
- c语言描述的快速排序法
#include<stdio.h> #include<stdlib.h> void QuikSort(int a[],int m,int n){ //第一个数作为关键字,比他大 ...
- ProjectServer如何创建时间表
默认配置的ProjectServer是没有时间表的,任务汇报的时候不能汇报工时,只能汇报任务的百分比. 但如果有企业一定要用工时来汇报的话,我们就需要开启时间表. 点击服务器设置-->时间报告阶 ...