微控制器應用訊息佇列
阿新 • • 發佈:2018-12-17
- #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;
- }
- }
- }
- }