1. 程式人生 > >微控制器應用訊息佇列

微控制器應用訊息佇列

  1. #define   u8              unsigned char   
  2. #define   uchar           unsigned char   
  3. #define   u16             unsigned int   
  4. #define   uint            unsigned int   
  5. typedef u8 message;  
  6. //定義訊息  
  7. #define MSG_NONE   0 //無訊息的訊息  
  8. #define MSG_TASK1_RUN   1  
  9. #define MSG_TASK1_STOP  2  
  10. #define MSG_TASK2_RUN   3  
  11. #define MSG_TASK2_STOP  4  
  12. /*=============訊息處理機制定義=================*/  
  13. //定義訊息  
  14. #define  QUEUELEN   5    //訊息佇列緩衝區大小  
  15. u8 Messages[QUEUELEN];   //訊息佇列緩衝區  
  16. u8 MessageHead = 0;      //訊息隊頭  
  17. u8 MessageTail = 0;      //訊息隊尾  
  18. //訊息釋出  
  19. void    PutMessage(message m)  
  20. {  
  21.    Messages[MessageTail] = m ;  
  22.    if(++MessageTail>=QUEUELEN) MessageTail=0;  
  23. }  
  24. //獲取訊息緩衝區的訊息  
  25. message GetMessage(void)  
  26. {  
  27.   message m = Messages[MessageHead];  
  28.   if(++MessageHead>=QUEUELEN) MessageHead=0;  
  29.   return m ;  
  30. }  
  31. //判斷佇列是否空或者錯  
  32. bit     QueueEmptyOrError(void)  
  33. {  
  34.      return (MessageHead==MessageTail)?1:0;  
  35. }  
  36. void main(void)  
  37. {  
  38.   u8 RandTaskGene;  
  39.   while(1)  
  40.   {  
  41.    RandTaskGene = rand();  
  42.    RandTaskGene %=2;  
  43.    if(RandTaskGene)  
  44.    {  
  45.       PutMessage(MSG_TASK1_RUN);  
  46.    }  
  47.    else  
  48.    {  
  49.       PutMessage(MSG_TASK1_STOP);  
  50.    }  
  51.    RandTaskGene = rand();  
  52.    if(RandTaskGene>1000)  
  53.     {  
  54.       PutMessage(MSG_TASK2_RUN);  
  55.     }  
  56.    else  
  57.     {  
  58.       PutMessage(MSG_TASK2_STOP);  
  59.     }  
  60.     while(!QueueEmptyOrError())  
  61.         {  
  62.            switch (GetMessage())  
  63.                {  
  64.                  case MSG_TASK1_RUN:  
  65.                       //...  
  66.                       break;  
  67.                  case MSG_TASK1_STOP:  
  68.                       //...  
  69.                       break;  
  70.                  case MSG_TASK2_RUN:  
  71.                       //...  
  72.                       break;  
  73.                  case MSG_TASK2_RUN:  
  74.                       //...  
  75.                       break;        
  76.                }  
  77.         }  
  78.   }  
  79. }