消息队列可以用来处理报警,异常等等方面对时序要求不高的任务。
#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;
}
}
}