-----------------------------------------------------------queue.h-------------------------------------------------------------
#ifndef _Queue_H
#define _Queue_H
typedef struct QueueDef_ //队列对象定义
{
u16 front; //队列头部
u16 rear; //队列尾部
u16 count; //对列计数
u16 elemSize; //元素大小
u16 queueCnt; //队列大小
void * pdat; //指向队列数据区
}QueueDef;
typedef struct QueueCfgPrmtDef_ //队列初始化参数
{
u16 elemSize; //元素大小
u16 queueCnt; //队列大小
u8* paddr; //指向队列数据区
}QueueCfgPrmtDef;
typedef enum QueueResult_ //队列操作执行结果
{
_QueueFull = 0,
_QueueEmpty = 1,
_QueueOperateOk = 2
}QueueResult;
/*******************************************************************************
\* 函数名称: QueueInit
\* 说 明: FIFO队列初始化
\* 输入参数: pdI_Queue 要初始化的队列
\* pdI_Prmt 队列的初始化参数
\* 输出参数: 无
\* 返回值 : 无
\* 其 它:
*******************************************************************************/
void QueueInit(QueueDef *pdI_Queue, QueueCfgPrmtDef pdI_Prmt);
/*******************************************************************************
\* 函数名称: QueueIn
\* 说 明: FIFO队列插入一个元素
\* 输入参数: pdI_Queue 操作的队列
\* pvI_Dat 插入的元素
\* 输出参数: 操作结果 队列满或者成功
\* 返回值 :
\* 其 它:
*******************************************************************************/
QueueResult QueueIn(QueueDef *pdI_Queue, void* pvI_Dat);
/*******************************************************************************
* 函数名称: QueueOut
* 说 明: 从FIFO队列中取出一个元素
* 输入参数: pdI_Queue 操作的队列
* 输出参数: 操作结果 队列空或者成功
* 返回值 : pvI_Dat 取出的元素
* 其 它:
*******************************************************************************/
QueueResult QueueOut(QueueDef *pdI_Queue, void* pvI_Dat);
-----------------------------------------------------------queue.c-------------------------------------------------------------
#include "string.h"
#include "Queue.h"
/*******************************************************************************
\* 函数名称: QueueInit
\* 说 明: FIFO队列初始化
\* 输入参数: pdI_Queue 要初始化的队列
\* pdI_Prmt 队列的初始化参数
\* 输出参数: 无
\* 返回值 : 无
\* 其 它:
*******************************************************************************/
void QueueInit(QueueDef *pdI_Queue, QueueCfgPrmtDef* pdI_Prmt)
{
pdI_Queue->rear = 0;
pdI_Queue->front = pdI_Queue->rear;
pdI_Queue->count = 0;
pdI_Queue->elemSize = pdI_Prmt->elemSize;
pdI_Queue->queueCnt = pdI_Prmt->queueCnt;
pdI_Queue->pdat = pdI_Prmt->paddr;
}
/*******************************************************************************
* 函数名称: QueueIn
* 说 明: FIFO队列插入一个元素
* 输入参数: pdI_Queue 操作的队列
* pvI_Dat 插入的元素
* 输出参数: 操作结果 队列满或者成功
* 返回值 :
* 其 它:
*******************************************************************************/
QueueResult QueueIn(QueueDef *pdI_Queue, void* pvI_Dat)
{
if ((pdI_Queue->front == pdI_Queue->rear) && (pdI_Queue->count == pdI_Queue->queueCnt))
{
return _QueueFull;
}
else
{
u8* operatAddr = (u8*)pdI_Queue->pdat;
operatAddr += pdI_Queue->rear * pdI_Queue->elemSize;
memcpy(operatAddr, pvI_Dat, pdI_Queue->elemSize);
pdI_Queue->rear = (pdI_Queue->rear + 1) % pdI_Queue->queueCnt;
pdI_Queue->count = pdI_Queue->count + 1;
return _QueueOperateOk;
}
}
/*******************************************************************************
* 函数名称: QueueOut
* 说 明: 从FIFO队列中取出一个元素
* 输入参数: pdI_Queue 操作的队列
* 输出参数: 操作结果 队列空或者成功
* 返回值 : pvI_Dat 取出的元素
* 其 它:
*******************************************************************************/
QueueResult QueueOut(QueueDef *pdI_Queue, void* pvI_Dat)
{
if ((pdI_Queue->front == pdI_Queue->rear) && (pdI_Queue->count == 0))
{
return _QueueEmpty;
}
else
{
u8* operatAddr = (u8*)pdI_Queue->pdat;
operatAddr += pdI_Queue->front * pdI_Queue->elemSize;
memcpy(pvI_Dat, operatAddr, pdI_Queue->elemSize);
pdI_Queue->front = (pdI_Queue->front + 1) % pdI_Queue->queueCnt;
pdI_Queue->count = pdI_Queue->count - 1;
return _QueueOperateOk;
}
}
-----------------------------------------------------------例子-------------------------------------------------------------
#include "Queue.h"
typedef struct ElemTypeDef_
{
u8 e1;
u16 e2;
u32 e3;
}ElemTypeDef;
QueueDef MyQueue;
ElemTypeDef MyQueueData[10];
int main(void)
{
ElemTypeDef sh;
QueueCfgPrmtDef prmt;
u16 i;
prmt.elemSize = sizeof(ElemTypeDef);
prmt.queueCnt = sizeof(MyQueueData) / sizeof(ElemTypeDef);
prmt.paddr = (u8*)MyQueueData;
QueueInit(&MyQueue, &prmt);
while (1)
{
for (i = 0; i < 20; i++)
{
if (QueueIn(&MyQueue, &sh) == _QueueFull) break;
}
for (i = 0; i < 20; i++)
{
if (QueueOut(&MyQueue, &sh) == _QueueEmpty) break;
}
}
}