?? fifo.c
字號(hào):
/**---------------------版權(quán) (c)----------------------------------------------------------***
*** 作者:顏章健 ***
*** 郵件:jenkinyan@163.com ***
*** ***
***---------------------File Info---------------------------------------------------------***
*** 創(chuàng) 建 人: 顏章健 ***
*** 創(chuàng)建日期: 2008-03-08 ***
*** 創(chuàng)建版本: ***
*** 文件描述: ***
***---------------------------------------------------------------------------------------***
*** 修 訂 人: ***
*** 修訂日期: ***
*** 修訂版本: ***
***---------------------------------------------------------------------------------------**/
#include "config.h"
volatile RX_FIFO RxFifo;
uint8 RxFifoBuf[LENGTH_OF_RXFIFO];
/********************************************************************************************
*** 函數(shù)名稱:
*** 函數(shù)描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
uint8 *ModemFifoPush(uint8 dat)
{
uint8 *bak;
// FIFO已滿,停止壓入
if(RxFifo.DatLen >= RxFifo.BufLen) return NULL;
// 壓入數(shù)據(jù)
bak = RxFifo.In;
*RxFifo.In = dat;
// 改變?nèi)肟? RxFifo.In++;
if(RxFifo.In > RxFifo.End) RxFifo.In = RxFifo.Start;
// 長度增加
RxFifo.DatLen++;
return bak;
}
/********************************************************************************************
*** 函數(shù)名稱:
*** 函數(shù)描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
uint8 ModemFifoPop(void)
{
uint8 dat;
// FIFO已空,返回0
if(RxFifo.DatLen == 0) return 0;
// 讀取數(shù)據(jù)
dat = *RxFifo.Out;
// 改變出口
RxFifo.Out++;
if(RxFifo.Out > RxFifo.End) RxFifo.Out = RxFifo.Start;
// 長度減少
RxFifo.DatLen--;
return dat;
}
/********************************************************************************************
*** 函數(shù)名稱:
*** 函數(shù)描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
uint8 ModemFifoRead(uint16 offset)
{
uint8 *ptr;
IRQDisable();
// 數(shù)據(jù)無效
if(offset >= RxFifo.DatLen) return 0;
// 計(jì)算數(shù)據(jù)指針
if((RxFifo.Out + offset) > RxFifo.End)
ptr = RxFifo.Start + offset - (RxFifo.End - RxFifo.Out) - 1;
}
else
{
ptr = RxFifo.Out + offset;
}
IRQEnable();
// 返回?cái)?shù)據(jù)
return *ptr;
}
/********************************************************************************************
*** 函數(shù)名稱:
*** 函數(shù)描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
void ModemFifoRelease(uint16 length)
{
if(length < RxFifo.DatLen)
{
if((RxFifo.Out + length) > RxFifo.End)
{
RxFifo.Out = RxFifo.Start + length - (RxFifo.End - RxFifo.Out) - 1;
}
else
{
RxFifo.Out += length;
}
RxFifo.DatLen -= length;
}
else
{
RxFifo.DatLen = 0;
RxFifo.In = RxFifo.Start;
RxFifo.Out = RxFifo.Start;
}
}
/********************************************************************************************
*** 函數(shù)名稱:
*** 函數(shù)描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
void FifoInit(void)
{
RxFifo.Start = RxFifoBuf;
RxFifo.End = RxFifoBuf + LENGTH_OF_RXFIFO - 1;
RxFifo.BufLen = LENGTH_OF_RXFIFO;
RxFifo.In = RxFifoBuf;
RxFifo.Out = RxFifoBuf;
RxFifo.DatLen = 0;
// RxFifo.Push = ModemFifoPush;
// RxFifo.Pop = ModemFifoPop;
// RxFifo.Read = ModemFifoRead;
// RxFifo.Release = ModemFifoRelease;
}
/********************************************************************************************
*** 文件結(jié)束 ***
********************************************************************************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -