头文件: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; } } }
参考资料:fifo的c语言实现