单片机应用消息队列

  1. #define   u8              unsigned char   
  2. #define   uchar           unsigned char   
  3.   
  4. #define   u16             unsigned int   
  5. #define   uint            unsigned int   
  6.   
  7. typedef u8 message;  
  8.   
  9. //定义消息  
  10. #define MSG_NONE   0 //无消息的消息  
  11.   
  12. #define MSG_TASK1_RUN   1  
  13. #define MSG_TASK1_STOP  2  
  14.   
  15. #define MSG_TASK2_RUN   3  
  16. #define MSG_TASK2_STOP  4  
  17.   
  18.   
  19. /*=============消息处理机制定义=================*/  
  20. //定义消息  
  21. #define  QUEUELEN   5    //消息队列缓冲区大小  
  22. u8 Messages[QUEUELEN];   //消息队列缓冲区  
  23. u8 MessageHead = 0;      //消息队头  
  24. u8 MessageTail = 0;      //消息队尾  
  25.   
  26. //消息发布  
  27. void    PutMessage(message m)  
  28. {  
  29.    Messages[MessageTail] = m ;  
  30.    if(++MessageTail>=QUEUELEN) MessageTail=0;  
  31. }  
  32. //获取消息缓冲区的消息  
  33. message GetMessage(void)  
  34. {  
  35.   message m = Messages[MessageHead];  
  36.   if(++MessageHead>=QUEUELEN) MessageHead=0;  
  37.   return m ;  
  38. }  
  39. //判断队列是否空或者错  
  40. bit     QueueEmptyOrError(void)  
  41. {  
  42.      return (MessageHead==MessageTail)?1:0;  
  43. }  
  44.   
  45. void main(void)  
  46. {  
  47.   
  48.   u8 RandTaskGene;  
  49.   
  50.   while(1)  
  51.   {  
  52.     
  53.    RandTaskGene = rand();  
  54.    RandTaskGene %=2;  
  55.    if(RandTaskGene)  
  56.    {  
  57.       PutMessage(MSG_TASK1_RUN);  
  58.    }  
  59.    else  
  60.    {  
  61.       PutMessage(MSG_TASK1_STOP);  
  62.    }  
  63.   
  64.    RandTaskGene = rand();  
  65.    if(RandTaskGene>1000)  
  66.     {  
  67.       PutMessage(MSG_TASK2_RUN);  
  68.     }  
  69.    else  
  70.     {  
  71.       PutMessage(MSG_TASK2_STOP);  
  72.     }  
  73.   
  74.   
  75.   
  76.     while(!QueueEmptyOrError())  
  77.         {  
  78.            switch (GetMessage())  
  79.                {  
  80.                  case MSG_TASK1_RUN:  
  81.                       //...  
  82.                       break;  
  83.                  case MSG_TASK1_STOP:  
  84.                       //...  
  85.                       break;  
  86.                  case MSG_TASK2_RUN:  
  87.                       //...  
  88.                       break;  
  89.                  case MSG_TASK2_RUN:  
  90.                       //...  
  91.                       break;        
  92.                }  
  93.           
  94.         }  
  95.   
  96.      
  97.    
  98.     
  99.       
  100.   }  
  101.   
  102.   
  103.   
  104. }  

猜你喜欢

转载自blog.csdn.net/u012210286/article/details/83313099
今日推荐