说明:
- messageQueue.h
#ifndef _MESSAGEQUEUE_H_
#define _MESSAGEQUEUE_H_
#include "board.h"
typedef struct MData {
u8* data;
u8 dataLen;
}mData;
/*数据队列*/
typedef struct MessageQueue {
union queueInfo
{
u8 queueLen;
};
mData md;
struct MessageQueue* next;
}messageQueue;
typedef enum{
QUEUE_EMPTY,
QUEUE_OK
}Qstatus;
#endif
- messageQueue.c
#include "messagequeue.h"
#include "stdlib.h"
#include <string.h>
messageQueue* MQ=NULL;
/*队列初始化*/
Qstatus messageQueueInit(void)
{
free(MQ);
MQ=NULL;
return QUEUE_OK;
}
/*入队*/
Qstatus messageEnQueue(mData data)
{
messageQueue* tp;
tp = MQ;
if(MQ==NULL)
{
/*分配消息队列的空间*/
MQ=(messageQueue*)malloc(sizeof(messageQueue));
/*分配数据的空间*/
MQ->md.data=(u8*)malloc(data.dataLen);
memcpy(MQ->md.data,data.data,data.dataLen);
MQ->md.dataLen=data.dataLen;
MQ->next=NULL;
MQ->queueLen=1;
return QUEUE_OK;
}
while(tp->next!=NULL)
{
tp=tp->next;
}
tp->next=(messageQueue*)malloc(sizeof(messageQueue));
tp->next->md.data=(u8*)malloc(data.dataLen);
memcpy(tp->next->md.data,data.data,data.dataLen);
tp->next->md.dataLen=data.dataLen;
tp->next->next=NULL;
MQ->queueLen++;
return QUEUE_OK;
}
Qstatus messageDnQueue(mData* data)
{
messageQueue* tp;
messageQueue* tp_h;
tp=MQ;
if(MQ==NULL)
{
return QUEUE_EMPTY;
}
else if(MQ->next==NULL)
{
memcpy(data->data,MQ->md.data,MQ->md.dataLen);
data->dataLen=MQ->md.dataLen;
/*释放data的空间*/
free(MQ->md.data);
MQ->md.data=NULL;
/*释放消息队列的空间*/
free(MQ);
MQ->queueLen--;
MQ=NULL;
return QUEUE_OK;
}
else
{
tp_h=MQ;
tp=MQ->next;
}
while(tp->next!=NULL)
{
tp_h=tp;
tp=tp->next;
}
memcpy(data->data,tp->md.data,tp->md.dataLen);
data->dataLen=tp->md.dataLen;
/*释放data的空间*/
free(tp->md.data);
tp->md.data=NULL;
/*释放消息队列的空间*/
free(tp);
tp=NULL;
tp_h->next=NULL;
MQ->queueLen--;
return QUEUE_OK;
}
/*清除消息队列队列*/
Qstatus messageClearQueue(void)
{
messageQueue* tp,*tmp;
tp=MQ;
while(tp!=NULL)
{
/*记录要释放的节点*/
tmp=tp;
/*指向下一个节点*/
tp=tp->next;
/*释放data的空间*/
free(tmp->md.data);
tmp->md.data=NULL;
/*释放消息队列的空间*/
free(tmp);
tmp=NULL;
}
MQ=NULL;
MQ->queueLen=0;
return QUEUE_OK;
}
u32 getMessageQueueLen(void)
{
if(MQ==NULL)
return 0;
else
return MQ->queueLen;
}