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

📄 queue.c

📁 SmartARM2400开发平台配套例程
💻 C
字号:
/***********************************************Copyright (c)*********************************************
**                                Guangzou ZLG-MCU Development Co.,LTD.
**                                     
**                                       http://www.zlgmcu.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name:			    queue.c
** Last modified Date:      2007-09-20
** Last Version:		    1.0
** Descriptions:		    中间件函数
**
**--------------------------------------------------------------------------------------------------------
** Created by:			    chengmingji
** Created date:		    2007-07-15
** Version:				    1.0
** Descriptions:		    
**
**--------------------------------------------------------------------------------------------------------
** Modified by:			    lixiaocheng
** Modified Date:		    2007-09-20
** Version:				    1.0
** Descriptions:		    对排版格式进行了调整
**
*********************************************************************************************************/
#include "config.h"

/*********************************************************************************************************
** Function name:           QueueCreate
** Descriptions:            初始化数据队列
** Input parameters:        Buf      :为队列分配的存储空间地址
**                          SizeOfBuf:为队列分配的存储空间大小(字节)
**                          ReadEmpty:为队列读空时处理程序
**                          WriteFull:为队列写满时处理程序
** Output parameters:       NONE
** Returned value:          NOT_OK  :参数错误
**                          QUEUE_OK:成功
*********************************************************************************************************/
int QueueCreate (void      *Buf,
                 uint32     SizeOfBuf,
                 uint8   (* ReadEmpty)(),
                 uint8   (* WriteFull)()
                 )
{
    DataQueue *Queue;
    if (Buf != NULL && SizeOfBuf >= (sizeof(DataQueue))) {              /* 判断参数是否有效             */
        Queue = (DataQueue *)Buf;

        OS_ENTER_CRITICAL(); 
                                                                        /* 初始化结构体数据             */
        Queue->MaxData = (uint16)((SizeOfBuf - (uint32)(((DataQueue *)0)->Buf)) / 
                         sizeof(QUEUE_DATA_TYPE));                      /* 计算队列可以存储的数据数目   */
        Queue->End = Queue->Buf + Queue->MaxData;                       /* 计算数据缓冲的结束地址       */
        Queue->Out = Queue->Buf;
        Queue->In = Queue->Buf;
        Queue->NData = 0;
        Queue->ReadEmpty = ReadEmpty;
        Queue->WriteFull = WriteFull;

        OS_EXIT_CRITICAL();

        return QUEUE_OK;
    } else {
        return NOT_OK;
    }
}


/*********************************************************************************************************
** Function name:           QueueRead
** Descriptions:            获取队列中的数据
** Input parameters:        Ret:存储返回的消息的地址
**                          Buf:指向队列的指针
** Output parameters:       NONE
** Returned value:          NOT_OK     :参数错误
**                          QUEUE_OK   :收到消息
**                          QUEUE_EMPTY:队列空
*********************************************************************************************************/
int QueueRead (QUEUE_DATA_TYPE *Ret, void *Buf)
{
    int err;
    DataQueue *Queue;

    err = NOT_OK;
    if (Buf != NULL) {                                                  /* 队列是否有效                 */
        Queue = (DataQueue *)Buf;
        
        OS_ENTER_CRITICAL();
        
        if (Queue->NData > 0) {                                         /* 队列是否为空                 */                                                               
            *Ret = Queue->Out[0];                                       /* 数据出队                     */
            Queue->Out++;                                               
            
            if (Queue->Out >= Queue->End) {                             /* 调整出队指针                 */
                Queue->Out = Queue->Buf;
            }
            
            Queue->NData--;                                             /* 数据减少                     */
            err = QUEUE_OK;
        } else {                                                               
            err = QUEUE_EMPTY;
            
            if (Queue->ReadEmpty != NULL) {                             /* 空,调用用户处理函数         */
                err = Queue->ReadEmpty(Ret, Queue);
            }
        }
        OS_EXIT_CRITICAL();
    }
    return err;
}

/*********************************************************************************************************
** Function name:           QueueWrite
** Descriptions:            FIFO方式发送数据
** Input parameters:        Buf :指向队列的指针
**                          Data:发送的数据
** Output parameters:       NONE
** Returned value:          NOT_OK    : 参数错误
**                          QUEUE_FULL: 队列满
**                          QUEUE_OK  : 发送成功
*********************************************************************************************************/
#ifndef EN_QUEUE_WRITE
#define EN_QUEUE_WRITE      1
#endif

#if EN_QUEUE_WRITE > 0

