天天看點

軟體模拟環形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;

}