单片机应用消息队列

 消息队列可以用来处理报警,异常等等方面对时序要求不高的任务。

 

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

 

你可能感兴趣的:(单片机应用消息队列)