int QueueWrite (void *Buf, QUEUE_DATA_TYPE Data)
{
    int err;
    DataQueue *Queue;

    err = NOT_OK;
    if (Buf != NULL) {                                                  /* 队列是否有效                 */
        Queue = (DataQueue *)Buf;
        
        OS_ENTER_CRITICAL(); 
        
        if (Queue->NData < Queue->MaxData) {                            /* 队列是否满                   */
            Queue->In[0] = Data;                                        /* 数据入队                     */
            Queue->In++;
                                                           
            if (Queue->In >= Queue->End) {                              /* 调整入队指针                 */
                Queue->In = Queue->Buf;
            }
            
            Queue->NData++;                                             /* 数据增加                     */
            err = QUEUE_OK;
        } else {                                                        /* 满                           */
            err = QUEUE_FULL;
            if (Queue->WriteFull != NULL) {                             /* 调用用户处理函数             */
                err = Queue->WriteFull(Queue, Data, Q_WRITE_MODE);
            }
        }
        OS_EXIT_CRITICAL();
    }
    return err;
}
#endif                                                                  /* EN_QUEUE_WRITE               */

/*********************************************************************************************************
** Function name:           QueueWriteFront
** Descriptions:            LIFO方式发送数据
** Input parameters:        Buf :指向队列的指针
**                          Data:发送的数据
** Output parameters:       NONE
** Returned value:          NOT_OK    : 参数错误
**                          QUEUE_FULL: 队列满
**                          QUEUE_OK  : 发送成功
*********************************************************************************************************/
#ifndef EN_QUEUE_WRITE_FRONT
#define EN_QUEUE_WRITE_FRONT    0
#endif

#if EN_QUEUE_WRITE_FRONT > 0

uint8 QueueWriteFront (void *Buf, QUEUE_DATA_TYPE Data)
{
    uint8 err;
    DataQueue *Queue;

    err = NOT_OK;
    if (Buf != NULL) {                                                  /* 队列是否有效                 */
        Queue = (DataQueue *)Buf;
        
        OS_ENTER_CRITICAL();
        if (Queue->NData < Queue->MaxData) {                            /* 队列是否满                   */
            Queue->Out--; 
                                                          
            if (Queue->Out < Queue->Buf) {                              /* 调整出队指针                 */
            
                Queue->Out = Queue->End - 1;
            }
            
            Queue->Out[0] = Data;                                       /* 数据入队                     */
            Queue->NData++;                                             /* 数据数目增加                 */
            err = QUEUE_OK;
        } else {                                                        /* 满                           */
            err = QUEUE_FULL;
            if (Queue->WriteFull != NULL) {                             /* 调用用户处理函数             */
                err = Queue->WriteFull(Queue, Data, Q_WRITE_FRONT_MODE);
            }
        }
        OS_EXIT_CRITICAL();
    }
    return err;
}

#endif                                                                  /* EN_QUEUE_WRITE_FRONT         */

/*********************************************************************************************************
** Function name:           QueueNData
** Descriptions:            取得队列中数据数
** Input parameters:        Buf :指向队列的指针
** Output parameters:       NONE
** Returned value:          队列包含数据数
*********************************************************************************************************/
#ifndef EN_QUEUE_NDATA
#define EN_QUEUE_NDATA    0
#endif

#if EN_QUEUE_NDATA > 0

uint16 QueueNData (void *Buf)
{
    uint16 temp;
    
    temp = 0;                                                           /* 队列无效返回0                */
    
    if (Buf != NULL) {
        OS_ENTER_CRITICAL(); 
        temp = ((DataQueue *)Buf)->NData;
        OS_EXIT_CRITICAL();
    }
    return temp;
}

#endif                                                                  /* EN_QUEUE_NDATA               */

/*********************************************************************************************************
** Function name:           QueueSize
** Descriptions:            取得队列总容量
** Input parameters:        Buf :指向队列的指针
** Output parameters:       NONE
** Returned value:          队列总容量
*********************************************************************************************************/
#ifndef EN_QUEUE_SIZE
#define EN_QUEUE_SIZE    0
#endif

#if EN_QUEUE_SIZE > 0

uint16 QueueSize (void *Buf)
{
    uint16 temp;
    
    temp = 0;                                                           /* 队列无效返回0                */
    
    if (Buf != NULL) {
        OS_ENTER_CRITICAL();
        temp = ((DataQueue *)Buf)->MaxData;
        OS_EXIT_CRITICAL();
    }
    return temp;
}

#endif                                                                  /* EN_QUEUE_SIZE                */

/*********************************************************************************************************
** Function name:           OSQFlush
** Descriptions:            清空队列
** Input parameters:        Buf :指向队列的指针
** Output parameters:       NONE
** Returned value:          NONE
*********************************************************************************************************/
#ifndef EN_QUEUE_FLUSH
#define EN_QUEUE_FLUSH    1
#endif

#if EN_QUEUE_FLUSH > 0

void QueueFlush (void *Buf)
{
    DataQueue *Queue;
    
    if (Buf != NULL) {                                                  /* 队列是否有效                 */
        Queue = (DataQueue *)Buf;
        OS_ENTER_CRITICAL();
        Queue->Out = Queue->Buf;
        Queue->In = Queue->Buf;
        Queue->NData = 0;                                               /* 数据数目为0                  */
        OS_EXIT_CRITICAL();
    }
}

#endif                                                                  /* EN_QUEUE_FLUSH               */

/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -