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);