📄 rd_adt_queue.c
字号:
/***********************************************************
* 函数库说明:抽象数据类型(ADT)队列函数库 *
* 版本: v1.01 *
* 作者: 王卓然 *
* 创建日期: 2007年3月23日 *
* -------------------------------------------------------- *
* [支 持 库] *
* 支持库名称:RD_MacroAndConst.h *
* 需要版本: v0.01 &abv *
* 支持库说明:系统常用宏定义库 *
* *
* 支持库名称:RD_ADT_QUEUE.h *
* 需要版本: ----- *
* 支持库说明:抽象数据类型(ADT)队列声明库 *
* -------------------------------------------------------- *
* [版本更新] *
* 修改: 王卓然 *
* 修改日期: 2007年4月17日 *
* 版本: v1.01 *
* -------------------------------------------------------- *
* [版本历史] *
* v1.00 该版本提供了基本的抽象数据类型队列的结构定 *
* 义,以及默认的环形队列处理函数。 *
* v1.01 增加了队列空判断函数,和队列首数据预览函数 *
* -------------------------------------------------------- *
* [使用说明] *
***********************************************************/
/********************
* 头 文 件 配 置 区 *
********************/
# include "RD_MacroAndConst.h"
# include "RD_ADT_QUEUE.h"
/********************
* 系 统 宏 定 义 *
********************/
/*------------------*
* 常 数 宏 定 义 *
*------------------*/
/*------------------*
* 动 作 宏 定 义 *
*------------------*/
/********************
* 结构体定义区 *
********************/
/********************
* 模块函数声明区 *
********************/
/********************
* 全局函数声明区 *
********************/
BOOL ADT_Queue_Add_To_Buffer(ADT_QUEUE *pQueue,uint8 cData);
BOOL ADT_Queue_Get_From_Buffer(ADT_QUEUE *pQueue,uint8 *pData);
BOOL ADT_Queue_Check_Empty(ADT_QUEUE *pQueue);
BOOL ADT_Queue_Peek_From_Buffer(ADT_QUEUE *pQueue,uint8 *pData);
/********************
* 模块变量声明区 *
********************/
/********************
* 全局变量声明区 *
********************/
/***********************************************************
* 函数说明:抽象数据类型队列,系统默认队列缓冲添加函数 *
* 输入: 要添加到缓冲区的数据 *
* 输出: 添加是否成功 *
* 调用函数:无 *
***********************************************************/
BOOL ADT_Queue_Add_To_Buffer(ADT_QUEUE *pQueue,uint8 cData)
{
uint8 *pBuffer;
uint nSize;
uint nTail;
uint nHead;
uint nCount;
SAFE_CODE_PERFORMANCE //原子操作
(
pBuffer = pQueue->pBuffer;
nSize = pQueue->nSize;
if ((pBuffer == NULL) || (!nSize))
{
SEI();
return FALSE; //缓冲区未分配空间
}
nTail = pQueue->nTail;
nHead = pQueue->nHead;
nCount = pQueue->nCount;
if ((nTail == nHead) && (nCount == nSize)) //缓冲区已满
{
SEI();
return FALSE;
}
pBuffer[nTail] = cData;
nTail++;
nCount++;
if (nTail == nSize)
{
nTail = 0;
}
pQueue->nTail = nTail;
pQueue->nCount = nCount;
)
return TRUE;
}
/***********************************************************
* 函数说明:抽象数据类型队列,系统默认队列缓冲区读取函数 *
* 输入: 存放读取变量的空间指针 *
* 输出: 队列是否为空 *
* 调用函数:无 *
***********************************************************/
BOOL ADT_Queue_Get_From_Buffer(ADT_QUEUE *pQueue,uint8 *pData)
{
uint8 *pBuffer;
uint nSize;
uint nTail;
uint nHead;
uint nCount;
SAFE_CODE_PERFORMANCE //原子操作
(
pBuffer = pQueue->pBuffer;
nSize = pQueue->nSize;
if ((pBuffer == NULL) || (!nSize))
{
SEI();
return FALSE; //缓冲区未分配空间
}
nTail = pQueue->nTail;
nHead = pQueue->nHead;
nCount = pQueue->nCount;
if ((nTail == nHead) && (nCount == 0)) //缓冲区为空
{
SEI();
return FALSE;
}
(*pData) = pBuffer[nHead++];
nCount--;
if (nHead == nSize)
{
nHead = 0;
}
pQueue->nHead = nHead;
pQueue->nCount = nCount;
)
return TRUE;
}
/***********************************************************
* 函数说明:队列判空函数 *
* 输入: 队列指针 *
* 输出: 队列是否为空 *
* 调用函数:无 *
***********************************************************/
BOOL ADT_Queue_Check_Empty(ADT_QUEUE *pQueue)
{
uint8 *pBuffer;
SAFE_CODE_PERFORMANCE
(
pBuffer = pQueue->pBuffer;
if ((pBuffer == NULL) || (!(pQueue->nSize)))
{
SEI();
return TRUE; //缓冲区未分配空间
}
if (((pQueue->nTail) == (pQueue->nHead))
&& ((pQueue->nCount) == 0)) //缓冲区为空
{
SEI();
return TRUE;
}
)
return FALSE;
}
/***********************************************************
* 函数说明:队列首个数据预览函数 *
* 输入: 存放读取变量的空间指针 *
* 输出: 队列是否为空 *
* 调用函数:无 *
***********************************************************/
BOOL ADT_Queue_Peek_From_Buffer(ADT_QUEUE *pQueue,uint8 *pData)
{
uint8 *pBuffer;
uint nSize;
uint nTail;
uint nHead;
uint nCount;
SAFE_CODE_PERFORMANCE //原子操作
(
pBuffer = pQueue->pBuffer;
nSize = pQueue->nSize;
if ((pBuffer == NULL) || (!nSize))
{
SEI();
return FALSE; //缓冲区未分配空间
}
nTail = pQueue->nTail;
nHead = pQueue->nHead;
nCount = pQueue->nCount;
if ((nTail == nHead) && (nCount == 0)) //缓冲区为空
{
SEI();
return FALSE;
}
(*pData) = pBuffer[nHead];
)
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -