首页 > 其他 > 详细

循环数组实现FIFO

时间:2014-03-22 02:40:34      阅读:353      评论:0      收藏:0      [点我收藏+]

      涉及到数据通信的软件开发,不能回避的一点是,设计一个实用高效率的数据缓冲区,例如fifo。今天在做项目时候,需要缓存CAN总线上的数据,然后再需要的时候读这些数据。下边给出我自己设计的,采用循环数组实现的FIFO,未经过严格的测试,请您斟酌。需要指出的是,fifo的数组深度是256,采用的数组下标是unchar类型,当下标在0xff加1,到达数组末端时,刚好unchar类型的下标溢出为0,这样免去了手动修改下标。先看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#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下采用临界区机制 */
};
<br>/* 初始化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,布布扣,bubuko.com

循环数组实现FIFO

原文:http://www.cnblogs.com/yuqiao-ray-vision/p/3616570.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!