一种FIFO实现原理

Posted hbg200

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一种FIFO实现原理相关的知识,希望对你有一定的参考价值。

    FIFO是模拟双端口缓冲器而设计的,先进的数据先出,进出的数据可以是1个至n个不等,主要解决时序问题。就像排队买菜,先来的排在前面,后来的排后面,先来的先买菜。

1. 策略:排队需要缓冲区BUF队列,模仿“排队买菜”和“双端口器件”原理,维持BUF队列中第一个数据永远在第一个存储位。

2. 读出:一个或n个,从第一个存储位开始读,读完后将剩余数据提到最前端,第一个数据对齐第一个存储位。

3. 写入:从队列后加入。

头文件:

#ifndef FIFOH
#define FIFOH

#include <windows.h>

#define FifoMaxBufSize 200000UL //200KB

class CFIFO
{
 public:

    int iFifoBufSize;//当前缓冲区数

    void Reset(void);//复位数据
    bool Read(BYTE *pData, int iReadSize);//读出
    bool Write(BYTE *pData, int iWriteSize);//写入

 private:

    BYTE Buf[FifoMaxBufSize];//缓冲区队列
};

#endif

源文件:

#include "FIFO.h"

void CFIFO::Reset(void)//复位数据
{
   iFifoBufSize = 0;//复位当前缓冲区数
}

bool CFIFO::Read(BYTE *pData, int iReadSize)//读出
{
    if(iReadSize > iFifoBufSize) return false;//要求不能满足
    memcpy(pData, Buf, iReadSize);//考出
    iFifoBufSize -= iReadSize;//减去移走数据
    if (iReadSize > 0)//有数据需要移动
    {
       memcpy(&Buf[0], &Buf[iReadSize], iFifoBufSize);//移动缓冲区剩余数据至顶部
    }
    return true;
}

bool CFIFO::Write(BYTE *pData, int iWriteSize)//写入
{
    if ((iFifoBufSize + iWriteSize) > FifoMaxBufSize) return false;//要求不能满足
    memcpy(&Buf[iFifoBufSize], pData, iWriteSize);//从队尾处写入
    iFifoBufSize += iWriteSize;//加入写入量
    return true;
}

在读取FFmpeg解压后音频片数据获得成功,其他应用可调整最大队列量,确保不溢出。  

  

以上是关于一种FIFO实现原理的主要内容,如果未能解决你的问题,请参考以下文章

调试成功的简单异步FIFO--verilog实现+testbench

Golang channel 用法与实现原理

linux 进程间通信 命名管道FIFO的原理与使用

先进先出算法(FIFO)——页面置换

串口实现FIFO接受数据

FIFOLRULFU的含义和原理(转)