• 循环数组实现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时,则需要增加修改下标的逻辑,在每次++的时候判断即可。

  • 相关阅读:
    vue 中的单元测试
    redux-学习总结
    React-学习总结
    vuecli 中 chainWebpack 的常用操作
    常用 vue-config.js 配置
    JavaScript 中的 MVC、MVP、MVVM
    日常工作中 @vue/cli 需要关注的一些配置
    Electron 构建超时问题
    JSBridge 原理与封装
    Three.js 之相机
  • 原文地址:https://www.cnblogs.com/yuqiao-ray-vision/p/3616570.html
Copyright © 2020-2023  润新知