头文件:Queue.h
#ifndef _Queue_H#define _Queue_Htypedef 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; } }}
参考资料: