任务间如何通讯呢?可以用消息队列来实现。为什么要用消息队列?

  消息被发送到队列中。“消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传它。

  下面是一个简单的实现,很容易看懂

/*用于对于的标记消息队列是否使用*/
uint8 MsgQueueFlag[MAX_QUEUE_NUMBER];
/*实际的所有消息队列*/
OS_Q MsgQueue[MAX_QUEUE_NUMBER];
/*
 * 创建消息队列
*/
OS_Q* OSQCreate()
{
 OS_CPU_SR  cpu_sr = 0;
 uint32  index;
 OS_ENTER_CRITICAL();
 for(index=0;index<MAX_QUEUE_NUMBER;index++)
 {
  /*该消息队列未被使用*/
  if (MsgQueueFlag[index]==0)
  {
   MsgQueueFlag[index]=1;
   /*该队列首尾初始化*/
   MsgQueue[index].front=NULL;
   MsgQueue[index].rear=NULL;
   OS_EXIT_CRITICAL();
   return &(MsgQueue[index]);
  }
 }
 
 OS_EXIT_CRITICAL();
 return (OS_Q*)NULL;
}
/*
*删除消息队列
*/
int8 OSQDelate(OS_Q* q)
{
 OS_CPU_SR  cpu_sr = 0;
 
 OS_ENTER_CRITICAL();
 /*信号量不存在*/
 if (q == NULL)
 {
  OS_EXIT_CRITICAL();
  return OS_Err;
 }
 /*队列指针越界*/
 if ((( q-MsgQueue ) < 0)||(( q-MsgQueue ) > (MAX_QUEUE_NUMBER-1)))
 {
  OS_EXIT_CRITICAL();
  return OS_Err;
 }
 
 /*将标记位置0*/
 MsgQueueFlag[q-MsgQueue] = (uint8)0;
 OS_EXIT_CRITICAL();
 return OS_OK;
}
/*
*发送一个消息
*该函数可用在中断函数中
*/
int8 OSQPost(OS_Q* q,OS_MSG msg)
{
    OS_CPU_SR  cpu_sr = 0;
 
   OS_ENTER_CRITICAL();
 if (q == NULL)
 {
       OS_EXIT_CRITICAL();
      return OS_Err;
 }
 if ((( q-MsgQueue ) < 0)||(( q-MsgQueue ) > (MAX_QUEUE_NUMBER-1)))
 {
      OS_EXIT_CRITICAL();
      return OS_Err;
 }
 if((q->rear+1)%MAX_MSG_NUMBER==q->front)
 {
      OS_EXIT_CRITICAL();
      return OS_Err;
 }
 else
 {
      q->msgQueue[q->rear]=msg;
      q->rear=(q->rear+1)%MAX_MSG_NUMBER;
      OS_EXIT_CRITICAL();
      return OS_OK;
 }
}