循环数组实现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 ...
随机推荐
- linux 下用find命令查找文件,rm命令删除文件
linux 下用find命令查找文件,rm命令删除文件. 删除指定目录下指定文件find 要查找的目录名 -name .svn |xargs rm -rf 删除指定名称的文件或文件夹: find -t ...
- Codeforces 1178E. Archaeology
传送门 首先一定有解,考虑归纳法证明 首先 $n<=3$ 时显然 考虑 $n=4$ 时,那么因为 $s[1]!=s[2],s[3]!=s[4]$ ,并且 $s[i] \in {a,b,c}$ 由 ...
- 使用kafka-eagle监控Kafka
# 监控kafka集群,开启监控趋势图使用 # 有一个问题,需要在kafka-server-start.sh文件中配置端口,有如下三种办法 # 第一种:复制并修改kafka目录,比如kafka-1,k ...
- 移动端真机debug调试神器 vConsole学习(一)之基础
参考 使用方法 移动端真机debug调试神器 vConsole的引入说明(原生态与WebPack) 移动端使用vconsole调试console vConsole ——开源的前端 console 调试 ...
- Mongodb安装后在任务管理器中找不到这个服务
今天安装mongodb,但是一开始在任务管理器中找不到这个服务,后来查询得知:稍微高一些的系统是需要通过管理员身份运行cmd命令行安装的. orz,找了好久才知道是这个问题. 2333 在任务管理的服 ...
- 【Git的基本操作三】基本操作命令
基本操作 (1) 状态查看操作 git status 作用:查看工作区.暂存区状态 (2) 添加操作 git add [filename] 作用:将工作区文件的 添加/修改,添加到暂存区 (3) 提交 ...
- flex整页布局
使用flex进行整页的三列布局,flex:1下的子元素无法铺满父级.给flex:1元素,添加stretch拉伸 display: flex; align-content: stretch; align ...
- CentOS 7自动以root身份登录GNOME桌面
CentOS 7自动以root身份登录GNOME桌面 修改配置文件 /etc/gdm/custom.conf,在 [daemon] 下面添加一下两行 AutomaticLoginEnable=true ...
- JMeter函数整理
"_intSum” 功能:用于计算多个整数的和,可以是计算正整数和负整数的和,它有N个参数,最少有3个参数,最多不限.最后一个参数是函数名称,前面的其它参数是要求和的整数.这个函数在函数对话 ...
- 8.Canny边缘检测
#导入工具包 from imutils import * image = imread('image/school.jpg') show(image) def edge_detection(image ...