单片机应用消息队列

2019-04-15 18:30发布

 消息队列可以用来处理报警,异常等等方面对时序要求不高的任务。   #define   u8              unsigned char    #define   uchar           unsigned char       #define   u16             unsigned int    #define   uint            unsigned int       typedef u8 message;      //定义消息   #define MSG_NONE   0 //无消息的消息      #define MSG_TASK1_RUN   1   #define MSG_TASK1_STOP  2      #define MSG_TASK2_RUN   3   #define MSG_TASK2_STOP  4         /*=============消息处理机制定义=================*/   //定义消息   #define  QUEUELEN   5    //消息队列缓冲区大小   u8 Messages[QUEUELEN];   //消息队列缓冲区   u8 MessageHead = 0;      //消息队头   u8 MessageTail = 0;      //消息队尾      //消息发布   void    PutMessage(message m)   {      Messages[MessageTail] = m ;      if(++MessageTail>=QUEUELEN) MessageTail=0;   }   //获取消息缓冲区的消息   message GetMessage(void)   {     message m = Messages[MessageHead];     if(++MessageHead>=QUEUELEN) MessageHead=0;     return m ;   }   //判断队列是否空或者错   bit     QueueEmptyOrError(void)   {        return (MessageHead==MessageTail)?1:0;   }      void main(void)   {        u8 RandTaskGene;        while(1)     {           RandTaskGene = rand();      RandTaskGene %=2;      if(RandTaskGene)      {         PutMessage(MSG_TASK1_RUN);      }      else      {         PutMessage(MSG_TASK1_STOP);      }         RandTaskGene = rand();      if(RandTaskGene>1000)       {         PutMessage(MSG_TASK2_RUN);       }      else       {         PutMessage(MSG_TASK2_STOP);       }                while(!QueueEmptyOrError())           {              switch (GetMessage())                  {                    case MSG_TASK1_RUN:                         //...                         break;                    case MSG_TASK1_STOP:                         //...                         break;                    case MSG_TASK2_RUN:                         //...                         break;                    case MSG_TASK2_RUN:                         //...                         break;                        }                      }                              }