C语言数据结构———循环消息队列,数组方式实现
- 参考内容
- 消息队列数据类型结构体
- 一、初始化消息队列
- 二、消息队列是否为空
- 三、消息队列是否已满
- 四、消息入队
- 五、消息出队
- 六、其他函数
- 七、函数汇总
参考内容
- C语言数据结构———循环队列(静态数组实现方式)
- C语言数据结构———循环队列(动态数组实现方式)
- C语言数据结构———链式队列(链表实现方式)
- C语言数据结构———循环队列(数组实形式用宏定义方式实现)
- C语言数据结构——循环队列,数组方式实现
消息队列数据类型结构体
typedef struct
{
u16 Type;
u16 Data;
}xSuper_Message_TypeDef;
typedef struct
{
u8 Front, Rear;
u8 Size;
xSuper_Message_TypeDef * pMsgDat;
}xSuper_MesgQueue_TypeDef;
一、初始化消息队列

void vMesgQueue_Init(xSuper_MesgQueue_TypeDef * pQueue, xSuper_Message_TypeDef * pMesg, u8 size)
{
pQueue->Front = pQueue->Rear = 0;
pQueue->Size = size;
pQueue->pMsgDat = pMesg;
}
二、消息队列是否为空

u8 xMesgQueue_IsEmpty(xSuper_MesgQueue_TypeDef * pQueue)
{
if (pQueue->Front == pQueue->Rear) return 1;
else return 0;
}
三、消息队列是否已满

u8 xMesgQueue_IsFull(xSuper_MesgQueue_TypeDef * pQueue)
{
if (((pQueue->Rear + 1) % pQueue->Size) == pQueue->Front) return 1;
else return 0;
}
四、消息入队

static void vSuper_MesgQueue_Enter(xSuper_MesgQueue_TypeDef * pQueue, u16 msgType, u16 msgData)
{
pQueue->pMsgDat[pQueue->Rear].Type = msgType;
pQueue->pMsgDat[pQueue->Rear].Data = msgData;
pQueue->Rear = (pQueue->Rear + 1) % pQueue->Size;
}
u8 xMesgQueue_Enter(xSuper_MesgQueue_TypeDef * pQueue, u16 msgType, u16 msgData)
{
if (xMesgQueue_IsFull(pQueue)) return 1;
vSuper_MesgQueue_Enter(pQueue, msgType, msgData);
return 0;
}
static u16 xSuper_MesgQueue_RearBeforIndex(xSuper_MesgQueue_TypeDef * pQueue)
{
return ((pQueue->Rear - 1 + pQueue->Size) % pQueue->Size);
}
void vMesgQueue_Enter_Force(xSuper_MesgQueue_TypeDef * pQueue, u16 msgType, u16 msgData)
{
u8 i = 0;
if (xMesgQueue_IsFull(pQueue))
{
i = xSuper_MesgQueue_RearBeforIndex(pQueue);
pQueue->pMsgDat[i].Type = msgType;
pQueue->pMsgDat[i].Data = msgData;
}
else
{
vSuper_MesgQueue_Enter(pQueue, msgType, msgData);
}
}
五、消息出队

static xSuper_Message_TypeDef * xSuper_MesgQueue_Output(xSuper_MesgQueue_TypeDef * pQueue)
{
xSuper_Message_TypeDef * pMsg = NULL;
pMsg = &pQueue->pMsgDat[pQueue->Front];
pQueue->Front = (pQueue->Front + 1) % pQueue->Size;
return pMsg;
}
xSuper_Message_TypeDef * xMesgQueue_Output(xSuper_MesgQueue_TypeDef * pQueue)
{
if (xMesgQueue_IsEmpty(pQueue)) return NULL;
return xSuper_MesgQueue_Output(pQueue);
}
六、其他函数
u16 xMesgQueue_GetCount(xSuper_MesgQueue_TypeDef * pQueue)
{
return ((pQueue->Rear - pQueue->Front + pQueue->Size) % pQueue->Size);
}
void vMesgQueue_Clear(xSuper_MesgQueue_TypeDef * pQueue)
{
pQueue->Front = pQueue->Rear = 0;
}
七、函数汇总
void vMesgQueue_Init(xSuper_MesgQueue_TypeDef * pQueue, xSuper_Message_TypeDef * pMesg, u8 size);
void vMesgQueue_Enter_Force(xSuper_MesgQueue_TypeDef * pQueue, u16 msgType, u16 msgData);
void vMesgQueue_Clear(xSuper_MesgQueue_TypeDef * pQueue);
u8 xMesgQueue_Enter(xSuper_MesgQueue_TypeDef * pQueue, u16 msgType, u16 msgData);
u8 xMesgQueue_IsEmpty(xSuper_MesgQueue_TypeDef * pQueue);
u8 xMesgQueue_IsFull(xSuper_MesgQueue_TypeDef * pQueue);
xSuper_Message_TypeDef * xMesgQueue_Output(xSuper_MesgQueue_TypeDef * pQueue);
u16 xMesgQueue_GetCount(xSuper_MesgQueue_TypeDef * pQueue);