天天看点

软件模拟环形FIFO

#ifndef __GX_swLoopFIFO_H__

#define __GX_swLoopFIFO_H__

#include "TypeDefine.h"

#define  FIFO_SIZE  4000

#define  True      1

#define  Flase     0

#define  Error     -1

typedef struct

{

    volatile uint  DataBagCount;

    volatile uint  InPointer;               //  头标记

    volatile uint  OutPointer;              //  尾标记

 volatile uint  Free_Space_Count;  //剩余空间数量

 volatile char  Error_Flag;    //错误标志

 volatile char  Buf[FIFO_SIZE];          //  数据缓冲区

} sw_Loop_FIFO_t;

//函数名称: swFifoInit(sw_Loop_FIFO_t *pFifo,char EndSign);

//函数功能: 初始化swFIFO对象

//参数含义: pFifo   :待初始化FIFO的地址

//      EndSign :结束标志字符

//返 回 值: void

//备    注: 测试通过

//作    者: 郭萧

//所在单位: 北方民族大学

//完成时间: 2014.9.1

void swFifoInit(sw_Loop_FIFO_t *pFifo);

//函数名称: swFifoIsFull(sw_Loop_FIFO_t *pFifo);

//函数功能: 判定FIFO是否满

//参数含义: pFifo   :待判断的FIFO的地址

//返 回 值: tBool

//    True :FIFO为满

//    Flase:FIFO非满

//备    注: 测试通过

//作    者: 郭萧

//所在单位: 北方民族大学

//完成时间: 2014.9.1

tBool swFifoIsFull(sw_Loop_FIFO_t *pFifo);

//函数名称: tBool swFifoIsEmpty(sw_Loop_FIFO_t *pFifo);

//函数功能: 判定FIFO是否空

//参数含义: pFifo   :待判断的FIFO的地址

//返 回 值: tBool

//    True :FIFO为空

//    Flase:FIFO非空

//备    注: 测试通过

//作    者: 郭萧

//所在单位: 北方民族大学

//完成时间: 2014.9.1

tBool swFifoIsEmpty(sw_Loop_FIFO_t *pFifo);

//函数名称: tBool swFifoWrite(sw_Loop_FIFO_t *pFifo,char c);

//函数功能: 向指定FIFO写数据

//参数含义: pFifo:待写入的FIFO的地址

//      c    :待写入的数值

//返 回 值: tBool 

//    True :写入成功

//    Flase:写入失败

//备    注: 测试通过

//作    者: 郭萧

//所在单位: 北方民族大学

//完成时间: 2014.9.1

void swFifoWrite(sw_Loop_FIFO_t *pFifo,char c);

//函数名称: char swFifoRead(sw_Loop_FIFO_t *pFifo);

//函数功能: 从指定的FIFO读数据

//参数含义: pFifo:待读取的的FIFO的地址

//返 回 值: char ReceiveData

//备    注: 测试通过

//作    者: 郭萧

//所在单位: 北方民族大学

//完成时间: 2014.9.1

char swFifoRead(sw_Loop_FIFO_t *pFifo);

//函数名称: char swFifoErrorFlagCheck(sw_Loop_FIFO_t *pFifo);

//函数功能: 判断是否有丢失数据的情况

//参数含义: pFifo:待读取的的FIFO的地址

//返 回 值: tBool 

//    True :数据接过程有丢数据错误

//    Flase:数据接过程无丢数据错误

//备    注: 测试通过

//作    者: 郭萧

//所在单位: 北方民族大学

//完成时间: 2014.9.1

tBool swFifoErrorFlagCheck(sw_Loop_FIFO_t *pFifo);

#endif

#include "TypeDefine.h"

#include "GX_swLoopFIFO.h"

void swFifoInit(sw_Loop_FIFO_t *pFifo)

{

    pFifo -> InPointer          = 0;

    pFifo -> OutPointer         = 0; 

 pFifo -> Free_Space_Count   = FIFO_SIZE;

 pFifo -> Error_Flag         = Flase;

}

tBool swFifoIsFull(sw_Loop_FIFO_t *pFifo)

{

    if(pFifo -> Free_Space_Count == 0) //如果未置位判断是否已满

    {

        return True;

    }

    else       

    {

        return Flase;   //如果未满返回不成立

    }

}

tBool swFifoIsEmpty(sw_Loop_FIFO_t *pFifo)

{

 if(pFifo -> Free_Space_Count == FIFO_SIZE) //如果未置位判断是否已空

 {

  return True;

 }

 else       

 {

  return Flase;       //如果非空返回不成立

 }

}

uint swFifoGetDataBagCount(sw_Loop_FIFO_t *pFifo)

{

 return pFifo -> DataBagCount;

}

void swFifoWrite(sw_Loop_FIFO_t *pFifo,char c)

{

    if (pFifo -> Free_Space_Count == 0)

 {

  pFifo -> Error_Flag = True;           //  若FIFO是空的,则返回空字符

  return;

 }

    else

    {

        pFifo -> Error_Flag = Flase;

    }

    pFifo -> Buf[pFifo -> InPointer] = c;      //将数据存入FIFO

    pFifo -> InPointer ++;           //输入指针指向下一个空间

    if(pFifo -> InPointer >= FIFO_SIZE)     //判断输入是否超出FIFO界限

        pFifo -> InPointer = 0;       //如果超出则从零开始存放

    pFifo -> Free_Space_Count --;      //剩余空间减一

}

char swFifoRead(sw_Loop_FIFO_t *pFifo)

{

 char ReceiveData;

    if (pFifo -> Free_Space_Count >= FIFO_SIZE)

 {

  pFifo -> Error_Flag = True;           //  若FIFO是空的,则返回空字符

  return ('\0');

 }

    else

    {

        pFifo -> Error_Flag = Flase;

    }

    ReceiveData = pFifo -> Buf[pFifo -> OutPointer];    //  若FIFO不空,则正常读取

 pFifo -> OutPointer ++;        //  输出数据指针指向下一个

 pFifo -> Free_Space_Count ++;      //  空闲空间数加一

    if (pFifo -> OutPointer >= FIFO_SIZE)    //  调整Tail

    {

        pFifo -> OutPointer = 0;

    }

    return ReceiveData;

}

tBool swFifoErrorFlagCheck(sw_Loop_FIFO_t *pFifo)

{

 if( pFifo -> Error_Flag)

 {

  pFifo -> Error_Flag = 0;

  return True;

 }

 else

  return Flase;

}