循环数组实现FIFO
涉及到数据通信的软件开发,不能回避的一点是,设计一个实用高效率的数据缓冲区,例如fifo。今天在做项目时候,需要缓存CAN总线上的数据,然后再需要的时候读这些数据。下边给出我自己设计的,采用循环数组实现的FIFO,未经过严格的测试,请您斟酌。需要指出的是,fifo的数组深度是256,采用的数组下标是unchar类型,当下标在0xff加1,到达数组末端时,刚好unchar类型的下标溢出为0,这样免去了手动修改下标。先看代码:
#pragma once #include <string.h>
#include "afx.h" #define BUF_MAX 256 struct _fifo
{
int buf[BUF_MAX]; /* 预设最大深度256的fifo,这里元素是int,当然可以使其他自定义类型 */
unsigned char in; /* 下次插入fifo的数组下标 */
unsigned char out; /* 下次fifo出数据的下标 */
unsigned short num; /* fifo中数据元素的个数 */
CRITICAL_SECTION cs; /* 共享数据保护,在windows下采用临界区机制 */
};
/* 初始化fifo结构 */
static void __init_fifo(_fifo* pf)
{
memset(pf->buf, 0, sizeof(pf->buf));
pf->in=0;
pf->out=0;
pf->num=0;
InitializeCriticalSection(&pf->cs);
} static unsigned char __in_fifo(_fifo* pf, int data)
{
unsigned char rt;
EnterCriticalSection(&pf->cs);
pf->buf[pf->in]=data;
pf->in++;
if (pf->in==pf->out)
{
pf->out++;
rt=0xFF;
}
else
{
pf->num++;
rt= 0;
}
LeaveCriticalSection(&pf->cs);
return rt;
} static unsigned char __out_fifo(_fifo* pf, int* data)
{
unsigned char rt;
EnterCriticalSection(&pf->cs);
if (pf->in==pf->out)
{
rt= 0xFE;
}
else
{
*data=pf->buf[pf->out];
pf->out++;
pf->num--;
rt=0;
}
LeaveCriticalSection(&pf->cs);
return rt;
} static void _uninit_fifo(_fifo* pf)
{
DeleteCriticalSection(&pf->cs);
}
向fifo插入数据
(1)条件:任何条件下都允许插入数据;
(2)操作:data-->buf[in]; in++; 此时考虑2中情况,in==out?时,说明队列已经满了,此时将最“老”的数据丢掉,out++;若in!=out,则不需要操作。
(3)返回值:当(2)中发生丢数据时,报出返回值ff,指示数据溢出,fifo还可以正常工作;没有丢数,则正常返回00
从fifo中取数据
(1)条件:需满足,in!=out。
(2)操作:满足(1)时,执行buf[out]-->data, out++. 返回值说明取数据操作是否成功。
如果fifo数组长度BUF_MAX与数组下标(in,out)不满足2^8=256时,则需要增加修改下标的逻辑,在每次++的时候判断即可。
循环数组实现FIFO的更多相关文章
- c++利用循环数组建立FIFO模板队列
可直接编译运行,其中status()方法效果如图: #include <iostream> using std::cout; template<typename T> clas ...
- 前端开发:setTimeout与setInterval 定时器与异步循环数组
前端开发:setTimeout与setInterval 定时器与异步循环数组 前言: 开通博客园三个月以来,随笔记录了工作中遇到的大大小小的难题,也看过无数篇令人启发的文章,我觉得这样的环境是极好的, ...
- lintcode循环数组之连续子数组求和
v 题目:连续子数组求和 II 给定一个整数循环数组(头尾相接),请找出一个连续的子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的值.如果多个答案,请返回其中任意一个. ...
- 51nod 1050 循环数组最大子段和
题目链接:51nod 1050 循环数组最大子段和 #include<stdio.h> #include<algorithm> using namespace std; ; l ...
- 深入理解循环队列----循环数组实现ArrayDeque
我们知道队列这种数据结构的物理实现方式主要还是两种,一种是链队列(自定义节点类),另一种则是使用数组实现,两者各有优势.此处我们将要介绍的循环队列其实是队列的一种具体实现,由于一般的数组实现的队列结构 ...
- 1042 数字0-9的数量 1050 循环数组最大子段和 1062 序列中最大的数 1067 Bash游戏 V2 1092 回文字符串
1042 数字0-9的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-19,1出现11次 ...
- 【循环数组的最大字串和】Maximal-sum Subsequence
[循环数组的最大字串和]Maximal-sum Subsequence PROBLEM 题目描述 给一个 N×N 的矩阵 M,可以取连续的一段数(必须是横着或者竖着或者斜着,这个矩阵是循环的,具体如下 ...
- shell 循环数组
循环数组 ;i<${#o[*]};i++)) do echo ${o[$i]} done
- 整理JavaScript循环数组和对象的方法
众所周知,常用的循环语句有for.while.do-while.for-in,forEach以及jQuery中提供的循环的方法:以及ES6中提供的很多用来循环对象的方法如map, 在 Javascri ...
随机推荐
- Python库的优雅安装及PyCharm虚拟环境配置
一.安装python库 安装python库有几种方式: 1. 使用pip命令行,如:pip install Pillow 2. 在pycharm中安装 3. 使用Anaconda批量安装常用模块 在使 ...
- how to Simply Singleton Navigate the deceptively simple Singleton pattern---reference
http://www.javaworld.com/article/2073352/core-java/simply-singleton.html JAVA DESIGN PATTERNS By Dav ...
- Java反射的理解(六)-- 通过反射了解集合泛型的本质
Java反射的理解(六)-- 通过反射了解集合泛型的本质 上述写了那么多,我们可能会有个疑问,为什么要用反射,步骤比我们常规的加载类操作复杂多了,别急,这个问题我最后才解答,我们先来了解集合泛型的本质 ...
- 深入理解hadoop数据倾斜
深入理解hadoop之数据倾斜 1.什么是数据倾斜 我们在用map /reduce程序执行时,有时候会发现reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理 ...
- java字符串大小写转换
String test="SHA34cccddee"; System.out.println(test.toUpperCase());//小写转大写 String test= ...
- ext grid添加2行topbar
bbar: paginToolbar(this.getStore()), dockedItems: [{ xtype: 'toolbar', dock: 'top', items: me.create ...
- WebStrom 中文显示异常中文变样乱码
问题描述 WebStorm 编辑文件时中文显示异常,大小不一 菜单栏字体需要更换 解决方法 修改编辑器字体 菜单栏默认字体取消 设置效果 编辑文件时中英文显示 菜单栏 其他相关 关于编码格式,这里未做 ...
- mockjs介绍
官网 https://github.com/nuysoft/Mock/wiki/Getting-Started 一.为什么使用mockjs 在做开发时,当后端的接口还未完成,前端为了不影响工作效率,手 ...
- js之语句(表达式语句,复合语句,声明语句)
语句就是JavaScript整句或命令,以分号结束,用来执行以使某件事发生.下面将介绍三种语句:表达式语句,复合语句,声明语句. 一.表达式语句 表达式语句是javascript中最简单的语句 < ...
- ElementUI Hello World
Vue Element UI Hello World <!DOCTYPE html> <html> <head> <meta charset="ut ...