message queue

illustrate:

  • 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;
}












Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324440773&siteId=291194637