⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rd_adt_queue.c

📁 LCD1602键盘显示模块实例
💻 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 + -