📄 fifo.c
字号:
/**---------------------版权 (c)----------------------------------------------------------***
*** 作者:颜章健 ***
*** 邮件:jenkinyan@163.com ***
*** ***
***---------------------File Info---------------------------------------------------------***
*** 创 建 人: 颜章健 ***
*** 创建日期: 2008-03-08 ***
*** 创建版本: ***
*** 文件描述: ***
***---------------------------------------------------------------------------------------***
*** 修 订 人: ***
*** 修订日期: ***
*** 修订版本: ***
*** 修订描述: ***
***---------------------------------------------------------------------------------------**/
#include "config.h"
volatile RX_FIFO RxFifo;
uint8 RxFifoBuf[LENGTH_OF_RXFIFO];
/********************************************************************************************
*** 函数名称:
*** 函数描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
uint8 *ModemFifoPush(uint8 dat)
{
uint8 *bak;
// FIFO已满,停止压入
if(RxFifo.DatLen >= RxFifo.BufLen) return NULL;
// 压入数据
bak = RxFifo.In;
*RxFifo.In = dat;
// 改变入口
RxFifo.In++;
if(RxFifo.In > RxFifo.End) RxFifo.In = RxFifo.Start;
// 长度增加
RxFifo.DatLen++;
return bak;
}
/********************************************************************************************
*** 函数名称:
*** 函数描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
uint8 ModemFifoPop(void)
{
uint8 dat;
// FIFO已空,返回0
if(RxFifo.DatLen == 0) return 0;
// 读取数据
dat = *RxFifo.Out;
// 改变出口
RxFifo.Out++;
if(RxFifo.Out > RxFifo.End) RxFifo.Out = RxFifo.Start;
// 长度减少
RxFifo.DatLen--;
return dat;
}
/********************************************************************************************
*** 函数名称:
*** 函数描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
uint8 ModemFifoRead(uint16 offset)
{
uint8 *ptr;
IRQDisable();
// 数据无效
if(offset >= RxFifo.DatLen) return 0;
// 计算数据指针
if((RxFifo.Out + offset) > RxFifo.End)
{
ptr = RxFifo.Start + offset - (RxFifo.End - RxFifo.Out) - 1;
}
else
{
ptr = RxFifo.Out + offset;
}
IRQEnable();
// 返回数据
return *ptr;
}
/********************************************************************************************
*** 函数名称:
*** 函数描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
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;
}
}
/********************************************************************************************
*** 函数名称:
*** 函数描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
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;
}
/********************************************************************************************
*** 文件结束 ***
********************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -